Combinazioni di elenchi (Microsoft Excel)
Ron sa che può usare la funzione COMBINAZIONE per determinare il numero di combinazioni che possono essere fatte da un numero di cifre. Si sta chiedendo, tuttavia, se esiste un modo per elencare tutte le combinazioni stesse.
Non esiste un modo integrato per elencare le combinazioni in Excel. Tuttavia, puoi creare una macro per eseguire l’elenco per te. Se vuoi trovare le combinazioni univoche in un insieme di numeri sequenziali che iniziano da 1, il seguente insieme di macro farà il trucco. Tutto quello che devi fare è eseguire la funzione TestCNR e ti ritroverai con una “matrice” di celle che rappresentano il numero di combinazioni di 4 cifre nel set sequenziale di valori che vanno da 1 a 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 sovrascrive tutto ciò che è nel foglio di lavoro, quindi assicurati di eseguire il test con un foglio di lavoro vuoto visualizzato. Se vuoi cambiare la dimensione del set o il numero di elementi nel sottoinsieme, cambia semplicemente i valori passati nella routine TestCNR.
Se desideri estrarre combinazioni univoche da una stringa di caratteri (ad esempio, le lettere dell’alfabeto), devi utilizzare un insieme diverso di macro. Quanto segue funzionerà bene; si presume che i caratteri che si desidera utilizzare come “universo” si trovino nella cella A1 e che il numero desiderato in ciascuna combinazione univoca sia nella cella 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
Eseguire la macro FindSets e le diverse combinazioni desiderate finiscono nella colonna 2. Prestare attenzione quando si esegue la macro, tuttavia. Il numero di combinazioni può diventare molto grande molto rapidamente. Ad esempio, se inserisci 26 lettere (dalla A alla Z) nella cella A1 e il valore 5 nella cella A2, la macro si bloccherà. Perché? Perché ci sono 65.780 possibili combinazioni di cinque caratteri e solo 65.536 righe in cui inserirle.
_Nota: _
Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.
ExcelTips è la tua fonte di formazione economica su Microsoft Excel.
Questo suggerimento (6766) si applica a Microsoft Excel 97, 2000, 2002 e 2003. Puoi trovare una versione di questo suggerimento per l’interfaccia a nastro di Excel (Excel 2007 e versioni successive) qui: