Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1464to1468
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

    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

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige
    Archiv - Verwandte Themen
    Forumthread
    Beiträge