Buscar en rango aquellas celdas que sumen valor dado
Encontré estas pregunta y respuesta aquí en el foro que son por un problema casi idéntico a uno que yo tengo. La respuesta que dio el experto es muy buena, pero funciona sólo identificando dos celdas que cumplen la restricción, y no sé cómo modificar la macro para que no exista restricción en la cantidad de celdas que cumplan la condición. Es decir, yo no requiero forzar el resultado a dos celdas únicamente.
Gracias
Jose A.
---
Tengo lo siguiente
A1 10
A2 20
A3 30
A4 40
A5 50
Quiero que sume 50 solo con dos celdas
Y después las marque en negro
Esta pregunte es un suesto pueden haber 1000 celdas y quiero que sume a 55874
usando 745 celdas como combinación es el alma de la pregunta
puede ser cualquier sumatoria y yo pongo las caledas como limite de combinación a esa sumatoria
y que después las marque en negro
mandame la respuesta a
[email protected]
SI QUIERES ME AAGREGAS ATU MSN POR FAVOR AYUDAME QUE ESO ME TIENE LOCO .
11/09/2009
Experto
Hola, Eladio!
Disculpa si no te respondí antes, pero si leíste mi perfil, habrás notado que no me es posible responder durante los fines de semana.
Así que recién hoy pude ver tu mensaje y, ya ves, tienes tu respuesta.
Para resolver este tipo de problemas debes recurrir a programación.
Efectivamente, un procedimiento de Visual Basic for Aplications (VBA) es capaz de efectuar y mostrar los resultados.
Para ello necesitas ingresar los números a combinar en un rango vertical donde todas sus celdas deberán tener un valor. Es decir, la macro considerará sólo las celdas que encuentre con datos en ese
rango.
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 combNnum()
'Modificar 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 una 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.Select
IniLista.CurrentRegion.ClearContents
'Inicia ciclo de combinaciones
For NumAct = 1 To UBound(ListNum)
For NumSig = NumAct + 1 To UBound(ListNum)
RES = ListNum(NumAct) + ListNum(NumSig)
OdoMet = OdoMet + 1 'Cuenta iteracciones
'If RES > 0 Then
If RES = Range(ResObjet).Value Then
'En caso de que produzca el resultado consignado en ResObjet, arma fórmula correspondiente
CuentaCasos = CuentaCasos + 1
FormOK = ""
FormOK = " + " & ListNum(NumAct) & " + " & ListNum(NumSig)
'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 NumSig
Next NumAct
'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 & " caso" & IIf(CuentaCasos > 1, "s", "")
MsgBox "Proceso terminado." & Chr(10) & "Encontrado: " & CuentaCasos & " combinaci" & IIf(CuentaCasos > 1, "ones", "ón") & 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
Set IniLista = Nothing
Set IniRango = Nothing
End Sub
Tal como solicitaste esta macro calculará y mostrará todas aquellas combinaciones de dos elementos que sumen el valor indicado en la celda de objetivo.
Notarás que no marca en negro esos pares, porque puede haber más de una combinación, en particular si son muchos números. Por ello me pareció má interesante que los liste en algún rango de la hoja.
Gracias
Jose A.
---
Tengo lo siguiente
A1 10
A2 20
A3 30
A4 40
A5 50
Quiero que sume 50 solo con dos celdas
Y después las marque en negro
Esta pregunte es un suesto pueden haber 1000 celdas y quiero que sume a 55874
usando 745 celdas como combinación es el alma de la pregunta
puede ser cualquier sumatoria y yo pongo las caledas como limite de combinación a esa sumatoria
y que después las marque en negro
mandame la respuesta a
[email protected]
SI QUIERES ME AAGREGAS ATU MSN POR FAVOR AYUDAME QUE ESO ME TIENE LOCO .
11/09/2009
Experto
Hola, Eladio!
Disculpa si no te respondí antes, pero si leíste mi perfil, habrás notado que no me es posible responder durante los fines de semana.
Así que recién hoy pude ver tu mensaje y, ya ves, tienes tu respuesta.
Para resolver este tipo de problemas debes recurrir a programación.
Efectivamente, un procedimiento de Visual Basic for Aplications (VBA) es capaz de efectuar y mostrar los resultados.
Para ello necesitas ingresar los números a combinar en un rango vertical donde todas sus celdas deberán tener un valor. Es decir, la macro considerará sólo las celdas que encuentre con datos en ese
rango.
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 combNnum()
'Modificar 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 una 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.Select
IniLista.CurrentRegion.ClearContents
'Inicia ciclo de combinaciones
For NumAct = 1 To UBound(ListNum)
For NumSig = NumAct + 1 To UBound(ListNum)
RES = ListNum(NumAct) + ListNum(NumSig)
OdoMet = OdoMet + 1 'Cuenta iteracciones
'If RES > 0 Then
If RES = Range(ResObjet).Value Then
'En caso de que produzca el resultado consignado en ResObjet, arma fórmula correspondiente
CuentaCasos = CuentaCasos + 1
FormOK = ""
FormOK = " + " & ListNum(NumAct) & " + " & ListNum(NumSig)
'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 NumSig
Next NumAct
'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 & " caso" & IIf(CuentaCasos > 1, "s", "")
MsgBox "Proceso terminado." & Chr(10) & "Encontrado: " & CuentaCasos & " combinaci" & IIf(CuentaCasos > 1, "ones", "ón") & 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
Set IniLista = Nothing
Set IniRango = Nothing
End Sub
Tal como solicitaste esta macro calculará y mostrará todas aquellas combinaciones de dos elementos que sumen el valor indicado en la celda de objetivo.
Notarás que no marca en negro esos pares, porque puede haber más de una combinación, en particular si son muchos números. Por ello me pareció má interesante que los liste en algún rango de la hoja.
2 Respuestas
Respuesta de Albert Soffici
2
Respuesta de Isaac Reyes
1