PDA

Vollständige Version anzeigen : Turniermannschaften sortieren


John_Ross
07.05.2009, 08:16
Hallo zusammen,

Ich hab wieder mal ein kniffliges Problem, von dem ich kaum glaube, dass es gelöst werden könnte.
Doch will ich es zumindestens nicht unversucht lassen.

Ich habe eine Turnierauswertung für eine Meisterschaft erstellt mit 4 Reitertabellen, die jeweils miteinander verknüpft sind.
Im 1. Reiter befindet sich die Namensliste aller Spieler, im 2. die Mannschaftswertung mit den Ergebnissen aller Spieler einer Mannschaft, im 3. die Gesamtwertungs-Rangliste, wobei alle Mannschaften mit ihren Spielern in einer Gesamtansicht angeführt sind und im letzten Reiter die Einzel-Rangliste.

Worums mir jetzt vor allem geht:
Ich möchte die Gesamtwertungsrangliste mit allen Mannschaften (3. Reiter) so gereiht haben, dass der 1. Platz links oben beginnt, der 2. rechts nebenan kommt, der 3. wieder rechts vom 2., der 4. links nach unten - unterhalb vom 1., der 5. rechts neben dem linken und so weiter, bis alle Mannschaften so nach diesem Schema gereiht sind.

Das Problem ist, dass es nicht automatisch geht. Ich kann nur die einzelnen Mannschaften mit ihren Spielern nur vordefiniert platzieren, wenn das Endergebnis noch nicht bekannt ist. Da kommt es leicht vor, dass die spätere Siegermannschaft in der Reihung als 4. platziert wurde und danach auf den 1. Platz links oben verschoben werden muss, d.h. alle anderen auch je nach Rangordnung.
Das muss natürlich manuell erfolgen, denn ein Makro, bzw. VSB-Script ist dazu wohl nur schwerlich möglich oder gar unmöglich.

Was meint ihr dazu?...

In der Einzelwertungsrangliste möchte ich auch eine automatische Sortierung, die läuft, sobald man dAS Blatt öffnet, einbauen per VBA, kenn mich aber damit nicht richtig aus.
Sortiert werden soll zunächst das Gesamtergebnis jeden Spielers (absteigend), wenn gleich, dann auch absteigend das Abräumen (Abr.). Wenn wieder gleich, dann Anzahl geringerer Fehlwürfe - aufsteigend (FW).
Alles auf 2009. Das Jahr 2008 dient bloß als Vergleich zum Vorjahr und soll bei der Sortierung natürlich mit dem betreffenden Speiler "mitgehen".

Ich hoffe, es kann mir jemand helfen, zumindestens bei der Sortierung in der Einzelwertung. Für einen Rat, wie ich die Reihung in der Gesamtwertung so angehen soll, dass diese selbständig erfolgt, wär ich auch dankbar.

Anbei auch eine Musterdatei

Greetz, John_Ross

ebs17
10.05.2009, 10:27
In den Ergebnislisten ließen sich die Namen und Ergebnisse per VBA gezielt platzieren, wenn als Grundlage eine vernünftige Tabelle (1 Titelzeile mit Spaltennamen, in weiteren Zeilen die Daten) mit allen Daten zur Verfügung steht, auf die man per SQL zugreifen kann.

Du müsstest zusätzlich trennen zwischen Eingabemasken und Ergebnisliste (Ausgabe).

John_Ross
10.05.2009, 16:34
danke für deinen freundlichen rat, eberhard.
sql ist mir leider zu hoch, bin bloß anfänger ohne tiefergehende kenntnisse.

wäre vielleicht nett, wenn man mir erklären würde anhand eines einfachen beispiels, wie man so eine "vernünftige tabelle" aufbaut und trennung zwischen eingabemasken und ergebnislisten.

greetz, john_ross

ebs17
10.05.2009, 17:29
Eine einfache Tabelle wäre das Gleiche wie das Arbeitsblatt "Namensliste" mit den Ergebnissen für 2009, beide aber mit genau einer Zeile für Spaltenbezeichnungen.

Dass Du etwas Unterstützung zu meinem Vorschlag, der mir selber auch noch nicht hundertprozentig klar ist, wird vorausgesetzt. Vorab habe ich einige Fragen zum Verständnis (bin bloß Hobbykegler, mit der Zählung und dem Ablauf eines Wettkampfes aber nicht vertraut):

- In der Namensliste stehen (bis) 6 Personen, in der Mannschaftswertung stehen nur 4.
- Jeder Wettkämpfer spielt auf 4 (?) Bahnen, wo jeweils das Teilergebnis erfasst wird?
- Wo erfolgt die Eingabe der Ergebnisse?

John_Ross
10.05.2009, 18:30
in der namensliste stehen deshalb 6 personen, weil 2 davon als ersatz nominiert sind. unterbricht ein spieler nach z.b. 30 würfen (120 würfe gibt es pro spieler) spielt der ersatz die restlichen 90 würfe weiter. in diesem fall werden spieler und dessen ersatz in der namensliste nachträglich zusammengeschrieben, also z.b. mayer/huber

