CSV

Solver en Excel con VBA: cómo automatizar el complemento desde una macro

octubre 26, 2026 Tuto Excel 13 min read
Solver en Excel con VBA: cómo automatizar el complemento desde una macro

Solver es un complemento de Excel que sirve para resolver problemas de optimización: encontrar el valor de una celda (por ejemplo, el beneficio) cambiando otras celdas (unidades vendidas, precio, cantidad de cada ingrediente) y respetando unas condiciones (precios mínimos, cantidades enteras, presupuesto máximo). Cuando se hace a mano, se abre el cuadro Solver cada vez que cambian los datos. Con VBA se puede automatizar: una macro llama a Solver por ti, recalcula el modelo y deja la hoja lista sin tocar el ratón.

En este tutorial aprenderás a activar Solver, a cargar su referencia en el editor de Visual Basic y a escribir una macro que combine SolverOk, SolverAdd y SolverSolve para resolver un caso de beneficio por unidades vendidas y precio. Al terminar, podrás adaptar la macro a tu propio modelo (cambiando objetivo, sentido, celdas y restricciones) y sabrás arreglar los tres tropiezos más habituales.

Solver como complemento está en Excel para Microsoft 365, 2024, 2021, 2019, 2016 y 2013. La automatización con VBA solo funciona en Excel de escritorio para Windows y en Excel para Mac; en Excel para la web y en los móviles no se ejecutan macros.

Qué es Solver y por qué se usa desde VBA

Imagina una hoja con dos decisiones que tomar: cuántas unidades vender y a qué precio. El beneficio depende de esas dos cifras y de un coste unitario que ya conoces. Cambiar las cifras a ojo para ver qué pasa se vuelve tedioso cuando, además, el precio tiene que estar entre 7 y 15 y las unidades tienen que ser enteras. Solver hace ese trabajo: prueba combinaciones, respeta las condiciones que le pongas y se queda con la mejor.

Cuando los datos de la hoja cambian cada poco (un nuevo precio, un coste distinto, otra demanda), abrir el cuadro de Solver y volver a pulsar Resolver se repite muchas veces. Ahí es donde entra VBA: una macro llama a Solver por ti, le pasa la celda objetivo, el sentido de la búsqueda, las celdas que puede tocar y las restricciones, ejecuta y deja el resultado escrito. Si la macro vive en un libro .xlsm, basta con pulsar un botón (o cambiar una celda) para que el modelo se recalcule solo.

Solver lleva en Excel desde la versión 1990 como complemento opcional. El motor que usa por defecto (GRG nonlinear o Simplex LP) es el mismo tanto si se usa a mano como si se llama desde VBA; lo que cambia es quién aprieta el botón: el usuario o la macro.

Activar Solver y su referencia en el editor de VBA

Antes de escribir ni una línea hay que preparar dos cosas: que Excel reconozca el complemento Solver y que el editor de Visual Basic pueda llamar a sus funciones. Ambas se hacen una sola vez por equipo.

Activar el complemento Solver en Excel

Solver no viene cargado de serie: es un complemento que se activa a mano.

  1. Abre Excel y ve a Archivo > Opciones > Complementos.
  2. Abajo del todo, en el cuadro Administrar, elige Complementos de Excel y pulsa Ir.
  3. Marca la casilla Solver Add-in y pulsa Aceptar. Si no estaba instalado, Excel lo descargará.
ArchivoOpcionesComplementos

Al volver a la hoja, en la pestaña Datos, dentro del grupo Análisis, aparece ahora el botón Solver. Si tu Excel está en inglés, lo verás en Data > Analysis > Solver.

Comprueba: está en Datos > Análisis > Solver. Si no lo ves, repite el paso 3 y reinicia Excel.

Cargar la referencia a Solver en Visual Basic Editor

Que Solver esté activo en la hoja no basta: VBA necesita «verlo» para usar sus funciones.

  1. Pulsa Alt+F11 para abrir el editor de Visual Basic.
  2. En el menú Herramientas, elige Referencias (Tools > References, en inglés).
  3. Baja por la lista hasta Solver y márcala. Pulsa Aceptar.
