406 Aufrufe
Gefragt in Tabellenkalkulation von ahorn38 Experte (3.2k Punkte)
Hallo,

ich suche nach einem Tipp für eine Formel oder code mit dem ich alle Kombinationen auflisten kann. ZB: alle möglichen 3er - Kombinationen aus 6 Möglichkeiten.

Die Anzahl kann man leicht berechnen, mir geht es aber um die Auflistung aller Möglichkeiten.

Danke und Gruß A.

13 Antworten

0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)

Hallo ahorn38

das sollte mit drei ineinander geschachtelten for-Schleifen zu machen sein.

Ich gehe jetzt mal davon aus, dass die Elemente einfach fortlaufende Nummern sind. Angenommen die Anzahl der Elemente ist n und es sollen alle 3er Kombinationen aufgelistet werden. Die jeweils drei Elemente einer Kombination sind A, B und C

Dann können die Schleifen in Anlehnung an c++ so aussehen:

for (int A=1;A<n-2;A++){
   for (int B=A+1;B<n-1;B++){
      for (int C=B+1;C<=n;C++){
         printf(A," ",B," ",C);
      }
   }
}

Gruß computerschrat

0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo,

danke für die schnelle Antwort. Ich kann das allerdings nur schwer nachvollziehen, da meine Kenntnisse in c++ minimal sind. Hast du vlt. eine VBA-Übersetzung? Die Elemente sind in A1:A10 aufgelistet.

Danke und Gruß A.
0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)

Hallo Ahorn,

ich habe zwar noch nie in VBA programmiert, aber es könnte ungefähr so aussehen:

Dim A, B, C AS Integer

For A = 1 To 10 Step 1
   For B = A+1 to 9 Step 1
      For C = B+1 to 10 Step 1
        ' Hier verlassen mich meine VBA Kenntnisse in Excel.
        ' A, B und C sind als Index zu verwenden, mit dem auf
        ' Zellen A1:A10 zugegriffen wird
        ' der Inhalt, der darüber gefunden wird kann dann in die Liste eingetragen werden.
      Next C
   Next B
Next A

Gruß computerschrat

0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo,

danke, ich versuche mal was daraus zu machen.

Gruß
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)

Hallo,

ich habe deinen Code mal "übersetzt" für die Kombination 3 aus 6  (A1:A6=abcdef):

Sub ffff()

Dim i, j, k, m As Integer
m = 13
For i = 1 To 6
   For j = i + 1 To 6
      For k = i + 2 To 6
        Cells(m, 1) = Cells(i, 1) & Cells(j, 1) & Cells(k, 1)
        m = m + 1
      Next
    Next
Next
End Sub

Das Ergebnis kommt der Sache näher, stimmt aber noch nicht, da die Elemente dabei auch doppelt in einer Kombination vorkommen können.

VG A.

0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)

Hallo ahorn38,

ich hatte da einen Tippfehler in meinem Code der dich in die Verwirrung geführt hat.:

Die Schleife für i darf nur bis 4 und die Schleife für j nur bis 5 laufen. Die Schleife für k muss bei j+1 und nicht bei i+2 starten. also in deinem Code:

Sub ffff()

Dim i, j, k, m As Integer
m = 13
For i = 1 To 4
   For j = i + 1 To 5
      For k = j + 1 To 6
        Cells(m, 1) = Cells(i, 1) & Cells(j, 1) & Cells(k, 1)
        m = m + 1
      Next
    Next
Next
End Sub

Gruß computerschrat

0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)

Hallo,

so ganz klappt das auch noch nicht.

Kombinationen sind ja in der Regel alle Varianten "ohne Zurücklegen", das heißt, das ein einmal verbrauchtes Element nicht wieder verwendet werden darf und auch die Reihenfolge ist unwesentlich bei den Kombinationen: zB. AEC und ACE dürfen nicht beide vorkommen.

Das Programm liefert bei 6 Elementen zu 3er Packs:

ABC
ABD
ABE
ABF
ACC
ACD
ACE
ACF
ADC
ADD
ADE
ADF
AEC
...
ACC und ADD dürften also auch nicht vorkommen.

Wir müssen also noch ein bißchen probieren.
VG A.
 
0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo ahorn38,

ich habe den Eindruck, dass die k-Schleife nicht bei j+1 startet, sondern fest  bei 3, Poste doch nochmal den aktuellen Code.

Gruß computerschrat
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Sub ffff()

Dim i, j, k, m As Integer
m = 8
For i = 1 To 4
   For j = i + 1 To 5
      For k = i + 2 To 6
        Debug.Print Cells(i, 1) & Cells(j, 1) & Cells(k, 1)
        Cells(m, 1) = Cells(i, 1) & Cells(j, 1) & Cells(k, 1)
        m = m + 1
      Next
      
    Next
Next
End Sub
+1 Punkt
Beantwortet von computerschrat Profi (32.2k Punkte)
Die k-Schleife muss bei k=j+1 starten, dann klappt es.

Gruß computerschrat
...