Profi-Frage: Alle Kombinationen in Excel anzeigen lassen?
Hallo,
ich habe ein Problem, dass ich nicht gelöst bekomme:
Ich habe eine Liste mit den Zahlen 1 bis 70. Aus diesen Zahlen brauche ich alle 10er-Kombinationen die es gibt. Das dürften ein paar Millionen sein. Es geht also nicht darum, wieviele Kombinationen es gibt, sondern um die einzelnen Kombinationen selbst.
zum Beispiel:
1,2,3,4,5,6,7,8,9,10
1,2,3,4,5,6,7,8,9,11
1,2,3,4,5,6,7,8,9,12
und so weiter.. Vielleicht findet sich hier ein Experte :)
6 Antworten
Nimm die Antwort von daCypher
und schreibe die Dinge in eine Datei. oder eher mehrere, damit es keine so große datei gibt, die wiederum kein geeigneter Editor öffnen kann.
Wie unten bereits erwähnt passen ~17Mrd auf ein Blatt. Da man mehrere Blätter haben kann ist dies auch in Excel möglich, aber nicht sinnvoll.
Schreibe einfach mal nur ne "1" in jede Zelle. Bereits ~100MByte große Datei.
Vielleicht gibt es ne bessere Lösung, wenn wir den Anwendungsfall hinter dieser Frage kennen würden.
Abgeleitet vom Lotto, was bereits statistisch auch mit Hilfsprogrammen beliebig beleuchtet ist kannst du etwas für deinen Fall finden.
Das sind ca. 400 Milliarden Kombinationen (wenn die Reihenfolge egal ist; andernfalls wären es noch mehr).
In Excel kannst du die nicht alle anzeigen, da ein Excel-Arbeitsblatt maximal ca. 1 Million Zeilen und 16.384 Spalten haben kann.
Naja, 70 über 10 ist auch nach neuerlicher Überprüfung immer noch:
3,97 · 10¹¹, also 397 Milliarden.
Ich hatte es so verstanden, dass der Fragensteller nicht nach dem Ergebnis des Binomialkoeffizenten, sondern einfach nach 70^10 fragt.
Naja, auf jeden Fall ist es viel zu viel, um realistisch betrachtet auch nur annähernd von Excel bearbeitet zu werden. .)
Das kann mit Excel nicht gehen. Vergiss es einfach!
Es sind übrigens nicht 400 Mrd. mögliche Kombinationen, wie in der anderen Antwort erwähnt, sondern fast 3 Trilliarden.
Die Hardware deines Rechners reicht nicht mal für 0,001% davon aus.
Das wird so also nix! :)
Es sind laut meiner Rechnung 70x69x68x67x66x65x64x63x62x61=1.439.561.377.475.020.800 Möglichkeiten
Ach so, ich dachte Doubletten sind akzeptabel. Na dann hast du natürlich recht!
Ich habs mal so gebaut, dass es etwas anpassungsfähiger ist. Du musst vorher in der Zelle A1 die kleinste Zahl, in der Zelle B1 die größte Zahl und in der Zelle C1 die Größe der Kombination schreiben. Also in diesem Fall A1 = 1, B1 = 70, C1 = 10
Dann das Makro starten und ein paar Tage warten. Ist übrigens das erste mal, dass ich eine sinnvolle Verwendung für eine rekursive Funktion gefunden hab.
Option Explicit
Public Sub combinations()
Dim min As Integer
Dim max As Integer
Dim count As Integer
min = [A1]
max = [B1]
count = [C1]
If min < max And count <= max - min + 1 Then
ReDim values(count - 1) As Integer ' array containing the current values to be printed
Dim i As Integer ' index variable for loops
Dim curCell As Range ' cell to be printed into
Dim maxValue ' max value for current array cell
' Initialize values array
For i = 0 To count - 1
values(i) = min + i
Next i
' Iteration over all cells in current worksheet
For Each curCell In Cells
' store current values
curCell.Value = intJoin(values)
' calculate next values
If getNextCombination(values, count - 1, max) = False Then
Exit Sub
End If
Next curCell
End If
End Sub
Private Function intJoin(values() As Integer) As String
Dim i As Integer
Dim result As String
For i = LBound(values) To UBound(values)
result = result & ", " & values(i)
Next i
intJoin = Mid(result, 3)
End Function
Private Function getNextCombination(ByRef values() As Integer, curIndex As Integer, maxValue As Integer) As Boolean
If values(curIndex) < maxValue Then
values(curIndex) = values(curIndex) + 1
getNextCombination = True
Exit Function
ElseIf curIndex = 0 Then
getNextCombination = False
Else
If getNextCombination(values, curIndex - 1, maxValue - 1) = True Then
values(curIndex) = values(curIndex - 1) + 1
getNextCombination = True
Else
getNextCombination = False
End If
End If
End Function
Da hilft nur eine 10 Fach verschachtelte Forschleife
Ungetestet:
Dim Zeile
Zeile=1
For a=1 to 70
For b=1 to 70
...usw
Range ("A" & Zeile).Value=a & "," & b & "," & c & "," & ....
Zeile=Zeile+1
Next
Next
Das dürfte Excel aber sprengen oder zum Absturz bringen.
'Wenn das ganze Arbeitsblatt gefüllt werden soll:
Dim Zeile
Dim Spalte
Zeile=1
Spalte=1
For a=1 to 70
For b=1 to 70
...usw
If Zeile = Rows.Count Then
Spalte=Spalte+1
Zeile=1
end if
Cells(Spalte,Zeile).Value=a & "," & b & "," & c & "," & ....
Zeile=Zeile+1
Next
Next
Danke erstmal, glaube aber du hast dich verrechnet - Ja die Reihenfolge ist egal, wichtig ist nur, dass es 10er Kombinationen sind. Es sollten ca. 2 Mio Kombinationen sein und in 2-3 Excel-Blätter passen :)