Live-Forum - Die aktuellen Beiträge
Datum
Titel
03.05.2024 10:49:02
03.05.2024 10:43:56
03.05.2024 07:38:32
Anzeige
Archiv - Navigation
1928to1932
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 Zurücklegen in Excel..

Permutation ohne Zurücklegen in Excel..
20.05.2023 20:23:44
Bernd

Hallo Forum,

im Internet gibt es jede Menge Formeln, wie man die Anzahl verschiedener statistischer Urnenmodell berechnet. Ich möchte allerdings in Excel die genauen Kombinationen systematisch berechnen für die Zahlen 1 bis 6 ohne Zurücklegen (Modell: die Urne enthält die Zahlen 1 bis 6 und es werden alle 6 Kugeln gezogen ohne zurücklegen)

Also los geht es z.B. mit der Kombination (bzw. Permutation = Reihenfolge)
1,2,3,4,5,6
2,1,3,4,5,6
usw.

Das würde ich gerne systematisch berechnen in Spalte A die erste Zahl, in Spalte B die zweite Zahl bis Spalte F die 6. Zahl. Hat irgendjemand eine Idee oder konkreten Vorschlag wie ich das bewerkstelligen könnte (eventuell auch mit vba-code?)

Falls ihr im Internet einen Link kennt, der die Berechnung der genauen Kombinationen erklärt (nicht die Berechnung der Anzahl!), dann gerne hier posten...

Danke vorab, Bernd

P.S. Excel 2021(?) aus dem Office Paket 2021

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Permutation ohne Zurücklegen in Excel..
20.05.2023 21:03:34
Bernd
Sieht schon ganz gut aus.
Wenn du mir jetzt noch verrätst wie ich die Kombination der Zahlen aus Zahlenwert in die Spalten B bis G bekomme, dann bist du ein Held. Mit der Funktion Teil kann ich es zwar aus dem String auslesen Ziffer für Ziffer, aber Excel erkennt es nicht als Zahl - blöd oder ich bin zu doof....

Vielen Dank schon mal aber für den Tipp

Bernd


Anzeige
AW: Permutation ohne Zurücklegen in Excel..
20.05.2023 21:11:24
Bernd
...habe es gefunden...muss die Funktion Teil noch mit 1 multiplizieren und dann wird der String (die String-Ziffer) als Zahl erkannt....
Fall gelöst...

Danke Matthias!


AW: Permutationen-Liste: Excelformeln Nr. 325
20.05.2023 21:39:13
Bernd
Hallo Lupo1,

danke für die beiden Links - schaue ich mir morgen in Ruhe an aber geht absolut in die Richtung, die ich suche, daher auch ein Dankeschön an dich an dieser Stelle, Bernd

...und Gn8 für heute


Mit Dopplern ("ohne Zurücklegen" ist falsch)
20.05.2023 21:41:06
lupo1
Einfach ein =EINDEUTIG() auf die Liste anwenden! (ab XL2021)

(Der Begriff "Zurücklegen" gehört nur zu Kombinationen und Variationen. Denn Permutationen kennen ja keine "Entnahme".)


Hier Liste in einer einzigen Formel (max. n=6)
21.05.2023 00:54:46
lupo1
https://www.office-hilfe.com/support/threads/permut-list-liste-der-permutationen-ohne-und-mit-wdh.57789/

(die geniale Kühnlein-Formel Nr. 325 lässt sich nicht leicht dynamisch umsetzen, weil sie auf Vorgänger in unterschiedlichem Abstand zugreift, was beim Herunterkopieren möglich ist, über SCAN aber möglicherweise nicht. Übrigens sind die Einträge der Nr. 325 nicht sortiert)


Anzeige
AW: Hier Liste in einer einzigen Formel (max. n=6)
21.05.2023 10:26:52
Bernd
Hallo Lupo1,

Excel 365 habe ich nicht. Bei mir funktioniert die Kühnlein-Formel 325, allerdings ist die Formel im der Zelle A2 eine Matrix-Formel (was im Link im Internet nicht als geschweifte Klammern angezeigt wird).
Insofern bin ich sehr zufrieden mit den gefundenen Lösungen. Aber gut zu wissen, dass es noch einfacher geht, wenn man mal auf Excel 365 umsteigt...

dir einen schönen Sonntag und nochmals Danke!
Bernd


Hat 2019 nicht den Formeln-Satz von 365?
21.05.2023 11:19:09
Yal
...
Somit wäre einer "365" Formellösung in "2019" abbildbar.
(Bin selber noch bei 2016)

VG
Yal


AW: Hat 2019 nicht den Formeln-Satz von 365?
21.05.2023 11:35:39
RPP63
Kurz hier einmischend, Yal:
2019 ist sehr ähnlich zu 2016
2021 ist sehr ähnlich zu 365
Entscheidend ist:
2019 kennt keine Spill-Formeln und auch keine "selbständige" Erkennung von Matrixformeln.

Gruß Ralf


XL2019 kennt nur =FILTER()
21.05.2023 11:53:53
lupo1
... alles andere neue, also auch SEQUENZ, nicht! Zumindest laut MS-Support. Vielleicht irren die ja auch.


AW: XL2019 kennt nur =FILTER()
21.05.2023 21:07:34
Luschi
Hallo lupo1,

die Filter-Funktion war mal kurzzeitig in Excel 2019 verfügbar, ist jetzt aber wieder verschwunden mit dem Ergebnis:
=_xlfn._xlws.FILTER(Table1[Product];Table1[Category]=G17;"")

Gruß von Luschi
aus klein-Paris


Anzeige
Habs LAMBDA-rekursiv hinbekommen (XL365, XLWeb)
21.05.2023 16:58:08
lupo1
(gleicher Link wie oben, aber alles neu)
https://www.office-hilfe.com/support/threads/permut-list-liste-der-permutationen-ohne-und-mit-wdh.57789/

Unglaublich, wie kurz man das schreiben kann! Und das vor dem Hintergrund der genialen Kühnlein-Formel, die nur den Fall A) berücksichtigt.

A) Ohne Wiederholung: Bis zu 9 zu permutierende Inhalte; erlaubt sind die Argumente 1 bis 9. 10 sprengt eine Exceltabelle ca. um das knapp Vierfache.

B) Mit Wiederholung: Siehe Beispiele dort. Man kann vorher über die FAKULTÄT-Funktion die Anzahl der Permutationen ermitteln, um zu sehen, ob die Liste der Permutationen in die 2^20 Zellen von Excel passt.


Anzeige
AW: Permutation ohne Zurücklegen in Excel..
22.05.2023 20:30:29
Daniel
Hi
weils Spass macht, hier nochmal eine Makrovariante

hier das Hauptmakro, in dem die Werte, die mutiert werden sollen angegeben werden und welche die Permutation startet und dann das Ergebnis ausgibt.
die zu mutierenden Werte werden im String WerteListe mit "|" getrennt angegeben, dh man kann hier nicht nur Zahlen, sondern auch Texte angeben mit mehreren Zeichen angeben, wenn man das wollte.
die Anzahl der Stellen kann man aus der Werteliste wie im Code gezeigt berechnen lassen, oder auch als Wert vorgeben.
die Funktion Transp macht dann aus dem Ergebnis Array ein echtes zweidimensionales Array, das als ganzes in die Tabelle zurückgeschrieben werden kann. Das ist schneller und leistungfähiger (Datenmenge) als das VBA-eigene Worksheetfunction.Transpose.
somit ist das Makro recht schnell und kann dann bis zu 9 Elemente durchmutieren (bei 10 müsste man dann schon die Ausgabe teilen, was aber prinzipiell möglich wäre)

Sub Permutationen_Berechnen()
Dim WerteListe As String
Dim Gesamtergebnis
Dim Zwischenergebnis
Dim Anzahl As Long


WerteListe = "1|2|3|4"
Anzahl = UBound(Split(WerteListe, "|")) + 1
ReDim Zwischenergebnis(1 To Anzahl)

Call Permutation(Gesamtergebnis, Zwischenergebnis, WerteListe, 1)
Gesamtergebnis = Transp(Gesamtergebnis)
Cells(1, 1).Resize(UBound(Gesamtergebnis, 1), UBound(Gesamtergebnis, 2)).Value = Gesamtergebnis
End Sub
Private Sub Permutation(ByRef Gesamtergebnis, ByRef Zwischenergebnis, ByVal Werte As String, ByVal Pos As Long)
Dim x
Dim txt As String
For Each x In Split(Werte, "|")
    Zwischenergebnis(Pos) = x
    If Pos = UBound(Zwischenergebnis) Then
        On Error Resume Next
        ReDim Preserve Gesamtergebnis(1 To UBound(Gesamtergebnis) + 1)
        If Err > 0 Then ReDim Gesamtergebnis(1 To 1)
        On Error GoTo 0
        Gesamtergebnis(UBound(Gesamtergebnis)) = Zwischenergebnis
    Else
        txt = Replace("|" & Werte & "|", "|" & x & "|", "|")
        txt = Mid(txt, 2, Len(txt) - 2)
        Call Permutation(Gesamtergebnis, Zwischenergebnis, txt, Pos + 1)
    End If
