Listado de combinaciones (Microsoft Excel)
Ron sabe que puede usar la función COMBINAR para determinar el número de combinaciones que se pueden hacer a partir de varios dígitos. Sin embargo, se pregunta si hay una manera de enumerar todas las combinaciones.
No hay una forma incorporada de enumerar combinaciones en Excel. Sin embargo, puede crear una macro para hacer la lista por usted. Si desea encontrar las combinaciones únicas en un conjunto de números secuenciales que comienzan en 1, entonces el siguiente conjunto de macros funcionará. Todo lo que necesita hacer es ejecutar la función TestCNR y terminará con una «matriz» de celdas que representan el número de combinaciones de 4 dígitos en el conjunto secuencial de valores que van del 1 al 10.
Sub TestCNR() Cnr 10, 4 End Sub
Sub Cnr(n, r) i = 1 For j = 1 To r Cells(i, j).Value = j Next Do Until Finished(n, r, i) j = FindFirstSmall(n, r, i) For k = 1 To j — 1 Cells(i + 1, k).Value = Cells(i, k).Value Next Cells(i + 1, j).Value = Cells(i, j).Value + 1 For k = j + 1 To r Cells(i + 1, k).Value = Cells(i + 1, k - 1).Value + 1 Next i = i + 1 Loop End Sub
Function Finished(n, r, i) Temp = True For j = r To 1 Step -1 If Cells(i, j).Value <> j + (n - r) Then Temp = False End If Next Finished = Temp End Function Function FindFirstSmall(n, r, i) j = r Do Until Cells(i, j).Value <> j + (n - r) j = j - 1 Loop FindFirstSmall = j End Function
La macro sobrescribe lo que esté en su hoja de trabajo, así que asegúrese de ejecutar la prueba mostrando una hoja de trabajo en blanco. Si desea cambiar el tamaño del conjunto o el número de elementos en el subconjunto, simplemente cambie los valores pasados en la rutina TestCNR.
Si desea extraer combinaciones únicas de una cadena de caracteres (por ejemplo, las letras del alfabeto), debe utilizar un conjunto diferente de macros. Lo siguiente funcionará bien; asume que los caracteres que desea usar como su «universo» están en la celda A1 y el número que desea en cada combinación única está en la celda A2.
Sub FindSets() Dim iA() As Integer Dim sUniv As String Dim iWanted As Integer Dim j As Integer Dim k As Integer sUniv = Cells(1, 1).Value iWanted = Cells(2, 1).Value ReDim iA(iWanted) For j = 1 To iWanted iA(j) = j Next j iRow = PutRow(iA, sUniv, 1) Do Until DoneYet(iA, Len(sUniv)) j = WorkHere(iA, Len(sUniv)) iA(j) = iA(j) + 1 For k = j + 1 To iWanted iA(k) = iA(k - 1) + 1 Next k iRow = PutRow(iA, sUniv, iRow) Loop End Sub
Function DoneYet(iB, n) As Boolean iMax = UBound(iB) Temp = True For j = iMax To 1 Step -1 If iB(j) <> j + (n - iMax) Then Temp = False End If Next DoneYet = Temp End Function
Function WorkHere(iB, n) As Integer iMax = UBound(iB) j = iMax Do Until iB(j) <> j + (n - iMax) j = j - 1 Loop WorkHere = j End Function
Function PutRow(iB, sUniv, i) iMax = UBound(iB) sTemp = "" For j = 1 To iMax sTemp = sTemp & Mid(sUniv, iB(j), 1) Next j Cells(i, 2).Value = sTemp PutRow = i + 1 End Function
Ejecute la macro FindSets y las diferentes combinaciones deseadas terminan en la columna 2. Sin embargo, tenga cuidado al ejecutar la macro. El número de combinaciones puede aumentar muy rápidamente.
_Nota: _
Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.
link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador]
.
ExcelTips es su fuente de formación rentable en Microsoft Excel.
Este consejo (11891) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365. Puede encontrar una versión de este consejo para la interfaz de menú anterior de Excel aquí:
link: / excel-Listing_Combinations [Combinaciones de listados]
.