Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Permutation ohne Wiederholung auflisten

Permutation ohne Wiederholung auflisten
13.12.2015 16:14:02
Mark
Hallo zusammen!
ich bin auf der Suche nach einem Makro-Code, welcher mir alle möglichen Kombinationen von unterschiedlichen Begriffen auflistet. Demnach spreche ich von einer Permutation ohne Wiederholung.
Beispiel mit den Begriffen - rot - gelb - grün -:
rot gelb grün
rot grün gelb
gelb rot grün
gelb grün rot
grün rot gelb
grün gelb rot

Annähernd fündig wurde ich bereits hier im Forum:
https://www.herber.de/forum/archiv/1256to1260/1258939_alle_moegl_Zellenkombinationen_mit_Makro_auflisten.html#top
Bei diesem Beitrag sind zwei Lösungen genannt worden, die für meinen Fall Schwächen und Stärken besitzen.
  • Lösung 1 - von Toni

  • Ich habe die Excel-Datei von Toni hier angefügt und darin auch die Schwäche des Makros markiert:
    https://www.herber.de/bbs/user/102234.xlsm
    Schwäche:
    - manche Kombinationen werden doppelt oder vierfach aufgelistet (siehe Markierungen). Entsprechend ist die Kombinationsbildung leider fehlerhaft.
    Stärken:
    + Anzahl der zu kombinierenden Begriffe ist unbegrenzt
    + Ausgabe der Kombinationen in einer Excel-Datei
    Mein Wunsch:
    --> Makro-Code müsste so geschrieben sein, dass eine Permutation ohne Wiederholung gegeben ist.
    Damit wäre dieser Code zu 100 % genau das was ich brauche!!!
  • Lösung 2 - von Rudi Maintaire

  • der Code von Rudi Maintaire:
    Const strDelim As String = "|"
    Sub SpaltenKombinieren()
    Application.ScreenUpdating = False
    Dim objKombi As Object, rngC As Range, lngCount As Long
    Dim arrKombi(), arrTmp, i As Long, j As Long
    Dim colKombi As New Collection
    Set objKombi = CreateObject("Scripting.Dictionary")
    For Each rngC In Range("A:C").Columns
    colKombi.Add _
    Range(Cells(1, rngC.Column), Cells(Rows.Count, rngC.Column).End(xlUp)).Value
    Next
    Kombinieren_a colKombi, , objKombi
    If objKombi.Count > Rows.Count - 1 Then
    MsgBox "Zu viele Kombinationen (" & objKombi.Count & ")", , "Fehler"
    Else
    ReDim arrKombi(1 To objKombi.Count, 1 To colKombi.Count)
    For i = 1 To objKombi.Count
    arrTmp = Split(objKombi(i), strDelim)
    For j = 1 To colKombi.Count
    arrKombi(i, j) = arrTmp(j - 1)
    Next j
    Next i
    Workbooks.Add (1)
    Sheets(1).Cells(1, 1).Resize(UBound(arrKombi), UBound(arrKombi, 2)) = arrKombi
    End If
    Set objKombi = Nothing
    For lngCount = 1 To colKombi.Count
    colKombi.Remove 1
    Next
    Application.ScreenUpdating = True
    End Sub
    Sub Kombinieren_a(colKombi, Optional strAusgabe As String, Optional objKombi)
    Dim i As Long, arrValues, j As Integer
    Static lngStep As Long
    lngStep = lngStep + 1
    If IsArray(colKombi(lngStep)) Then
    For i = 1 To UBound(colKombi(lngStep))
    If lngStep  0 Then
    ReDim arrTmp(UBound(arrValues) - 1)
    For i = 0 To UBound(arrValues)
    If strErg = "" Then
    strTmp = arrValues(i)
    Else
    strTmp = strErg & strDelim & arrValues(i)
    End If
    k = 0
    For j = 0 To UBound(arrValues) - 1
    If i = j Then k = 1
    arrTmp(j) = arrValues(j + k)
    Next j
    Kombinieren_b arrTmp, strTmp, objErg
    Next i
    Else
    objErg(objErg.Count + 1) = strErg & strDelim & arrValues(0)
    End If
    End Sub
    

    Schwächen:
    - nur 3 Begriffe bzw. 3 Spalten mit Begriffen möglich
    - ein neue Excel-Datei öffnet sich zur Ausgabe der Kombinationen
    Stärke:
    + die Permutation ohne Wiederholung ist richtig!
    Mein Wunsch:
    --> es müssten unbegrenzt Begriffe möglich sein
    --> die Ausgabe der Kombinationen sollte in einer Excel-Datei erfolgen
    Zusammenfassend lässt sich sagen, dass die Stärke der einen Lösung, die Schwäche der anderen ist und umgekehrt.
    Ich wäre wirklich sehr dankbar, wenn sich einer der beiden Schöpfer der Makro-Codes auf meinen Beitrag hier im Forum melden würde!
    Vielen vielen Dank schon mal im Voraus!
    Gruß
    Mark

    Anzeige

    2
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Permutation ohne Wiederholung auflisten
    13.12.2015 16:22:14
    Mark
    Edit zu Lösung 1:
    Diese stammt von Tino, nicht Toni!
    Sorry!

    Teste mal...
    13.12.2015 18:11:45
    Michael
    Hi Mark,
    anbei eine verallgemeinerte Lösung aus meiner Schublade.
    Sie speichert als Datei und verwendet bis zu 9 Begriffe, das sind ja schon mal 360000 Zeilen; außerdem läßt es sich bei Bedarf leicht ändern, indem man die Zeile
    a = Eingabe.Range("G1:O1")
    

    andert und statt "O1" als rechter Grenze meinetwegen "V1" einsetzt.
    Meine Herangehensweise ist etwas anders:
    a) hatte ich mir das "eigentliche" Programm bei Rosettacode heruntergeladen; das ist eine ganz gute Quelle für allgemeine Algorithmen in allen möglichen Programmiersprachen.
    b) die Permutationen an sich sind ja immer "gleich", egal, ob man nun die Ziffern von 1 bis 4 oder vier Begriffe verwendet. Also habe ich den Rosetta nicht groß geändert: der gibt schlicht Zahlen aus (um beim späteren Ersetzen von 1 mit "rot" bei der 11 nicht rotrot zu bekommen, habe ich die einzelnen Zahlen in !! geklammert).
    c) in einem dritten Schritt werden einfach die Zahlen durch den jeweiligen Begriff ersetzt.
    Die Datei: https://www.herber.de/bbs/user/102238.xls
    (Das aktuelle Makro ist im Modul1; der alte Code in "Eingabe" wird *nicht* verwendet)
    Schöne Grüße,
    Michael
    Anzeige
    ;
    Anzeige
    Anzeige

    Infobox / Tutorial

    Permutation ohne Wiederholung auflisten


    Schritt-für-Schritt-Anleitung

    Um Permutationen ohne Wiederholung in Excel aufzulisten, kannst du ein VBA-Makro verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

    1. Excel öffnen und eine neue Datei erstellen.

    2. VBA-Editor öffnen: Drücke ALT + F11.

    3. Neues Modul hinzufügen: Klicke auf Einfügen > Modul.

    4. Code eingeben: Füge den folgenden Code in das Modul ein:

      Const strDelim As String = "|"
      Sub SpaltenKombinieren()
         Application.ScreenUpdating = False
         Dim objKombi As Object, rngC As Range, lngCount As Long
         Dim arrKombi(), arrTmp, i As Long, j As Long
         Dim colKombi As New Collection
         Set objKombi = CreateObject("Scripting.Dictionary")
         For Each rngC In Range("A:C").Columns
             colKombi.Add _
             Range(Cells(1, rngC.Column), Cells(Rows.Count, rngC.Column).End(xlUp)).Value
         Next
         Kombinieren_a colKombi, , objKombi
         If objKombi.Count > Rows.Count - 1 Then
             MsgBox "Zu viele Kombinationen (" & objKombi.Count & ")", , "Fehler"
         Else
             ReDim arrKombi(1 To objKombi.Count, 1 To colKombi.Count)
             For i = 1 To objKombi.Count
                 arrTmp = Split(objKombi(i), strDelim)
                 For j = 1 To colKombi.Count
                     arrKombi(i, j) = arrTmp(j - 1)
                 Next j
             Next i
             Workbooks.Add (1)
             Sheets(1).Cells(1, 1).Resize(UBound(arrKombi), UBound(arrKombi, 2)) = arrKombi
         End If
         Set objKombi = Nothing
         For lngCount = 1 To colKombi.Count
             colKombi.Remove 1
         Next
         Application.ScreenUpdating = True
      End Sub
    5. Makro ausführen: Schließe den VBA-Editor und führe das Makro über ALT + F8 aus. Wähle SpaltenKombinieren aus der Liste.

    6. Ergebnisse überprüfen: Die Permutationen ohne Wiederholung sollten nun in einer neuen Excel-Datei erscheinen.


    Häufige Fehler und Lösungen

    • Fehler: "Zu viele Kombinationen"

      • Lösung: Reduziere die Anzahl der Begriffe oder kombinierte Spalten.
    • Fehler: Doppelte Permutationen

      • Lösung: Stelle sicher, dass alle Begriffe in den Spalten eindeutig sind, um Kombinationen ohne Wiederholung zu gewährleisten.
    • Fehler: Das Makro funktioniert nicht

      • Lösung: Überprüfe, ob die Makros in den Excel-Optionen aktiviert sind (Datei > Optionen > Trust Center > Einstellungen für das Trust Center).

    Alternative Methoden

    Wenn du keine VBA-Programmierung verwenden möchtest, kannst du auch die folgenden Methoden ausprobieren:

    1. Power Query: Importiere deine Daten in Power Query und nutze die "Kombinieren"-Funktion.
    2. Formeln: Verwende eine Kombination aus INDEX, VERGLEICH und WENN, um Permutationen zu erzeugen. Diese Methode kann jedoch kompliziert und zeitaufwendig sein.

    Praktische Beispiele

    Hier sind einige praktische Beispiele für die Verwendung des Codes:

    • Beispiel 1: Begriffe: "rot", "gelb", "grün"

      • Ergebnis:
        rot  gelb  grün
        rot  grün  gelb
        gelb rot  grün
        ...
    • Beispiel 2: Begriffe: "A", "B", "C", "D"

      • Ergebnis:
        A  B  C  D
        A  B  D  C
        A  C  B  D
        ...

    Tipps für Profis

    • Experimentiere mit der Anzahl der Spalten in deinem Code, um mehr Begriffe zu kombinieren.
    • Vermeide zu viele Begriffe auf einmal, um die Leistung von Excel nicht zu beeinträchtigen.
    • Nutze die Funktion Kombination ohne Wiederholung und Kombination mit Wiederholung, um verschiedene Anforderungen zu erfüllen.

    FAQ: Häufige Fragen

    1. Wie viele Begriffe kann ich kombinieren? Du kannst bis zu 9 Begriffe kombinieren, ohne dass die Leistung von Excel beeinträchtigt wird.

    2. Wie kann ich das Ergebnis in einer bestehenden Datei speichern? Ändere den Code so, dass er die Ergebnisse in eine bestimmte Arbeitsmappe speichert, anstatt eine neue zu erstellen.

    3. Gibt es eine Möglichkeit, Kombinationen ohne Wiederholung manuell zu erstellen? Ja, du kannst die Begriffe manuell in eine Liste eingeben und dann die Funktion PERMUT in Excel verwenden, um die Gesamtzahl der möglichen Permutationen zu berechnen.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige