Gracias
Hola, esta plantilla puede servirte, suerte:
http://www.geocities.com/excelmx/Facturacion.xls
> necesito dado un valor a pagar y una lista de valores (Cheques)
> cual es la combinacion mas exacta de esa lista para pagar el valor dado.-
lee lo siguiente (pero) "completito" y con el debido "detenimiento"
si tienes varios importes "iguales", podrias 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... o requieres el envio de un archivo con el ejemplo... 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/espanol- 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 ejemplos (luego de suscribirte en):
http://www.xl-logic.com/xl_files/formulas/solve_linear.zip
http://www.xl-logic.com/xl_files/formulas/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 propuesta)
=== 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 1s / 0s (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