HerramientasReferencias
Nota: si en la lista no aparece Solver, pulsa Examinar y abre el archivo Solver.xlam, que suele estar en C:\Archivos de programa\Microsoft Office\root\Office16\Library\SOLVER\ (o Office15, Office14 según la versión).
Comprueba: la referencia Solver queda marcada y se queda así entre sesiones. Si abres el libro en otro equipo, repite el paso 3 allí.

Las tres funciones VBA que necesitas: SolverOk, SolverAdd y SolverSolve

Solver expone unas cuantas funciones VBA (SolverAdd, SolverChange, SolverDelete, SolverFinish, SolverOk, SolverSolve, etc.). Para el 90% de los casos basta con tres: SolverOk define el problema, SolverAdd añade restricciones y SolverSolve lo lanza.

Función Qué hace Argumentos principales
SolverOk Fija la celda objetivo, el sentido, el valor buscado y las celdas que pueden cambiar SetCell, MaxMinVal, ValueOf, ByChange, Engine, EngineDesc
SolverAdd Añade una restricción a una celda o rango CellRef, Relation, FormulaText
SolverSolve Ejecuta Solver con el modelo cargado UserFinish

Las tres funciones van en inglés aunque Excel esté en español: Solver es un complemento y su interfaz VBA no se traduce. Los argumentos se separan con coma, igual que en cualquier código VBA, y los decimales se escriben con punto.

SolverOk: la celda objetivo, el sentido de la búsqueda y las celdas que cambian

SolverOk SetCell, MaxMinVal, ValueOf, ByChange, Engine, EngineDesc

Argumento Qué indica Valores
SetCell Celda objetivo (la que se optimiza) Referencia, p. ej. $B$8
MaxMinVal Sentido de la optimización 1 maximizar, 2 minimizar, 3 igual a ValueOf
ValueOf Valor objetivo cuando MaxMinVal=3 Número, p. ej. 10000
ByChange Celdas que Solver puede cambiar Rango, p. ej. $B$1:$B$2
Engine Motor de resolución 1 Simplex LP, 2 GRG nonlinear, 3 Evolutionary
EngineDesc Nombre del motor (opcional) Texto

SolverOk SetCell:="$B$8", MaxMinVal:=3, ValueOf:=10000, ByChange:="$B$1:$B$2"

SolverAdd: las restricciones que debe respetar la solución

SolverAdd CellRef, Relation, FormulaText

Argumento Qué indica
CellRef Celda o rango sobre el que se aplica la restricción
Relation Operador: 1 ≤, 2 =, 3 ≥, 4 entero, 5 binario, 6 todos distintos
FormulaText Valor con el que se compara (o palabra clave como integer, binary, alldifferent)

SolverAdd CellRef:="$B$2", Relation:=3, FormulaText:="7"
SolverAdd CellRef:="$B$2", Relation:=1, FormulaText:="15"
SolverAdd CellRef:="$B$1", Relation:=4, FormulaText:="integer"

SolverSolve: lanzar la resolución y guardar o descartar el resultado

SolverSolve UserFinish

UserFinish vale True si quieres que Solver cierre el cuadro de resultados y deje la solución directamente, y False si prefieres que muestre el cuadro para que el usuario elija entre Keep Solver Solution y Restore Original Values. Para automatizar al 100%, pasa True y luego llama a SolverFinish KeepFinal:=1; eso deja los nuevos valores en la hoja sin preguntar.

SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1

Una primera macro que resuelve un caso sencillo

Vamos a montar un modelo pequeño: una tienda que vende un único producto y quiere saber cuántas unidades vender y a qué precio para conseguir un beneficio de, al menos, 10.000. El coste unitario es 5, el precio tiene que estar entre 7 y 15, y las unidades vendidas tienen que ser enteras.

Escribir la macro paso a paso

  1. Abre el editor de Visual Basic con Alt+F11.
  2. En Insertar > Módulo, crea un módulo nuevo.
  3. Pega este código:

Sub CalcularBeneficio()
    ' 1. Definir el problema: B8 es la celda objetivo,
    '    queremos que B8 sea igual a 10000 (MaxMinVal=3),
    '    y Solver puede cambiar B1 (unidades) y B2 (precio).
    SolverOk SetCell:="$B$8", MaxMinVal:=3, ValueOf:=10000, ByChange:="$B$1:$B$2"
    
    ' 2. Restricciones:
    '    Precio B2 entre 7 y 15
    SolverAdd CellRef:="$B$2", Relation:=3, FormulaText:="7"
    SolverAdd CellRef:="$B$2", Relation:=1, FormulaText:="15"
    '    Unidades B1 enteras
    SolverAdd CellRef:="$B$1", Relation:=4, FormulaText:="integer"
    
    ' 3. Resolver sin mostrar el cuadro final
    SolverSolve UserFinish:=True
    SolverFinish KeepFinal:=1
End Sub
  1. Vuelve a Excel y rellena la hoja con estos datos:
B8fx0
A B
1 Unidades a vender 0
2 Precio unitario 0
3 Coste unitario 5
4
5 Ingresos 0
6 Costes 0
7
8 Beneficio 0
Modelo
  1. En B5 escribe =B1*B2 (ingresos), en B6 =B1*B3 (costes) y en B8 =B5-B6 (beneficio).
  2. Coloca el cursor dentro de la macro y pulsa F5.
B1fx5000
A B
1 Unidades a vender 5000
2 Precio unitario 7
3 Coste unitario 5
5 Ingresos 35000
6 Costes 25000
8 Beneficio 10000
Modelo
Comprueba: al ejecutar la macro, B1 pasa a 5000, B2 a 7 y B8 a 10000. Si el precio mínimo subiera a 10, Solver diría que no hay solución y la macro no tocaría las celdas.

Entender cada línea del código

Cada línea se corresponde con un campo del cuadro Solver Parameters:

  • SolverOk SetCell:="$B$8" apunta la celda objetivo a B8 (Beneficio).
  • MaxMinVal:=3 indica que la celda debe igualar ValueOf.
  • ValueOf:=10000 es el beneficio mínimo que queremos.
  • ByChange:="$B$1:$B$2" autoriza a Solver a tocar las unidades y el precio.
  • SolverAdd CellRef:="$B$2", Relation:=3, FormulaText:="7" dice «B2 ≥ 7».
  • SolverAdd CellRef:="$B$2", Relation:=1, FormulaText:="15" dice «B2 ≤ 15».
  • SolverAdd CellRef:="$B$1", Relation:=4, FormulaText:="integer" obliga a B1 a ser entero.
  • SolverSolve UserFinish:=True ejecuta y SolverFinish KeepFinal:=1 cierra el cuadro automáticamente guardando la solución.
Nota: los argumentos de Solver siempre van en inglés (SetCell, MaxMinVal, ByChange…) y separados por comas, aunque Excel esté en español. Es la misma regla que para .Formula en VBA.

Adaptar la macro a tu propio modelo: cambiar objetivo, restricciones y celdas

El ejemplo anterior buscaba un beneficio exacto. Ahora cambiamos el sentido: queremos maximizar el beneficio, el precio sigue entre 7 y 15, las unidades siguen siendo enteras y añadimos una restricción nueva: el coste unitario no puede pasar de 6.

Maximizar en lugar de alcanzar un valor

Para maximizar basta con poner MaxMinVal:=1 y dejar ValueOf:=0 (o cualquier número, que se ignora):

SolverOk SetCell:="$B$8", MaxMinVal:=1, ValueOf:=0, ByChange:="$B$1:$B$2"
B1fx5000
A B
1 Unidades a vender 5000
2 Precio unitario 15
3 Coste unitario 5
5 Ingresos 75000
6 Costes 25000
8 Beneficio 50000
Modelo
Comprueba: con MaxMinVal:=1 Solver sube el precio hasta 15 (el tope) y vende 5000 unidades, dando 50000 de beneficio. Si subes el coste unitario a 6, el beneficio baja a 45000.