Next
End Sub
Private Function Transp(Matrix)
    Dim z As Long
    Dim s As Long
    ReDim Erg(1 To UBound(Matrix), 1 To UBound(Matrix(1)))
    
    For z = 1 To UBound(Erg, 1)
        For s = 1 To UBound(Erg, 2)
            Erg(z, s) = Matrix(z)(s)
        Next
    Next
Transp = Erg
End Function
Gruß Daniel


Anzeige
Es lebe die Lösungsvielfalt (Zusammenfassung)
23.05.2023 07:36:27
lupo1
Auch bei mir sind alphanumerische Bestandteile möglich.

Das ist aber nur deshalb nötig, damit man mehr als die 10 verschiedenen Ziffern eingeben könnte. Bei meinen Lösungen ist allerdings bei 9 verschiedenen Schluss, außer bei
[VARIATIONEN mit Zurücklegen, 5]: =COMBINATRICS("1234567890ABC";4;5), da das anders funktioniert, als die zugrundeliegenden
[PERMUTATIONEN, 2], die (bei mir technisch) auch für
[KOMBINATIONEN, 3] und
[VARIATIONEN ohne Zurücklegen, 4] gelten.

Denn die anderen bauen alle auf dem Limit von [FAKULTÄT(9) = 362880 = größtmögliche Anzahl Zellen im Excel-Tabellenblatt untereinander] auf.

Sind im String auch Doppler, spricht man bei den COMBINATRICS (= in der Kombinatorik) von Wiederholern. Dies bitte nicht mit Zurücklegen verwechseln! Die Wiederholer sind im Material; das (ggflls) Zurücklegen geschieht bei dessen Auswertung (nur VARIATIONEN).

Es gibt also (vorbehaltlich weiterer Spezialfälle oder Erweiterungen):
PERMUTATION ohne Wiederholung FAKULTÄT(n)
PERMUTATION mit Wiederholung FAKULTÄT(n)/FAKULTÄT(proWdh)
KOMBINATION ohne Wiederholung FAKULTÄT(n)/FAKULTÄT(k)/FAKULTÄT(n-k)
KOMBINATION mit Wiederholung (da habe ich gerade kein Foto für Dich)
VARIATION ohne Wiederholung, ohne Zurücklegen FAKULTÄT(n)/FAKULTÄT(n-k)
VARIATION mit Wiederholung, ohne Zurücklegen (da habe ich gerade kein Foto für Dich)
VARIATION mit Zurücklegen (da sind Wiederholungen egal): n^k (mit n = Anzahl eindeutige Bestandteile)

Ansonsten kann man zugehörige Texte aus den 1stelligen Zeichen per VERWEIS erzeugen, und diese auf mehrere Zellen nebeneinander mit =TEIL() bzw. =TEXTNACH(TEXTVOR()) trennen.


Anzeige
Hmm...
26.05.2023 17:43:17
Yal
... entdecke erst jetzt, dass deine Lösung auch rekursiv arbeitet. Ich habe somit mal wieder dasselbe nachgebaut. A la gut..


Sorry, wie immer sehr spät dran...
26.05.2023 17:31:07
Yal
Moin,

Da ich für eine andere Fall ein "Kombinieren" bräuchte und diese rekursiv gelöst habe, habe ich gedacht, es sollte auch rekursiv gehen können.

Voilà:
Sub Permute_test()
    Permute "", Split("a b c d")
End Sub

Sub Permute(ByVal Satz, Liste)
Dim i, j
Dim Arr
Dim L, U
    L = LBound(Liste)
    U = UBound(Liste)
    If U = L Then
        Debug.Print Satz & Liste(U)
    Else
        For j = L To U
            Arr = Array()
            For i = L To U
                If Liste(i) > Liste(j) Then
                    ReDim Preserve Arr(UBound(Arr) + 1)
                    Arr(UBound(Arr)) = Liste(i)
                End If
            Next
            Permute Satz & Liste(j), Arr
        Next
    End If
End Sub
Möchte man die Ergebnisse sammeln anstatt herausgeben, müsste man einen global Array deklarieren, die man ähnlich wie Arr fortlaufend ergänzt.

VG
Yal


Anzeige
AW: Sorry, wie immer sehr spät dran...
26.05.2023 20:31:58
Bernd
Coole Expertendiskussion, die ich da unabsichtlich angestoßen habe...
Scheint ein allgemein interessantes Themenfeld zu sein...

Nochmals danke an alle Experten für die ausführlichen Lösungen bzw. Lösungsvorschläge

Bernd

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige