Excel: combinar diferentes números para obtener un número determinado

Tengo 15 números.
Como puedo con excel hallar la combinación de estos, usando todos o algunos de ellos para que me sumados me den un numero determinado
EJEM: 2,3,4,5,6,7,8,9
¿Cómo puedo combinarlos de manera que sumen 10
de cuantas formas y cuales serian estas?

2 Respuestas

Respuesta
1
Una neurona peregrina y de órbita hiperbólica colisionó con la que tengo en funcionamiento y produjo una macro que resuelve tu desafío...
Hola, Félix José!
Sé que ha pasado bastante tiempo y, tal vez, ya no la necesites, pero me pareció que debía darte esta respuesta.
Como decía, un procedimiento de Visual Basic for Aplications (VBA) es capaz de efectuar y mostrar los resultados.
Para ello necesitas ingresar los 15 números a combinar en un rango vertical donde todas sus quince celdas deberán tener un valor.
En otra celda, colocarás el valor objetivo a evaluar.
Deja un rango (de dos columnas) libre para que la macro muestre allí las combinaciones posibles.
En la macro que sigue a continuación, deberás indicar las direcciones de los rangos mencionados.
Para que funcione, activa el editor de Visual Basic (presiona Alt+F11), inserta un nuevo módulo ("Insertar", "Módulo") y pega el siguiente código:
Sub Comb15Nros()
' referencias en hoja:
IniRango = "B2" 'Inicio de lista de numeros
ResObjet = "B20" 'Celda con resultado a buscar
Inilista = "F2" 'Inicio de lista de resultados posibles
'----------------------------
Dim FormOK As String
Set Inilista = Range(Inilista)
CuentaCasos = 0
'carga de valores a matriz
Dim ListNum() As Variant
ReDim Preserve ListNum(0)
ListNum(0) = 0
Nro = 1
Set IniRango = Range(IniRango)
IniRango.Select
Do While Not IsEmpty(ActiveCell)
ReDim Preserve ListNum(Nro)
ListNum(Nro) = ActiveCell.Value
Nro = Nro + 1
ActiveCell.Offset(1).Select
Loop
Inilista.CurrentRegion.ClearContents
'Inicia ciclo de combinaciones
For v01 = 0 To 1
For v02 = 0 To 1
For v03 = 0 To 1
For v04 = 0 To 1
For v05 = 0 To 1
For v06 = 0 To 1
For v07 = 0 To 1
For v08 = 0 To 1
For v09 = 0 To 1
For v10 = 0 To 1
For v11 = 0 To 1
For v12 = 0 To 1
For v13 = 0 To 1
For v14 = 0 To 1
For v15 = 0 To 1
RES = ListNum(1) * v01 + ListNum(2) * v02 + ListNum(3) * v03 + ListNum(4) * v04 + ListNum(5) * v05 + ListNum(6) * v06 + ListNum(7) * v07 + ListNum(8) * v08 + ListNum(9) * v09 + ListNum(10) * v10 + ListNum(11) * v11 + ListNum(12) * v12 + ListNum(13) * v13 + ListNum(14) * v14 + ListNum(15) * v15
If RES = Range(ResObjet).Value Then
'En caso de que produzca el resultado consignado en ResObjet, arma fórmula correspondiente
CuentaCasos = CuentaCasos + 1
FormOK = ""
If v01 * ListNum(1) <> 0 Then FormOK = FormOK & " + " & ListNum(1)
If v02 * ListNum(2) <> 0 Then FormOK = FormOK & " + " & ListNum(2)
If v03 * ListNum(3) <> 0 Then FormOK = FormOK & " + " & ListNum(3)
If v04 * ListNum(4) <> 0 Then FormOK = FormOK & " + " & ListNum(4)
If v05 * ListNum(5) <> 0 Then FormOK = FormOK & " + " & ListNum(5)
If v06 * ListNum(6) <> 0 Then FormOK = FormOK & " + " & ListNum(6)
If v07 * ListNum(7) <> 0 Then FormOK = FormOK & " + " & ListNum(7)
If v08 * ListNum(8) <> 0 Then FormOK = FormOK & " + " & ListNum(8)
If v09 * ListNum(9) <> 0 Then FormOK = FormOK & " + " & ListNum(9)
If v10 * ListNum(10) <> 0 Then FormOK = FormOK & " + " & ListNum(10)
If v11 * ListNum(11) <> 0 Then FormOK = FormOK & " + " & ListNum(11)
If v12 * ListNum(12) <> 0 Then FormOK = FormOK & " + " & ListNum(12)
If v13 * ListNum(13) <> 0 Then FormOK = FormOK & " + " & ListNum(13)
If v14 * ListNum(14) <> 0 Then FormOK = FormOK & " + " & List
Estas son las líneas que faltan:
If v15 * ListNum(15) <> 0 Then FormOK = FormOK & " + " & ListNum(15)
'Selección de celda donde colocar el resultado
If IsEmpty(Inilista) Then
vRow = Inilista.Row
ElseIf Inilista.End(xlDown).Row > 50000 Then
vRow = Inilista.Offset(1).Row
Else
vRow = Inilista.End(xlDown).Offset(1).Row
End If
Inilista.Cells(vRow - 1).Value = Trim(FormOK)
Inilista.Cells(vRow - 1, 2).FormulaLocal = "=" & Trim(FormOK)
End If
Next v15
Next v14
Next v13
Next v12
Next v11
Next v10
Next v09
Next v08
Next v07
Next v06
Next v05
Next v04
Next v03
Next v02
Next v01
'muestra Cantidad de casos encontrados
If CuentaCasos <> 0 Then
If IsEmpty(Inilista) Then
vRow = Inilista.Row
ElseIf Inilista.End(xlDown).Row > 50000 Then
vRow = Inilista.Offset(1).Row
Else
vRow = Inilista.End(xlDown).Offset(1).Row
End If
Inilista.Cells(vRow - 1).Value = CuentaCasos & " casos"
MsgBox "Proceso terminado." & Chr(10) & "Encontradas " & CuentaCasos & " combinaciones", vbInformation, "RESULTADO:"
Else
MsgBox "No se encontró combinación para el resultado dado (" & Range(ResObjet).Value & ")", vbCritical, "SIN SOLUCION"
End If
End Sub
Parece que ni este sitio se banco la respuesta. No sé pro qué quitó la mitad de la misma.
En fin...
Decía que al principio de la macro encontrarás tres variables donde deberás colocar ls direcciones de los rangos involucrados en el proceso.
Una vez modificadas, si fueran otras, cierra el editor de VBA y graba el archivo.
Luego, simplemente, ejecuta la macro Comb15Nros en la hoja donde están los números.
Ojala que aún te sirva y espero, particularmente interesado, tus comentarios sobre el desarrollo.
Un abrazo!
Fernando
Sub Comb15Nros()
' referencias en hoja:
IniRango = "B2" 'Inicio de lista de numeros
ResObjet = "B20" 'Celda con resultado a buscar
Inilista = "F2" 'Inicio de lista de resultados posibles
'----------------------------
Dim FormOK As String
Set Inilista = Range(Inilista)
CuentaCasos = 0
'carga de valores a matriz
Dim ListNum() As Variant
ReDim Preserve ListNum(0)
ListNum(0) = 0
Nro = 1
Set IniRango = Range(IniRango)
IniRango.Select
Do While Not IsEmpty(ActiveCell)
ReDim Preserve ListNum(Nro)
ListNum(Nro) = ActiveCell.Value
Nro = Nro + 1
ActiveCell.Offset(1).Select
Loop
Inilista.CurrentRegion.ClearContents
'Inicia ciclo de combinaciones
For v01 = 0 To 1
For v02 = 0 To 1
For v03 = 0 To 1
For v04 = 0 To 1
For v05 = 0 To 1
For v06 = 0 To 1
For v07 = 0 To 1
For v08 = 0 To 1
For v09 = 0 To 1
For v10 = 0 To 1
For v11 = 0 To 1
For v12 = 0 To 1
For v13 = 0 To 1
For v14 = 0 To 1
For v15 = 0 To 1
RES = ListNum(1) * v01 + ListNum(2) * v02 + ListNum(3) * v03 + ListNum(4) * v04 + ListNum(5) * v05 + ListNum(6) * v06 + ListNum(7) * v07 + ListNum(8) * v08 + ListNum(9) * v09 + ListNum(10) * v10 + ListNum(11) * v11 + ListNum(12) * v12 + ListNum(13) * v13 + ListNum(14) * v14 + ListNum(15) * v15
If RES = Range(ResObjet).Value Then
'En caso de que produzca el resultado consignado en ResObjet, arma fórmula correspondiente
CuentaCasos = CuentaCasos + 1
FormOK = ""
If v01 * ListNum(1) <> 0 Then FormOK = FormOK & " + " & ListNum(1)
If v02 * ListNum(2) <> 0 Then FormOK = FormOK & " + " & ListNum(2)
If v03 * ListNum(3) <> 0 Then FormOK = FormOK & " + " & ListNum(3)
If v04 * ListNum(4) <> 0 Then FormOK = FormOK & " + " & ListNum(4)
If v05 * ListNum(5) <> 0 Then FormOK = FormOK & " + " & ListNum(5)
If v06 * ListNum(6) <> 0 Then FormOK = FormOK & " + " & ListNum(6)
If v07 * ListNum(7) <> 0 Then FormOK = FormOK & " + " & ListNum(7)
If v08 * ListNum(8) <> 0 Then FormOK = FormOK & " + " & ListNum(8)
If v09 * ListNum(9) <> 0 Then FormOK = FormOK & " + " & ListNum(9)
If v10 * ListNum(10) <> 0 Then FormOK = FormOK & " + " & ListNum(10)
If v11 * ListNum(11) <> 0 Then FormOK = FormOK & " + " & ListNum(11)
If v12 * ListNum(12) <> 0 Then FormOK = FormOK & " + " & ListNum(12)
If v13 * ListNum(13) <> 0 Then FormOK = FormOK & " + " & ListNum(13)
If v14 * ListNum(14) <> 0 Then FormOK = FormOK & " + " & ListNum(14)
If v15 * ListNum(15) <> 0 Then FormOK = FormOK & " + " & ListNum(15)
'Selección de celda donde colocar el resultado
If IsEmpty(Inilista) Then
vRow = Inilista.Row
ElseIf Inilista.End(xlDown).Row > 50000 Then
vRow = Inilista.Offset(1).Row
Else
vRow = Inilista.End(xlDown).Offset(1).Row
End If
Inilista.Cells(vRow - 1).Value = Trim(FormOK)
Inilista.Cells(vRow - 1, 2).FormulaLocal = "=" & Trim(FormOK)
End If
Next v15
Next v14
Next v13
Next v12
Next v11
Next v10
Next v09
Next v08
Next v07
Next v06
Next v05
Next v04
Next v03
Next v02
Next v01
'muestra Cantidad de casos encontrados
If CuentaCasos <> 0 Then
If IsEmpty(Inilista) Then
vRow = Inilista.Row
ElseIf Inilista.End(xlDown).Row > 50000 Then
vRow = Inilista.Offset(1).Row
Else
vRow = Inilista.End(xlDown).Offset(1).Row
End If
Inilista.Cells(vRow - 1).Value = CuentaCasos & " casos"
MsgBox "Proceso terminado." & Chr(10) & "Encontradas " & CuentaCasos & " combinaciones", vbInformation, "RESULTADO:"
Else
MsgBox "No se encontró combinación para el resultado dado (" & Range(ResObjet).Value & ")", vbCritical, "SIN SOLUCION"
End If
End Sub
Si bien el algoritmo de cálculo es correcto, detecté un problema cuando se cambia la celda de destino.
El siguiente código, resuelve ese conflicto. Usa este en lugar del anterior:
Sub comb15Num()
' referencias en hoja:
IniRango = "D4" 'Inicio de lista de numeros
ResObjet = "D23" 'Celda con resultado a buscar
Inilista = "N4" 'Inicio de lista de resultados posibles
'----------------------------
Dim FormOK As String
Set Inilista = Range(Inilista)
vCol = Inilista.Column
CuentaCasos = 0
'carga de valores a matriz
Dim ListNum() As Variant
ReDim Preserve ListNum(0)
ListNum(0) = 0
Nro = 1
Set IniRango = Range(IniRango)
IniRango.Select
Do While Not IsEmpty(ActiveCell)
ReDim Preserve ListNum(Nro)
ListNum(Nro) = ActiveCell.Value
Nro = Nro + 1
ActiveCell.Offset(1).Select
Loop
Inilista.CurrentRegion.ClearContents
'Inicia ciclo de combinaciones
For v01 = 0 To 1
For v02 = 0 To 1
For v03 = 0 To 1
For v04 = 0 To 1
For v05 = 0 To 1
For v06 = 0 To 1
For v07 = 0 To 1
For v08 = 0 To 1
For v09 = 0 To 1
For v10 = 0 To 1
For v11 = 0 To 1
For v12 = 0 To 1
For v13 = 0 To 1
For v14 = 0 To 1
For v15 = 0 To 1
RES = ListNum(1) * v01 + ListNum(2) * v02 + ListNum(3) * v03 + ListNum(4) * v04 + ListNum(5) * v05 + ListNum(6) * v06 + ListNum(7) * v07 + ListNum(8) * v08 + ListNum(9) * v09 + ListNum(10) * v10 + ListNum(11) * v11 + ListNum(12) * v12 + ListNum(13) * v13 + ListNum(14) * v14 + ListNum(15) * v15
odomet = odomet + 1
If RES = Range(ResObjet).Value Then
'En caso de que produzca el resultado consignado en ResObjet, arma fórmula correspondiente
CuentaCasos = CuentaCasos + 1
FormOK = ""
If v01 * ListNum(1) <> 0 Then FormOK = FormOK & " + " & ListNum(1)
If v02 * ListNum(2) <> 0 Then FormOK = FormOK & " + " & ListNum(2)
If v03 * ListNum(3) <> 0 Then FormOK = FormOK & " + " & ListNum(3)
If v04 * ListNum(4) <> 0 Then FormOK = FormOK & " + " & ListNum(4)
If v05 * ListNum(5) <> 0 Then FormOK = FormOK & " + " & ListNum(5)
If v06 * ListNum(6) <> 0 Then FormOK = FormOK & " + " & ListNum(6)
If v07 * ListNum(7) <> 0 Then FormOK = FormOK & " + " & ListNum(7)
If v08 * ListNum(8) <> 0 Then FormOK = FormOK & " + " & ListNum(8)
If v09 * ListNum(9) <> 0 Then FormOK = FormOK & " + " & ListNum(9)
If v10 * ListNum(10) <> 0 Then FormOK = FormOK & " + " & ListNum(10)
If v11 * ListNum(11) <> 0 Then FormOK = FormOK & " + " & ListNum(11)
If v12 * ListNum(12) <> 0 Then FormOK = FormOK & " + " & ListNum(12)
If v13 * ListNum(13) <> 0 Then FormOK = FormOK & " + " & ListNum(13)
If v14 * ListNum(14) <> 0 Then FormOK = FormOK & " + " & ListNum(14)
If v15 * ListNum(15) <> 0 Then FormOK = FormOK & " + " & ListNum(15)
'Selección de celda donde colocar el resultado
If IsEmpty(Inilista) Then
vRow = Inilista.Row
ElseIf Inilista.End(xlDown).Row > 50000 Then
vRow = Inilista.Offset(1).Row
Else
vRow = Inilista.End(xlDown).Offset(1).Row
End If
Cells(vRow, vCol).Value = Trim(FormOK)
Cells(vRow, vCol + 1).FormulaLocal = "=" & Trim(FormOK)
End If
Next v15
Next v14
Next v13
Next v12
Next v11
Next v10
Next v09
Next v08
Next v07
Next v06
Next v05
Next v04
Next v03
Next v02
Next v01
'muestra Cantidad de casos encontrados
If CuentaCasos <> 0 Then
If IsEmpty(Inilista) Then
vRow = Inilista.Row
ElseIf Inilista.End(xlDown).Row > 50000 Then
vRow = Inilista.Offset(1).Row
Else
vRow = Inilista.End(xlDown).Offset(1).Row
End If
Cells(vRow, vCol).Value = CuentaCasos & " casos"
MsgBox "Proceso terminado." & Chr(10) & "Encontradas " & CuentaCasos & " combinaciones" & Chr(10) & "Iteracciones: " & odomet, vbInformation, "RESULTADO:"
Else
MsgBox "No se encontró combinación para el resultado dado (" & Range(ResObjet).Value & ")", vbCritical, "SIN SOLUCION"
End If
End Sub
Fantástico, otros expertos me habían mandado al desvío, pero tu fórmula me da el camino para ver la respuesta a un calculo que necesito
Lastima que solo hay 5 estrellas
Respuesta
No se muy bien pero hay una herramienta que se llama "buscar objetivo", trata de ver si eso te ayuda.
Suerte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas