323 Aufrufe
Gefragt in Tabellenkalkulation von

Hallo,

ich stehe vor dem Problem, dass ich Spielpaarungen erstellen muss.

Jetzt suche ich mir in Google einen Wolf, aber fündig geworden für mein vermeintlich simples Problem bin ich nicht wirklich.

In Spalte A habe ich meine Teams eingetragen, durch das Makro sollen in Spalte C und D jeweils die Paarungen ausgegeben werden.

Mit der Formel KOMBINATIONEN kann ich zumindest schon mal ermitteln, dass es 15 Spielpaarungen ergibt.

Kann mich bitte hier jemand auf die richtige VBA Spur bringen!

Ich gebe mich mit einer einfachen Hinrunde zufrieden, aber mit Hin- und Rückrunde wäre es überhaupt der Hammer.

DANKE schon im Voraus für die Hilf!

Gruß
Lukas

6 Antworten

0 Punkte
Beantwortet von
Sub ErzeugeKombinationen()
    Dim LastRow As Long
    Dim i As Long
    Dim j As Long
    Dim k As Long
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row
    Range("C:D").ClearContents
    k = 1
    For i = 1 To LastRow - 1
        For j = i + 1 To LastRow
            Cells(k, "C").Value = Cells(i, "A").Value
            Cells(k, "D").Value = Cells(j, "A").Value
            k = k + 1
        Next j
    Next i
End Sub
0 Punkte
Beantwortet von
Falls es nicht direkt in Excel sein muss

suche mal nach

"Round Roubin Generator"

da findet man genug
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)

Hallo,

oder das Makro aus der 1. Antwort mit Rückrunde:

Sub ErzeugeKombinationen2()

Dim LastRow As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim z As Long
Dim arrKombis As Variant

'Letzte beschrieben Zeile in Spalte A ermitteln
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
'Inhalte aus Ausgabebereich löschen
Range("C:D").ClearContents
'Anzahl der möglichen Kombinationen ermitteln
z = Application.WorksheetFunction.Combin(LastRow, 2)
'Array für Kombinationen dimensionieren - Array beginnt mit Null
ReDim arrKombis(z - 1, 1)
'Kombinationen erstellen
For i = 1 To LastRow - 1
    For j = i + 1 To LastRow
            arrKombis(k, 0) = Cells(i, "A").Value
            arrKombis(k, 1) = Cells(j, "A").Value
            k = k + 1
    Next j
Next i

'Hinrunde ausgeben
'Zeilenzähler auf 1 stellen
k = 1

For i = LBound(arrKombis, 1) To UBound(arrKombis, 1)
  Cells(k, "C") = arrKombis(i, 0)
  Cells(k, "D") = arrKombis(i, 1)
  k = k + 1
Next i

'Rückrunde
'1 leere Zeile einfügen
k = k + 1
For i = LBound(arrKombis, 1) To UBound(arrKombis, 1)
  Cells(k, "C") = arrKombis(i, 1)
  Cells(k, "D") = arrKombis(i, 0)
  k = k + 1
Next i

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von
Das gibt aber nur alle möglichen Paarungen aus - daraus denn einen Spielplan zu machen ist die eigentliche Schwierigkeit - denn da soltte ja auch jeder genau 1 x  pro Runde spielen - deswegen auch der Verweis auf externe Lösungen
0 Punkte
Beantwortet von
Bearbeitet

Ohne Schleifen!

Sub ZweierKombinationen()
    Dim lastRow As Long
    Dim rngA As Range, rngC As Range, rngD As Range
    Dim numCombinations As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Set rngA = Range("A1:A" & lastRow)
    numCombinations = (lastRow * (lastRow - 1)) / 2
    Set rngC = Range("C1:C" & numCombinations)
    Set rngD = Range("D1:D" & numCombinations)
    rngC.FormulaArray = "=INDEX(" & rngA.Address & ", INT((ROW()-ROW($C$1))/(" & lastRow - 1 & "))+1)"
    rngD.FormulaArray = "=IF(MOD(ROW()-ROW($D$1)," & lastRow - 1 & ")<>0,INDEX(" & rngA.Address & ", MOD(ROW()-ROW($D$1)," & lastRow - 1 & ")), INDEX(" & rngA.Address & ", " & lastRow & "))"
    rngC.Value = rngC.Value
    rngD.Value = rngD.Value
End Sub

Für Lernzwecke!

  1. Dim lastRow As Long: Deklariert eine Variable vom Typ Long mit dem Namen lastRow, die später die letzte Zeile in Spalte A speichern wird.

  2. Dim rngA As Range, rngC As Range, rngD As Range: Deklariert drei Variablen vom Typ Range mit den Namen rngA, rngC und rngD, die später verwendet werden, um die entsprechenden Bereiche in der Arbeitsmappe darzustellen.

  3. Dim numCombinations As Long: Deklariert eine Variable vom Typ Long mit dem Namen numCombinations, die später die Anzahl der möglichen Zweierkombinationen speichern wird.

  4. lastRow = Cells(Rows.Count, 1).End(xlUp).Row: Bestimmt die letzte Zeile in Spalte A, indem von der letzten Zeile der Tabelle (Rows.Count) in Spalte 1 (A) nach oben (xlUp) gegangen wird. Die Zeilennummer dieser Zelle wird dann der Variablen lastRow zugewiesen.

  5. Set rngA = Range("A1:A" & lastRow): Setzt den Bereich rngA auf die Zellen in Spalte A von Zeile 1 bis zur letzten Zeile (lastRow). Dieser Bereich repräsentiert die Namen, die für die Zweierkombinationen verwendet werden.

  6. numCombinations = (lastRow * (lastRow - 1)) / 2: Berechnet die Anzahl der möglichen Zweierkombinationen der Namen. Die Formel (lastRow * (lastRow - 1)) / 2 basiert auf der Kombinatorik und berechnet die Anzahl der Kombinationen ohne Wiederholung.

  7. Set rngC = Range("C1:C" & numCombinations): Setzt den Bereich rngC auf die Zellen in Spalte C von Zeile 1 bis zur Zeile numCombinations. Dieser Bereich wird später verwendet, um die Kombinationen der ersten Person in den Zweierkombinationen zu speichern.

  8. Set rngD = Range("D1:D" & numCombinations): Setzt den Bereich rngD auf die Zellen in Spalte D von Zeile 1 bis zur Zeile numCombinations. Dieser Bereich wird später verwendet, um die Kombinationen der zweiten Person in den Zweierkombinationen zu speichern.

  9. rngC.FormulaArray = "=IF(ROW()-ROW($C$1)>COUNTA(" & rngA.Address & ")-1,"""",INDEX(" & rngA.Address & ", INT((ROW()-ROW($C$1))/(" & lastRow - 1 & "))+1))": Weist den Zellen im Bereich rngC eine Array-Formel zu. Die Array-Formel überprüft die Zeilenposition (ROW()-ROW($C$1)) und verwendet die Funktion INDEX, um den entsprechenden Namen aus dem Bereich rngA basierend auf der Zeilenposition zu ermitteln. Wenn die Zeilenposition größer ist als die Anzahl der Namen minus 1, wird ein leeres Feld geschrieben.

  10. rngD.FormulaArray = "=IF(ROW()-ROW($D$1)>COUNTA(" & rngA.Address & ")-1,"""",IF(MOD(ROW()-ROW($D$1)," & lastRow - 1 & ")<>0,INDEX(" & rngA.Address & ", MOD(ROW()-ROW($D$1)," & lastRow - 1 & ")+IF(MOD(ROW()-ROW($D$1)," & lastRow - 1 & ")+1>INT((ROW()-ROW($D$1))/(" & lastRow - 1 & ")),1,2)), INDEX(" & rngA.Address & ", " & lastRow & ")))": Weist den Zellen im Bereich rngD eine Array-Formel zu. Die Array-Formel überprüft die Zeilenposition (ROW()-ROW($D$1)) und verwendet die Funktionen MOD und INDEX, um den entsprechenden Namen aus dem Bereich rngA basierend auf der Zeilenposition zu ermitteln. Die Formel stellt sicher, dass gleiche Paare ausgeschlossen werden.

  11. rngC.Value = rngC.Value und rngD.Value = rngD.Value: Wandelt die Formeln in den Zellen des Bereichs rngC und rngD in ihre tatsächlichen Werte um. Dies erfolgt durch Zuweisung des aktuellen Werts der Zellen zu sich selbst.

0 Punkte
Beantwortet von kody Experte (3k Punkte)
Bearbeitet von kody
...