Hallöle....
hab auch mal versucht mich der Problemstellung mit VBA zu nähern:
@ nighty... (AW31)... Du bist mitschuldig
:-)
aber der eigentlich Schuldige ist der Ehrgeiz!
:-) :-)
So, nu aber zum Thema:
Ich bin zu der Überzeugung gekommen, das es ohne nachfolgende Einschränkungen nicht machbar ist:
1. Wenn im Laufe der Spielrunden jeder Mitspieler nur einmal an jeden Tisch sitzt, so werden einige Spieler mehrmals zusammensitzen.
2. Wenn es bei der Zusammensetzung der Spieler keine Wiederholungen gibt, so werden nicht alle Spieler alle Tische durchlaufen.
(hier gibt es dann 5 Spieler, die immer an dem gleichen Tisch sitzen)
Das ist auch der Stand meines Code's.
Bedingungen: In A3 steht die Anzahl der Stühle pro Tisch.
Anzahl der Stühle = Anzahl der Spielrunden(Tische)
Anzahl der Spieler = Anzahl Stühle * Anzahl Tische
Anzahl der Stühle für's generieren steht in A3
In A1 wird die Anzahl der letzten Generierung abgelegt... für's leeren vor erneutem generieren.
Nach vielen Tassen Kaffee und vielen Raucherpausen kam dann folgendes heraus:
(Von Zeit wollen wir hier ja nicht reden... macht ja Spasss!!)
Option Explicit
Dim AnzStuehle As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
Private Sub CommandButton1_Click()
' ------------ anzahl Stühle pro Tisch kontrollieren -----------
If ActiveSheet.Cells(3, 1) = "" Then ActiveSheet.Cells(3, 1) = 5
AnzStuehle = ActiveSheet.Cells(3, 1) '-------- neue Vorgabe der Stuhlanzahl
ReDim Feld(AnzStuehle + 1, AnzStuehle * AnzStuehle * 3)
k = ActiveSheet.Cells(1, 1) '-------- vorherige Anzahl der Stühle
If k = 0 Then k = 5
' --------- alte Maske entfernen ---------------
ActiveSheet.Range(Cells(9, 2), Cells(11 + k, 11 + k * k)).Borders(xlEdgeLeft).LineStyle = xlNone
ActiveSheet.Range(Cells(9, 2), Cells(11 + k, 11 + k * k)).Borders(xlEdgeTop).LineStyle = xlNone
ActiveSheet.Range(Cells(9, 2), Cells(11 + k, 11 + k * k)).Borders(xlEdgeBottom).LineStyle = xlNone
ActiveSheet.Range(Cells(9, 2), Cells(11 + k, 11 + k * k)).Borders(xlEdgeRight).LineStyle = xlNone
ActiveSheet.Range(Cells(9, 2), Cells(11 + k, 11 + k * k)).Borders(xlInsideVertical).LineStyle = xlNone
ActiveSheet.Range(Cells(9, 2), Cells(11 + k, 11 + k * k)).Borders(xlInsideHorizontal).LineStyle = xlNone
ActiveSheet.Range(Cells(7, 1), Cells(11 + k, 11 + k * k)).ClearContents
' ---------------- Grundmaske ------------------
ActiveSheet.Cells(1, 1).Font.ColorIndex = 2
ActiveSheet.Cells(2, 1) = "Anzahl pro Tisch:"
' ---------- erste Spalte ----------------
ActiveSheet.Columns(1).ColumnWidth = 10
' ---------- alle weiteren Spalte im Bereich ----------------
For i = 1 To AnzStuehle * AnzStuehle
ActiveSheet.Columns(i + 1).ColumnWidth = 3
Next i
ActiveSheet.Rows(10).RowHeight = 35
' -------------- Beschriftungen ------------------
For i = 0 To AnzStuehle - 1
ActiveSheet.Cells(7, 3 + i * AnzStuehle) = "Runde " & i + 1
ActiveSheet.Cells(11 + i, 1) = "Stuhl-Nr. " & i + 1
For j = 1 To AnzStuehle
ActiveSheet.Cells(10, 1 + j + i * AnzStuehle) = "T-Nr. " & j
ActiveSheet.Cells(10, 1 + j + i * AnzStuehle).Orientation = 90
ActiveSheet.Cells(10, 1 + j + i * AnzStuehle).Borders(xlEdgeLeft).Weight = xlThin
Next j
Next i
' ------------- Rahmen setzen ---------------------
For i = 0 To AnzStuehle - 1
ActiveSheet.Range(Cells(11, 2 + i * AnzStuehle), Cells(11 + AnzStuehle - 1, 1 + (i + 1) * AnzStuehle)).Borders(xlEdgeLeft).Weight = xlThick
ActiveSheet.Range(Cells(11, 2 + i * AnzStuehle), Cells(11 + AnzStuehle - 1, 1 + (i + 1) * AnzStuehle)).Borders(xlEdgeTop).Weight = xlThick
ActiveSheet.Range(Cells(11, 2 + i * AnzStuehle), Cells(11 + AnzStuehle - 1, 1 + (i + 1) * AnzStuehle)).Borders(xlEdgeBottom).Weight = xlThick
ActiveSheet.Range(Cells(11, 2 + i * AnzStuehle), Cells(11 + AnzStuehle - 1, 1 + (i + 1) * AnzStuehle)).Borders(xlEdgeRight).Weight = xlThick
ActiveSheet.Range(Cells(11, 2 + i * AnzStuehle), Cells(11 + AnzStuehle - 1, 1 + (i + 1) * AnzStuehle)).Borders(xlInsideVertical).Weight = xlThin
ActiveSheet.Range(Cells(11, 2 + i * AnzStuehle), Cells(11 + AnzStuehle - 1, 1 + (i + 1) * AnzStuehle)).Borders(xlInsideHorizontal).Weight = xlThin
Next i
' ------------ Array füllen ----------------------------------
For j = 0 To AnzStuehle - 1
For k = 0 To AnzStuehle + AnzStuehle
For i = 1 To AnzStuehle
Feld(j + 1, i + k * AnzStuehle) = i + AnzStuehle * j
Next i
Next k
Next j
' ----------------------------- array ausgeben ------------------
For j = 1 To AnzStuehle
For i = 1 To AnzStuehle * AnzStuehle
ActiveSheet.Cells(10 + j, i + 1) = Feld(j, i)
Next i
Next j
' ---------------- Reihe 2 bis X ab Runde 2 um eins+x verschieben ----------
k = 1
Do
For j = 0 To AnzStuehle - 2
For i = 1 To AnzStuehle
Feld(1 + k, i + AnzStuehle + j * AnzStuehle) = Feld(1 + k, i + AnzStuehle + j * k + k + j * AnzStuehle)
ActiveSheet.Cells(11 + k, i + j * AnzStuehle + AnzStuehle + 1) = Feld(1 + k, i + AnzStuehle + j * k + k + j * AnzStuehle)
Next i
Next j
k = k + 1
Loop While k < AnzStuehle
' ######################### geht nicht!!!!!!####################################
' ---------------- 1.Reihe ab Runde 2 um eins entgegengesetzt verschieben ----------
' For j = 0 To AnzStuehle - 2 '- 2 To 0 Step -1
' For i = 1 To AnzStuehle ' To 1 Step -1
' Feld(1, i + AnzStuehle + j * AnzStuehle) = Feld(1, i + AnzStuehle - j + 4 + j * AnzStuehle)
' ActiveSheet.Cells(11, i + j * AnzStuehle + AnzStuehle + 1) = Feld(1, i + AnzStuehle - j + 4 + j * AnzStuehle)
' Next i
' Next j
' ---------- Anzahl merken zum leeren ----------------
ActiveSheet.Cells(1, 1) = AnzStuehle
End Sub
Wenn man die letzten beiden Schleifen mitlaufen läßt, kommt es zu wiederholten Paarungen.
An einem Prog, das beide Nachteile in der Waage auspendelt, bin ich gescheitert... ich geb's zu.
Viel Spassss beim ausprobieren... ich schau auf jeden Fall noch mal hier rein.
Grüße
Kauz