Restricciones con varias celdas a la vez

Para añadir la restricción de coste unitario, una sola línea vale:

SolverAdd CellRef:="$B$3", Relation:=1, FormulaText:="6"

Si quieres que Solver toque a la vez unidades, precio y coste, amplía ByChange:

SolverOk SetCell:="$B$8", MaxMinVal:=1, ValueOf:=0, ByChange:="$B$1:$B$3"

Y para que las tres celdas estén dentro de un margen común (por ejemplo, que ninguna supere 10), añade:

SolverAdd CellRef:="$B$1:$B$3", Relation:=1, FormulaText:="10"

La macro final quedaría así:

Sub MaximizarBeneficio()
    SolverOk SetCell:="$B$8", MaxMinVal:=1, ValueOf:=0, ByChange:="$B$1:$B$3"
    SolverAdd CellRef:="$B$2", Relation:=3, FormulaText:="7"
    SolverAdd CellRef:="$B$2", Relation:=1, FormulaText:="15"
    SolverAdd CellRef:="$B$3", Relation:=1, FormulaText:="6"
    SolverAdd CellRef:="$B$1", Relation:=4, FormulaText:="integer"
    SolverSolve UserFinish:=True
    SolverFinish KeepFinal:=1
End Sub

Por qué Solver no resuelve y la macro se queda a medias

Cuatro tropiezos concentran la mayoría de errores al usar Solver desde VBA. Todos tienen arreglo sin tocar la lógica del modelo.

"Error en tiempo de ejecución 1004" al llamar a SolverOk

Lo que se ve: VBA marca la línea de SolverOk y muestra el error Error en tiempo de ejecución '1004': error definido por la aplicación o por el objeto. Causa: la referencia Solver no está marcada en Herramientas > Referencias, o has escrito algún argumento en español (MaxMinVal mal escrito, ValorObjetivo en vez de ValueOf). Arreglo: abre el editor, marca Solver en Referencias, revisa que los argumentos sean los nombres ingleses y vuelve a ejecutar.

Solver devuelve "No se encontró una solución factible"

Lo que se ve: la macro termina sin tocar la hoja y, si abres Solver manualmente, aparece Solver could not find a feasible solution. Causa: las restricciones son incompatibles (precio mínimo mayor que precio máximo, unidades mayores que una demanda que has limitado, presupuesto negativo). Arreglo: repasa las restricciones y mira el orden: una B2 ≥ 15 con B2 ≤ 10 no tiene solución. Una B1 ≥ 1 y B1 ≤ 0 tampoco. Quita las que sobran o amplía los rangos.

El botón Solver no aparece en la cinta Datos

Lo que se ve: la pestaña Datos no tiene el grupo Análisis, o el botón Solver no está. Causa: el complemento no se activó. Arreglo: vuelve a Archivo > Opciones > Complementos > Ir, marca Solver Add-in y reinicia Excel si te lo pide. Después repite los pasos para añadir la referencia en el editor VBA.

SolverSolve no muestra el cuadro de resultados y la macro parece no hacer nada

Lo que se ve: la macro termina, no aparece ningún cuadro y la hoja no cambia. Causa: pasaste UserFinish:=True pero no añadiste SolverFinish KeepFinal:=1, o bien hay un error silencioso por la configuración regional. Arreglo: o bien quitas UserFinish:=True para que Solver pregunte, o bien añades la línea SolverFinish KeepFinal:=1 justo después de SolverSolve. Para una macro que no debe fallar, envuelve las llamadas en On Error GoTo y muestra un mensaje con MsgBox para enterarte de qué falló.

Lo que ya sabes hacer con Solver en VBA y el siguiente paso

  • Activas el complemento Solver y la referencia en el editor de Visual Basic.
  • Escribes una macro con SolverOk, SolverAdd y SolverSolve que resuelve un modelo de beneficio.
  • Adaptas la macro a tu propio modelo cambiando objetivo, sentido, celdas que cambian y restricciones.
  • Detectas y arreglas los errores más habituales: referencia no marcada, argumentos mal escritos y restricciones incompatibles.

