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.
- Abre Excel y ve a
Archivo > Opciones > Complementos. - Abajo del todo, en el cuadro
Administrar, eligeComplementos de Excely pulsaIr. - Marca la casilla
Solver Add-iny pulsaAceptar. Si no estaba instalado, Excel lo descargará.
[Complementos de Excel ▾] Ir…
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.
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.
- Pulsa Alt+F11 para abrir el editor de Visual Basic.
- En el menú
Herramientas, eligeReferencias(Tools > References, en inglés). - Baja por la lista hasta
Solvery márcala. PulsaAceptar.
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).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
- Abre el editor de Visual Basic con Alt+F11.
- En
Insertar > Módulo, crea un módulo nuevo. - 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
- Vuelve a Excel y rellena la hoja con estos datos:
| 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 |
- En B5 escribe
=B1*B2(ingresos), en B6=B1*B3(costes) y en B8=B5-B6(beneficio). - Coloca el cursor dentro de la macro y pulsa F5.
| A | B | |
|---|---|---|
| 1 | Unidades a vender | 5000 |
| 2 | Precio unitario | 7 |
| 3 | Coste unitario | 5 |
| 5 | Ingresos | 35000 |
| 6 | Costes | 25000 |
| 8 | Beneficio | 10000 |
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:=3indica que la celda debe igualarValueOf.ValueOf:=10000es 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:=Trueejecuta ySolverFinish KeepFinal:=1cierra el cuadro automáticamente guardando la solución.
.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"
| A | B | |
|---|---|---|
| 1 | Unidades a vender | 5000 |
| 2 | Precio unitario | 15 |
| 3 | Coste unitario | 5 |
| 5 | Ingresos | 75000 |
| 6 | Costes | 25000 |
| 8 | Beneficio | 50000 |
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
- MicrosoftSolverOk Function – Microsoft Learnconsultado el 22/10/2026
- MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 22/10/2026
- MicrosoftLAMBDA — documentación oficialconsultado el 22/10/2026
- MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 22/10/2026
- MicrosoftAtajos que funcionan igual en cualquier idioma — documentación oficialconsultado el 22/10/2026