8.6k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo zusammen,

aufgrund meiner diversen guten Erfahrungen mit Euch als Problemlösern, habe ich heute mal wieder eine kleine Excel Knobelaufgabe:

Ich habe 5 Tische A, B, C, D, E und 25 Personen 1-25. Wir spielen 5 Spielrunden S1, S2, S3, S4 und S5.

Jede Person soll während der 5 Runden genau EINMAL an jedem Tisch sitzen.

Dabei sollen die Personen möglichst gut durchgemischt werden, d.h. möglichst selten zusammen an einem Tisch sitzen.

Die genaue mathematische Umsetzung ist für mich weniger wichtig als eine praktikable Lösung, also wenn jemand z.B. das ganze per Zufall lösen kann, wäre das in Ordnung für mich.

Grüße und Danke schonmal,
markchili

48 Antworten

0 Punkte
Beantwortet von kauz Mitglied (291 Punkte)
Hallo markchili...

natürlich gibt es noch 'Fehler':
Es gibt je nach Anzahlverhältnis von Stuhlanzahl zu Tischanzahl Wiederholungen in der Tischzusammensetzung.
(Das geht dann auch garnicht anders... nach meiner Überzeugung jedenfalls)

Wegen der Kärtchen...
ich schau mal, was meinem Asbachuralthirn dazu so einfällt. :-)

Kann aber etwas dauern...

Gruß
Kauz
0 Punkte
Beantwortet von kauz Mitglied (291 Punkte)
Hallo markchili...
hab mal ein wenig 'Vitaburlecitin Geistlich' getankt.... und schon fertig :-)

Alsooo, es gibt 3 Tabellen:
Das erste Blatt hast Du schon.. mit der Spielplangenerierung.

Auf dem DRITTEN Blatt sind die Namen hinterlegt:
In Spalte A ab Zeile 11 stehen die fortlaufenden Nummer der Teilnehmer
In Spalte B werden die Namen eingetragen.

In das ZWEITE Blatt kommt der folgende Code

Option Explicit
Dim i As Integer
Dim AnzStuehle As Integer
Dim AnzTische As Integer
Dim Reihe As Integer
Dim j As Integer
Dim k As Integer
Dim T As Integer
Dim tt As Integer

' Tabelle1 ist das Blatt, auf dem der Spielplan entworfen wird
' Tabelle3 ist das Blatt, auf dem den Nummern die Namen zugeordnet sind
' Tabelle2 ist dieses Blatt
' Da mit diesem Code auf die beiden anderen zugegriffen wird,
' ist es wichtig, das die Reihenfolge der Blätter stimmt.
' Es wird mit dem Index <Sheets(1)> gearbeitet!