es wird auf 4 bahnen gespielt, jeder wechselt nach 30 würfen (15 volle und 15 abräumen) die bahn.
eingabe der ergebnisse erfolgt in der mannschaftswertung. von dort kommts automatisch zur einzelwertung und gesamtwertung.

mein problem ist, dass ich die reihung in der gesamtwertung immer zum schluß korrigieren muß, wenn die 4. mannschaft z.b. erster wird und ich sie oben links stehen haben möchte.

ebs17
11.05.2009, 20:52
Siehe mal, ob Du mit der angehängten Datei klarkommst.

Hinweise:

(1) Ausgangspunkte für die Berechnungen sind die Sheets "Namensliste" (geänderte Spaltenbezeichnungen!) und "Leistung2009" (neu + meine Eingabemaske). Beide sind über die Spalten "Zähler" verknüpft. Es gibt Makros, womit Du Testdaten erzeugen und auch wieder entfernen kannst.

(2) Die Ergebnisübertragung inklusive der gewünschten Sortierung in die Ausgabelisten erfolgt komplett über VBA (incl. ADODB und SQL).

(3) Das Sheet "Mannschaftswertung" habe ich nicht angefasst. Du könntest es als Eingabemaske benutzen, um die Daten in "Leistung2009" schrittweise anzulegen.

ebs17
11.05.2009, 23:44
Ich habe gerade noch gesehen, dass im Modul die folgende Zeile auskommentiert ist. Das Hochkomma muss natürlich weg.
'On Error GoTo Fehler

' so ist es gedacht
On Error GoTo Fehler

John_Ross
14.05.2009, 12:12
Hey Eberhard,

Vorweg t´schuldige, dass ich mich nicht gleich meldete. Hatte in der Hackn jede Menge Stress in den letzten Tagen, auch heute, seufz....

Sah mir eben dein Werk an und testete es gleich.
Was soll ich dazu sagen?.... Einfach GENIAL!

Mann... das hab ich mir in meinen kühnsten Träumen nicht vorgestellt, du bist ein Codemeister, wie es (zumindestens für mich) keinen Zweiten gibt.
Mit dem Code komm ich leider nicht klar, hilft nur abschauen. Sowas von Fachinesisch versteht nicht mal ein eingeborener Chink.

Respekt, Respekt... wie lernt man denn sowas? Mit der Büffelei hab ichs nicht mehr so, ist eh schon beinahe ein halbes jahrhundert her, dass ich pauken musste.
Die Jugend von heute kann man nur mehr bewundern und die angeblich "weisen Alten" san nix als deppat.. seufz...

Ein herzliches Dankschön für deine Arbeit und echt tatkräftige Hilfe, Kumpel. Wollte, i könnt mi mal revanchieren. Mit meinem Spatzenhirn gings wohl schwerlich, aber ein Porsche ist dir sicher, sollt i im Lotto nen Volltreffer landen!

Greetz, Mandy

John_Ross
14.05.2009, 17:46
wie ich mir abends alles genauer ansah, bin ich beeindruckt von der mühe, die du dir gegeben hast. echt viel arbeit mit dem codeschnipseln.

eine klitzekleine frag hätte ich aber noch:
wie muss ich den code verändern, wenn ich eine mannschaft wegnehm, bzw. eine oder mehrere dazugeb?

ich finde im modul nichts, das darauf hinweist.

kannst mir bitte noch darin helfen?

vielen dank!

ebs17
14.05.2009, 18:24
Mannschaften und Spieler sind im Sheet "Namensliste" zu ergänzen bzw. zu ersetzen, ebenso im Sheet "Leistung2009" (4 Zeilen pro Spieler = 1 Zeile pro Bahn).
Dabei muss der Zählerwert für einen Spieler identisch sein (in beiden Sheets übereinstimmen).

Im Code selber sind nur Korrekturen notwendig, wenn sich die Anzahl der Mannschaften ändert:
' Formel wiederherstellen
For i = 7 To 34
oSh.Range("I" & i).Formula = _
"=IF(F" & i & "=L" & i & ",$O$8,IF(F" & i & ">L" & i & ",$O$9,$O$7))"
Next
Dies stellt die Formel zur Anzeige des Fingers wieder her. Falls sich die Anzahl der Spieler ändert, müsste die letzte Zeile angepasst werden.
' Adressen Mannschaftsnamen im Sheet Gesamtwertung Rangliste
vPos = Array(6, 1, 6, 7, 6, 13, 20, 1, 20, 7, 20, 13, 34, 1)
D.h. die Mannschaftsnamen befinden sich in den Zellen (6,1), (6,7), (6,13), (20,1), ... Eine umständliche Ermittlung der Adressen habe ich mir erspart, sondern die Werte paarweise im Array abgelegt. Falls sich also die Mannschaftszahl verändert, müssten entsprechende Wertepaare ergänzt bzw. verworfen werden.
Die Zieladressen der anderen Angaben (Mannschaftsergebnis, Liste der Spieler) werden durch den Code relativ ermittelt und verwendet.

