es ist sehr gut ein so ausgefeilten Prüfprogramm zu nutzen.
Frage: In der Datei "Tische prüfen.xlsm" sind die Ergebnisse meines ersten Versuchs berücksichtigt, der offensichtlich "Mist" war. Ist es möglich, den Test auch für den zweiten Versuch durchzuführen? (Beitrag #39)
warum die Prüfung? Es gab in der Anfrage zwei Kriterien.
1. An einem Tisch darf keiner aus der gleichen Mannschaft oder dem zweiten Team sitzen. 2. In Runde 1 bis 4 darf sollte jeder Spieler immer andere Leute am Tisch haben.
Edgar hat doch im Laufe der Zeit geschrieben, dass sein Programm beide Bedingungen nicht erfüllt (weniger als kaum eine). In Fenneks zweitem Versuch sieht man sofort, dass ab 8 Mannschaften -vorher geht es nicht- beide Bedingungen erfüllt sind.
Lieber eine einfache richtige Lösung, als eine komplizierte falsche.
@Edgar: Von zufällig war in der Anfrage keine Rede.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
22.07.2016, 10:40 (Dieser Beitrag wurde zuletzt bearbeitet: 22.07.2016, 10:47 von BoskoBiati.)
Hallo ego,
Zitat:In Runde 1 bis 4 darf sollte jeder Spieler immer andere Leute am Tisch haben.
kein muß, also erfüllt.
Kein Spieler aus gleicher Mannschaft (1+2) ist zumindest nach dem kompletten Zufallsprinzip, kaum realisierbar (mit einfachen Mitteln).
Machbar ist folgendes:
1. Die Spieler werden blockweise an die Tische verteilt. 2. Erste und zweite Mannschaft gehören zum gleichen Block.
Dann könnte man nach dem Zufallsprinzip die Blöcke auslosen. Alerdings könnte es dann, bei einer nicht durch 4 teilbaren Zahl von Mannschaften, dazu kommen, dass zwei Spieler einer Mannschaft am gleichen Tisch landen. Könnte man mit etwas Programmieraufwand aber auch lösen.
Hier mal ein Ansatz:
Code:
Option Explicit
Sub auslosen() Dim arrPlatz1 As Variant Dim arrPlatz2 As Variant Dim arrPlatz3 As Variant Dim arrPlatz4 As Variant Dim loZahl2 As Long Dim LoAnz As Long Dim loA As Long Dim loB As Long Dim loRunde Dim vx1 Dim vx2 Dim vx3 Dim vx4 LoAnz = InputBox("Wieviel Mannschaften?") * 1
Range("I:BA").ClearContents For loRunde = 1 To 4 loB = 0 Randomize Do loZahl2 = Application.WorksheetFunction.RandBetween(1, LoAnz) If InStr(arrPlatz1, Format(loZahl2, "000")) = 0 Then arrPlatz1 = Format(loZahl2, "000") & " " & arrPlatz1 loB = loB + 1 End If Loop Until loB > LoAnz - 1 loB = 0 Randomize Do loZahl2 = Application.WorksheetFunction.RandBetween(LoAnz + 1, LoAnz * 2) If InStr(arrPlatz2, Format(loZahl2, "000")) = 0 Then arrPlatz2 = Format(loZahl2, "000") & " " & arrPlatz2 loB = loB + 1 End If Loop Until loB > LoAnz - 1 loB = 0 Randomize Do loZahl2 = Application.WorksheetFunction.RandBetween(LoAnz * 2 + 1, LoAnz * 3) If InStr(arrPlatz3, Format(loZahl2, "000")) = 0 Then arrPlatz3 = Format(loZahl2, "000") & " " & arrPlatz3 loB = loB + 1 End If Loop Until loB > LoAnz - 1 loB = 0 Randomize Do loZahl2 = Application.WorksheetFunction.RandBetween(LoAnz * 3 + 1, LoAnz * 4) If InStr(arrPlatz4, Format(loZahl2, "000")) = 0 Then arrPlatz4 = Format(loZahl2, "000") & " " & arrPlatz4 loB = loB + 1 End If Loop Until loB > LoAnz - 1
(18.07.2016, 16:07)Rabe79 schrieb: Folgende Kriterien sollen berücksichtigt werden.
1.An einem Tisch darf keiner aus der gleichen Mannschaft oder dem zweiten Team sitzen. 2.In Runde 1 bis 4 darf sollte jeder Spieler immer andere Leute am Tisch haben. Man sollte also wenn man in Runde 1 gegen Max Mustermann gespielt hat dies nicht wieder in Runde 2,3 oder 4 tun.
Hallo Edgar,
nichts für ungut.
Aber hier die Kriterien einschliessliche der Erkärung der zweiten.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
@Edgar :verstehe ich das nun richtig das es bis jetzt reines glück war das kein Spieler aus dem gleich team am tisch sitzt ?
Das das mit den zweiten mannschaften nicht erfüllt wird, und das man in vier runden nicht gegen einen spielen darf gegen den ich schonmal gespielt habe war mir klar.
in meiner Prüfdatei waren noch ein paar kleine Fehler, ich habe sie korrigiert.
@ Edgar, dein Prüfergebnis sieht jetzt viel besser aus, Sorry, war ein dummer Fehler. Der ID-Code ist bei dir 2stellig, verglichen habe ich aber mit Left(AC,1) = 1stellig !! Das jetzige Ergebnis dürfte wirklich echt sein. Sieht sehr gut aus .... Deinen Hinweis habe ich korrigiert auf Range("J:AZ") Klappt trotzdem nicht in 2003
@ Fennek, für dich habe ich etwas zum Speilen, ein Programm zum Auto-Ausfüllen mit Versatz. du kannst ja mal selbst schauen ob es einen Versatz gibt der zu einem guten Ergebnis führt ???
@ Rabe, im neuen Beispiel habe ich in Spalte L von Edgars Prüfung markiert was ich meine !!
In der 1. Prüfung ist kein doppelter Speiler zu sehen, Edgars Makro laeuft diesbezüglich sehr gut! Die Tücke steckt aber im Detail, wenn man alle Speiler über alle Runden miteinander vergleicht !! Den Zusammenhang das es dann doch doppelte gibt ist aus Edgars Teilnehmer Tabelle nicht ersichtlich. Bei soviel Namen, soviel Tischen und über 4 Runden kann man diese Daten einfach nicht sehen. Nur mit einem ID-Code, eine Kurzform für jeden Spieler, erkennt man die Prüfung!
In Spalte L steht der ID-Code "AS1" für "alte Saecke" Spieler 1 = Gerhard Pfeifer Er spielt in der 1. Runde gegen den Spieler Code "Te2", und in der 3. Runde, in Zeile 19 "Te2" (gleicher Spieler)
Der ID-Code "AS2" für "alte Saecke" Spieler 2 = Ingo Mergener Er spielt in der 1. Runde gegen den Spieler"Tp3", und in der 4. Runde, gegen "Tp2" = Team "Tp" Er spielt in der 2. Runde gegen den Spieler"Tn4", und in der 3. Runde, gegen "Tn3" = Team "Tn" Hier wird also gleich zweimal gegen daselbe Team gespielt, nur gegen andere Team Spieler!
Diesen Zusammenhang kann man aus einer Teilnehmer Liste nicht erkennen, zu viele Daten um da durchblicken zu konnen. Mit dem Prüfprogramm über ID-Code ist das aber sofort ersichtlich.
Mein Programm ist ja keine Abwertung von Edgar seiner Arbeit. Ich sehe es eher als Möglichkeit sich selbst -Übersicht zu verschaffen-, und "doppelte" dann Manuell, von Hand zu korrigieren
Solange es kein Makro gibt das diese Aufgabe selbstaendig lösen kann bleibt nur dieser Weg durch Übersicht des IST Zustandes das ganze manuell nachbearbeiten. Das war meine Idee. Den Gedanken es direkt durch ein Makro zu lösen haben ich noch nicht aufgegeben.
Brauche aber mal eine kleine "Denkpause". Bearbeite zwischendurch einen anderen Thread.
Wenn es die genial einfache Lösung von Fennek nicht gäbe (was erklärt warum man das Problem im Internet nicht findet) , könnte der Ansatz von Edgar sehr erfolgsversprechend sein.
Da mit seinem Programm in sehr kurzer Zeit sehr viele richtige Lösungen für eine Runde gefunden werden, in denen jeder nicht gegen Spieler der gleichen Mannschaft spielt, wäre es einen Versuch wert.
Kriterium 1 könnte man erfüllen, indem man nicht auf Mannschaften, sondern auf Vereine prüft.
nicht "lozahl = Int((lozahl2 - 1) / 4) + 1" sondern "lozahl = Int((lozahl2 - 1) / 8) + 1" (bei riichtiger Aufstellung der Spielerliste) Kriterium 2, indem man zusätzlich eine Liste mit Gegenspielern verwaltet und bei den hinteren Auslosung prüft.
Da zu erwarten ist, dass über Zufallszahlen nicht immer alle Bedingungen erfüllt sind, muss man Auslosungen verwerfen und wiederholen können.
Ob mit diesem Ansatz aber in Excel (langsam) in angemessener Zeit eine Lösung gefunden werden kann, kann ich nicht sagen.
Auf jeden Fall sollte das Programm eine Meldung ausgeben wenn keine gültige Lösung gefunden wurde.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Ich verstehe nicht warum du Fennek Vorschläge machst seine Lösung zu überarbeiten.
Fenneks Lösung ist einfach, einfach richtig und daher einfach genial.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.