Private Sub CommandButton1_Click()
' ------------ Spaltenbreiten ---------------
For i = 0 To 5
ActiveSheet.Columns(i * 3 + 1).ColumnWidth = 1
ActiveSheet.Columns(i * 3 + 2).ColumnWidth = 8
ActiveSheet.Columns(i * 3 + 3).ColumnWidth = 8
Next i
' ----------- Kärtchen löschen ----------------
ActiveSheet.Columns("A:P").ClearContents
ActiveSheet.Columns("A:P").Borders(xlDiagonalDown).LineStyle = xlNone
ActiveSheet.Columns("A:P").Borders(xlDiagonalUp).LineStyle = xlNone
ActiveSheet.Columns("A:P").Borders(xlEdgeLeft).LineStyle = xlNone
ActiveSheet.Columns("A:P").Borders(xlEdgeTop).LineStyle = xlNone
ActiveSheet.Columns("A:P").Borders(xlEdgeBottom).LineStyle = xlNone
ActiveSheet.Columns("A:P").Borders(xlEdgeRight).LineStyle = xlNone
ActiveSheet.Columns("A:P").Borders(xlInsideVertical).LineStyle = xlNone
ActiveSheet.Columns("A:P").Borders(xlInsideHorizontal).LineStyle = xlNone
' -------------------------------------------------
AnzStuehle = Sheets("Tabelle1").Cells(3, 1)
AnzTische = Sheets("Tabelle1").Cells(3, 8)
' -------------- Karten generieren ----------------------
Reihe = 0: T = 0
If (AnzTische * AnzStuehle) Mod 5 <> 0 Then T = 1
For i = 0 To (Int((AnzTische * AnzStuehle) / 5)) - 1 + T
For j = 0 To 4
ActiveSheet.Range(Cells(11 + Reihe * (AnzTische + 4), 2 + j * 3), Cells(13 + AnzTische + Reihe * (AnzTische + 4), 3 + j * 3)).Borders(xlEdgeLeft).Weight = xlThick
ActiveSheet.Range(Cells(11 + Reihe * (AnzTische + 4), 2 + j * 3), Cells(13 + AnzTische + Reihe * (AnzTische + 4), 3 + j * 3)).Borders(xlEdgeTop).Weight = xlThick
ActiveSheet.Range(Cells(11 + Reihe * (AnzTische + 4), 2 + j * 3), Cells(13 + AnzTische + Reihe * (AnzTische + 4), 3 + j * 3)).Borders(xlEdgeBottom).Weight = xlThick
ActiveSheet.Range(Cells(11 + Reihe * (AnzTische + 4), 2 + j * 3), Cells(13 + AnzTische + Reihe * (AnzTische + 4), 3 + j * 3)).Borders(xlEdgeRight).Weight = xlThick
ActiveSheet.Range(Cells(13 + Reihe * (AnzTische + 4), 2 + j * 3), Cells(13 + AnzTische + Reihe * (AnzTische + 4), 3 + j * 3)).Borders(xlInsideVertical).Weight = xlThin
ActiveSheet.Range(Cells(13 + Reihe * (AnzTische + 4), 2 + j * 3), Cells(14 + Reihe * (AnzTische + 4), 3 + j * 3)).Borders(xlInsideHorizontal).Weight = xlThin
ActiveSheet.Cells(13 + Reihe * (AnzTische + 4), 2 + j * 3) = "In Runde:"
ActiveSheet.Cells(13 + Reihe * (AnzTische + 4), 3 + j * 3) = "An Tisch:"
For k = 1 To AnzTische
ActiveSheet.Cells(13 + Reihe * (AnzTische + 4) + k, 2 + j * 3) = k
Next k
Next j
Reihe = Reihe + 1
Next i
' ------------------ Namen eintragen -----------------
T = 1: Reihe = 0
Do
ActiveSheet.Cells(11 + Reihe * (AnzTische + 4), (T Mod 6) * 3 - 1) = Sheets(3).Cells(10 + T + Reihe * 5, 2)
T = T + 1
If T Mod 6 = 0 Then
Reihe = Reihe + 1
T = 1
End If
Loop While T + Reihe * 5 < AnzStuehle * AnzTische + 1
' --------- Tischnummern zuordnen ----------------
For k = 0 To AnzTische - 1 '------Schleife Runden
For i = 1 To AnzTische '--------Schleife Tische
For j = 1 To AnzStuehle ' Schleife Stühle
T = Sheets(1).Cells(10 + j, 1 + i + k * AnzTische)
Reihe = 0: tt = T
Do While tt > 5
tt = tt - 5
Reihe = Reihe + 1
Loop
ActiveSheet.Cells(14 + Reihe * (AnzTische + 4) + k, tt * 3) = i
Next j
Next i
Next k
End Sub


Ich hab nur Stichpunktartig kontrolliert, und hoffe es ist alles richtig auf den Karten.

Achja... den Code in Blatt1 kannst Du noch erweitern:
Füge die Zeilen zwischen den Rautenzeilen noch ein.
Damit werden auf Blatt3 die aktuellen Teilnehmernummern eingetragen.
(Namen bleiben)

ActiveSheet.Cells(1, 1) = AnzStuehle
ActiveSheet.Cells(1, 8) = AnzTische
'############# Ergänzung Teilnehmernummern auf Blatt 3 #############
Sheets(3).Columns("A:A").ClearContents
Sheets(3).Cells(10, 1) = "Nr."
For i = 1 To AnzStuehle * AnzTische
Sheets(3).Cells(10 + i, 1) = i
Next i
'################################################
End Sub


Schau's Dir an...

Viel Spassss beim Kontrollieren :-)

Gruß
Kauz
0 Punkte
Beantwortet von markchili Einsteiger_in (67 Punkte)
Hey Kauz,