El siguiente paso natural es guardar el libro como .xlsm para que las macros no se pierdan, crear un botón en la hoja (Insertar > Formas) y asignarle la macro. Cuando lo tengas, cada cambio en los datos se resolverá con un solo clic.

Dudas al usar Solver desde VBA en Excel

1. ¿En qué versiones de Excel está Solver como complemento y por VBA?

Solver viene como complemento en Excel para Microsoft 365, 2024, 2021, 2019, 2016 y 2013. En todas ellas puedes automatizarlo con VBA llamando a SolverOk, SolverAdd y SolverSolve, siempre que marques la referencia Solver en el editor de Visual Basic. En Excel para la web y en Excel para móviles no se pueden ejecutar macros VBA.

2. ¿Qué significa MaxMinVal en Solver VBA y qué valores acepta?

MaxMinVal es el segundo argumento de SolverOk y dice el sentido de la búsqueda. Vale 1 para maximizar la celda objetivo, 2 para minimizarla y 3 para que la celda alcance un valor concreto, que entonces se pasa en ValueOf. Si usas 1 o 2, el argumento ValueOf se ignora.

3. ¿Cómo se ponen las restricciones (constraints) en Solver con VBA?

Las restricciones se añaden con SolverAdd CellRef, Relation, FormulaText. CellRef es la celda o el rango que se restringe, FormulaText es el valor con el que se compara, y Relation es un número del 1 al 6: 1 menor o igual, 2 igual, 3 mayor o igual, 4 entero, 5 binario (entre 0 y 1) y 6 todos distintos.

4. ¿Solver de Excel tiene un motor distinto para problemas no lineales?

Sí. Solver ofrece varios motores y en VBA se eligen con los argumentos Engine y EngineDesc de SolverOk. El método Evolutionary, indicado para problemas no lineales o con funciones irregulares, se pide con Engine:=3. Si lo omites, Solver usa el motor Simplex LP o GRG nonlinear según el modelo.

5. ¿Se puede ejecutar Solver desde VBA sin que salga el cuadro de resultados?

Sí. SolverSolve lleva el argumento UserFinish. Si pasas UserFinish:=True y luego llamas a SolverFinish KeepFinal:=1, Solver cierra el cuadro de resultados por sí solo y deja los valores de la solución en la hoja sin preguntar.

6. ¿Cómo automatizo Solver en Excel para que recalcule solo?

Escribe una macro con SolverOk, SolverAdd y SolverSolve, guárdala en un libro .xlsm y asigna esa macro a un botón en la hoja o a un evento como Worksheet_Change. Al pulsar el botón o al cambiar una celda, Excel ejecuta Solver y actualiza el modelo sin pasos manuales.

7. ¿Solver de Excel sirve para optimizar con dos variables?

Sí, y de hecho es su caso más sencillo. Con SolverOk apunta ByChange a un rango de dos celdas (por ejemplo B1:B2) y añade con SolverAdd las restricciones de cada variable. Solver ajustará las dos a la vez para maximizar, minimizar o alcanzar el valor pedido en la celda objetivo.

8. ¿Cómo resuelvo un modelo no lineal en Excel con Solver?

Activa el motor adecuado en SolverOk con Engine:=3 (Evolutionary), pensado para problemas no lineales y con óptimos locales. Ajusta los parámetros con SolverOptions si lo necesitas y lanza SolverSolve. Si el modelo es suave y derivable, el motor GRG nonlinear (Engine:=2) también funciona bien.

Fuentes

  1. MicrosoftSolverOk Function – Microsoft Learnconsultado el 22/10/2026
  2. MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 22/10/2026
  3. MicrosoftLAMBDA — documentación oficialconsultado el 22/10/2026
  4. MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 22/10/2026
  5. MicrosoftAtajos que funcionan igual en cualquier idioma — documentación oficialconsultado el 22/10/2026