Solver, como asignar el valor de la celda objetivo con VBA

09/12/2005 - 14:50 por Gabriel Raigosa | Informe spam
Saludos:

Tengo la siguiente dificultad, el solver es un complemento del Excel,
(Herramientas, Solver), hay una opción en el solver que es asignar el valor
de la celda objetivo,

Máximo, Mínimo, Valores de , hay una casilla donde se asigna el valor, el
usuario lo digita.

Necesito que ese valor dependa de alguna celda de la hoja de calculo, es
decir que si en la celda A1 del Excel tengo un valor "x", quiero asignar ese
valor a esa casilla de asignación del solver, no tener que digitarlo.

De antemano gracias a quien o quienes me puedan ayudar.

Gabriel Raigosa

GabrielRaigosa@hot.mail.com
 

Leer las respuestas

#1 Héctor Miguel
09/12/2005 - 20:16 | Informe spam
hola, Gabriel !

... un complemento del Excel, (Herramientas, Solver), hay... opcion
... asignar el valor de la celda objetivo, Máximo, Mínimo, Valores de... el usuario lo digita.
... que ese valor dependa de alguna celda de la hoja de calculo
... si en la celda A1 del Excel tengo un valor "x", quiero asignar ese valor a esa casilla... del solver, no tener que digitarlo.



tendiras que usar el solver por codigo, para lo cual... te paso al final algunos 'apuntes', enlaces y datos +/- 'relevantes'
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

1) deberas tomar en cuenta las siguientes 'observaciones':
- para 'poder' usar el solver [por codigo], es necesario...
-> establecer una referencia [en el proyecto de macros] a la libreria 'solver.xla' [NO solver.dll]
-> buscando la ubicacion 'apropiada' con [menu] [herramientas / referencias <-
[la cual, pudiera variar segun la version -ingles/español- del sistema operativo]
- hay 'ligeros' cambios entre excel '97/2000 y excel xp/2003 ...
las 'llamadas' [por codigo] a las funciones del solver [como SolverOK, SolverAdd, etc.]
en xp/2003 'pasan' [reducidas] a: SolvOK, SolvAdd, etc. les 'sobra' el 'sufijo' ->[solv]ER<-
- [probablemente] la primera vez que lo ejecutes mandara un mensaje de error:
->error inesperado o memoria agotada<- :((
para 'resolverlo' [y SOLO por unica vez] 'tendras que' usar la siguiente instruccion...
->Application.Run "Solver.xla!Auto_Open"<-
- tomar en cuenta IDIOMAS p.e. para 'FormulaText:=' en castellano 'binario' debe cambiarse por 'binary'
- tomar precauciones si se va a correr en hojas 'protegidas' <= OJO

2) podrias empezar por descargar los siguientes ejemplos:
http://www.xl-logic.com/xl_files/fo...linear.zip
http://www.xl-logic.com/xl_files/fo...solver.zip
tambien tutoriales y [mas] ejemplos [luego de suscribirte a]
http://www.solver.com/suppxlsguide.htm

3) un ejemplo de una consulta especifica de hace tiempo [pego junto con la consulta] ;)
consulta ==> ... lista de valores ... encontrar las que sumadas dan un resultado concreto.
... ejemplo ... quisiera filtrarlas para conseguir ... las celdas que sumadas dan 45.
A B
1 10
2 20
3 25
4 30
... con solver y buscar objetivo y no lo he conseguido.
No se trata de cambiar el valor de las celdas, sino de seleccionar aquellas con las que se consiga el resultado [...]


propuesta ==con los siguientes 'supuestos' y usando solver [por codigo] se puede [+/-] 'conseguir' lo que necesitas:
nota: [te sugiero] usar nombres [ya sea 'estaticos' o 'dinamicos'] para no 'estar cambiando' sus 'referencias' en el codigo.
1.- al rango de los valores [col 'a'] asignale un nombre [p.e. 'Valores']
2.- a un rango 'igual' [adyacente y vacio -de momento-] asignale otro nombre [p.e. 'Filtro']
en estas celdas, el solver 'pondra' 1's / 0's [unos o ceros] para lograr la 'combinacion' que 'arroje' la suma buscada
3.- en una celda 'pon' la suma que se desea 'conseguir' y asignale otro nombre [p.e. 'Objetivo']
4.- usa otra celda 'para' el resultado y asignale otro nombre [p.e. 'Resultado']
la formula en esta celda [Resultado] seria => =SumaProducto(Valores,Filtro)
5.- IMPORTANTE => 'marcar' una referencia en el proyecto [vba] a la libreria del solver [solver.xla]
6.- puedes 'aplicar' autofiltro a la columna del rango 'Filtro' o ...
usar formato condicional para 'identificar' la/s fila/s cuyo 'valor' [en 'su celda' del rango 'Filtro'] sea 1 [uno]
7.- puedes 'asignar' la macro a algun boton, o en el evento '_Change' de la celda 'Objetivo' [en el modulo de 'su' hoja]
y/o ['lanzarla' al] mostrar un formulario 'de espera' en el evento '_Activate' del formulario [por si 'le toma su tiempo'] etc.

en un modulo de codigo 'normal' ==Sub Localizar_Suma()
Application.ScreenUpdating = False
SolverReset
SolverOk SetCell:="" & [Resultado].Address & "", _
MaxMinVal:=3, _
ValueOf:="" & [Objetivo] & "", _
ByChange:="" & [Filtro].Address & ""
SolverAdd CellRef:="" & [Filtro].Address & "", _
Relation:=5, _
FormulaText:="Binario"
SolverOptions Precision:=0.0000001, _
Convergence:=0.001
SolverOk SetCell:="" & [Resultado].Address & "", _
MaxMinVal:=3, _
ValueOf:="" & [Objetivo] & "", _
ByChange:="" & [Filtro].Address & ""
SolverSolve UserFinish:=True
End Sub

Preguntas similares