funktioniert traumhaft!

Auch die Kartengenereierung klappt perfekt.

Nur eines wundert mich: Bei 7 Spielern pro Tisch und 5 Spieler scheints irgendwo zu hängen.
Stuhl Nummer 6 bleibt imm dersselbe sitzen.
Die Spieler sitzen somit 5mal am gleichen Tisch.

Chair No. 6 26 27 28 29 30 26 27 28 29 30 26 27 28 29 30 26 27 28 29 30 26 27 28 29 30

Kann man das noch korrigieren?

Grüße,
markchili
0 Punkte
Beantwortet von markchili Einsteiger_in (67 Punkte)
Hallo alle,

komisch auch bei 5 / 5 sitzen die ersten 5 Spieler genau an den gleichen Tischen wie die letzten 5 Spieler.
Also Spieler 1 zusammen mit Spieler 21, 2 mit 22 etc.

Irgendwo is noch ein Wurm drin glaube ich ...

Danke für Deinen Einsatz Kauz und Co.!

Grüße,
markchili
0 Punkte
Beantwortet von kauz Mitglied (291 Punkte)
Hallo markchili ..
ich kann mich da nur wiederholen:

Aufteilung 5/5
Entweder 5 Spieler sitzen immer am gleichen Tisch, oder
es gibt Wiederholungen an den Tischen.
Das geht garnicht anders!

Darum ja auch der Vorschlag nach Möglichkeit Stuhlanzahl kleiner Tischanzahl und Tischanzahl ungerade.

Ich würde dann lieber Freiplätze mitlaufen lassen:
Also Statt 5/5 lieber mal mit 5/6 versuchen und an fünf Tischen mit einer Person weniger sitzen.

Sorry, aber mehr ist von meiner Seite nicht drin, und wahrscheinlich auch nicht möglich.

Guß
Kauz
0 Punkte
Beantwortet von markchili Einsteiger_in (67 Punkte)
Hallo Kauz,

auf jeden Fall vielen vielen Dank für die viele Zeit die Du da rein gehängt hast.

Ich werds nochmal durchschauen und dann entscheiden ob das fuer mich so auch nutzbar ist, da ich nicht riskieren möchte das dann doch auf einmal immer diesselbe Gruppe zum
nächsten Tisch wandert.

Eine Frage habe ich nur noch, wäre es möglich das ganze durch Zufall zu lösen?
Klar ist das jeder pro Spiel nur einmal am selben Tisch sitzen darf, aber die Zusammensetzung mit anderen Teilnehmer an den Tischen wäre dann ja relativ gut "zufällig" und somit
abwechselnd. Also sozusagen in der ersten Runde kann er noch an allen Tischen sitzen. In der zweiten Runde dann zufällig an einem anderen (also Auswahl aus allen Tischen ausser
dem an dem er zuerst sass) etc.

Grüße,
markchili
0 Punkte
Beantwortet von kauz Mitglied (291 Punkte)
Hallo markchili,

nun wird es schwierig!

Wenn man das per Zufall lösen möchte, so wäre das bis zur 4. Runde noch zu machen. (Bei fünf Runden)

Wenn also die 4. Runde nach endlosem Ziehen von Zufallszahlen
(keiner weiß, wie häufig eine gezogene Zahl wegen Wiederholung neu gezogen werden muß)
ohne Wiederholungen fertig ist, ist damit die fünfte Runde quasi auch schon festgelegt.
Es gibt dann für jeden nur noch einen möglichen Platz.

Bitte nicht falsch verstehen:
Ich will hier nicht 'klugsch...', und auch nicht mein Prog als das 'non plus Ultra' hinstellen.

Nach mehreren Stunden der manuellen Hin und Herschieberei ist das meine Überzeugung. (AW45 und AW33)

Wenn jemand etwas anderes herausfindet, dann sofort raus damit... will gerne dazulernen!

Grüße in die Runde,
Kauz
0 Punkte
Beantwortet von kauz Mitglied (291 Punkte)
Hallo,

hab mal eine Beispieltabelle mit Erklärungen hochgeladen:

www.fileuploadx.de/138383

Vielleicht wird dadurch die Problematik etwas deutlicher.

Gruß
Kauz
...