Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

COMBINACIONES DE SUMA DE VALORES PARA OBTENER UN VALOR DADO

377 views
Skip to first unread message

Danjon

unread,
May 12, 2009, 7:17:03 AM5/12/09
to
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.-

Gracias

Armando

unread,
May 12, 2009, 10:54:17 PM5/12/09
to

Hola, esta plantilla puede servirte, suerte:
http://www.geocities.com/excelmx/Facturacion.xls

H�ctor Miguel

unread,
May 13, 2009, 1:11:48 AM5/13/09
to
hola, 'anonimo/a' !

> 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


0 new messages