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 .
1 Respuesta
Respuesta de fejoal
1
1
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
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. Espero que esto te ayude. Un gran abrazo! Fernando