Ich hoffe, das war verständlich.

John_Ross
14.05.2009, 18:53
soviel ich verstanden habe, muss man den code lediglich dann verändern, wenn man mannschaften dazu gibt oder weg nimmt. auch bei der anzahl der spieler (im moment sind es 4, bleiben wohl auch immer 4) muß der finger (??) angepasst werden.

naja, einen fingerhut hab ich wenigstens zur hand :mrcool:

beim mannschaftscode würde ich bei 8 mannschaften das paar 34,7 dazu geben, richtig?

nimmt man eine weg und sind es nur 6, dann lautet der letzte code 20,13.

wie aber verändert man den code, wenn statt 4 spieler einer mannschaft 6 eingesetzt werden? also jede mannschaft mit 6 spielern?

und kann man das sheet "leistung2009" auch umbenennen? müsste sicher auch im code korrigiert werden, sonst läufts ins leere.

recht scheenen dank noch, meister, hoffe, hab dir den abend nicht mit meinen dämlichen fragen verdorben... :D

greetz, mandy

ebs17
14.05.2009, 19:45
beim mannschaftscode würde ich bei 8 mannschaften das paar 34,7 dazu geben, richtig?
nimmt man eine weg und sind es nur 6, dann lautet der letzte code 20,13.
Genau. Wobei sich bei 8 Mannschaften auch die Anzahl der Spieler (8x4) ändert.

Der Name des Sheets bzgl. Umbenennung steckt hier drin:
sSQLErg = "SELECT L.Zähler, Sum(L.Volle) AS Volle2009," & _
" Sum(L.Abräumen) AS Abräumen2009, Sum(L.Gesamt) AS Gesamt2009," & _
" Sum(L.FW) AS FW2009 FROM [Leistung2009$] L" & _
" GROUP BY L.Zähler, L.Name HAVING Sum(L.Gesamt) Is Not Null"
Zusätzlich müsstest Du im VBA-Editor in den Eigenschaften den Namen ändern (siehe Bild).

Bei Änderung der Spielerzahl pro Mannschaft müsstest Du das Sheet "Gesamtwertung Rangliste" ändern. Dadurch ergeben sich vertikale Verschiebungen ab der zweiten Blockreihe. Das müsste in den Zieladressen im Array wie oben besprochen sowie hier berücksichtigt werden:
Do While Not oRst.EOF
oSh.Cells(vPos(i) + 9, vPos(i + 1) + 1) = oRst(1) ' +2 Spieler: oSh.Cells(vPos(i) + 11, ...
oSh.Cells(vPos(i) + 9, vPos(i + 1) + 2) = oRst(2)
oSh.Cells(vPos(i) + 9, vPos(i + 1) + 3) = oRst(3)
oSh.Cells(vPos(i) + 9, vPos(i + 1) + 4) = oRst(4)
i = i + 2
oRst.MoveNext
Loop

Insgesamt ist zu bemerken, dass die Ausgabe sehr an Deine (nicht sehr ausgabefreundlichen) Masken angepasst ist. Also bei Änderungen sehr vorsichtig sein oder aber die Ausgabe einfacher gestalten oder aber die Sheets für die Ausgabe jeweils komplett neu erstellen (inkl. Rahmen, Farben, Formeln usw.). Letzteres wäre etwas komplexer und für einen bevorstehenden Wettkampf etwas overdressed.

John_Ross
14.05.2009, 20:09
herzlichen dank für die abschliessende hilfe!

nun kenn ich mich einigermassen aus, um vorsichtig ohne eingehakte hilfe über die strassn zu gehn ;)

wenn sich bei 8 mannschaften die anzahl der spieler auf 32 erhöht, muss man die erhöhte spieler(anzahl) auch irgendwo im code eintragen, oder auch verringern, je nachdem, ob mit weniger oder mehr mannschaften gespielt wird?

wenn ja, wo ist dann bitte die stelle im code? hülfe, bin noch nachtblind...

salü, mandy

ebs17
14.05.2009, 20:41
erhöhte spieler(anzahl) auch irgendwo im code eintragen
Nur für die Ausgabe (#10, erster Codeteil).

Die eigentlichen Berechnungen finden in den SQL-Anweisungen statt. Denen ist schnuppe, ob das 28 oder vlt. 28.000 sind, sofern die Eingangsdaten sauber strukturiert sind.

Der Änderungsbedarf reduziert sich somit auf die Platzierung der Ergebnisse.

John_Ross
14.05.2009, 20:52
nochmals herzlichen dank, meister!

auch für deine geduld bei mir begriffsstutzigen esel... ;)

greetz, mandy