Seite 1 von 2
Re: Sortierung Deckserie (Schießsport)
Verfasst: Mo, 20.03.2017 10:00
von TrueColor
Nach welchen Gesichtspunkten willst du die Schützen sortieren? Durchschnittliche Punkte pro Schuss? Summe aller Punkte?
Ansonsten wäre mein Vorschlag, alle erstmal so eintragen:
Startnummer | Name | Platzierung (berechnet) | Gesamtwertung (berechnet) | [einzelne Wertungen]
Das Sortieren dann per Macro, welches an einen Button gebunden ist. Für jeden Schützen innerhalb einer Zeile die Einzelwertungen sortieren (ich bilde mir ein, da gabs letztens hier im Macro-Forum den Bubblesort als Code zu lesen) und dann die Schützen (dafür sollte dann auch die Verwendung des Dispatchers ausreichen.
Oder:
Wenn du am Ende auf die (sortierte) Aufschlüsselung der Einzelwertungen verzichten kannst:
Erfassung grad hintereinander weg nach:
Startnummer | Name | Durchgang | Einzelwertung
Und die Auswertung kannst du dann mittels SUMMENPRODUKT() (siehe z.B. unter:
http://www.online-excel.de/excel/singsel.php?f=53) oder Pivot-Tabelle (damit habe ich selbst noch nicht gearbeitet) fahren und könntest als Ergebnis sowas herausbekommen:
Platzierung | Startnummer | Name | Gesamtwertung
Das Ganze dann herkömmlich sortieren.
Re: Sortierung Deckserie (Schießsport)
Verfasst: Mo, 20.03.2017 10:15
von Karolus
Hallo
Code: Alles auswählen
def sort_schuetzenliste(*_):
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.CurrentSelection
data = sel.DataArray
out = []
for row in data:
tmp = []
tmp.append(row[0])
tmp.extend(sorted(row[1:],
key=lambda x: x or 0,
reverse=True))
out.append(tuple(tmp))
sel.DataArray = tuple(sorted(out,
reverse=True,
key=lambda x: [item or 0 for item in x[1:]]))
siehe angehängtes Dokument
Re: Sortierung Deckserie (Schießsport)
Verfasst: Mo, 20.03.2017 10:24
von Stephan
Karolus hat geschrieben: Mo, 20.03.2017 10:15
Hallo
Code: Alles auswählen
def sort_schuetzenliste(*_):
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.CurrentSelection
data = sel.DataArray
out = []
for row in data:
tmp = []
tmp.append(row[0])
tmp.extend(sorted(row[1:],
key=lambda x: x or 0,
reverse=True))
out.append(tuple(tmp))
sel.DataArray = tuple(sorted(out,
reverse=True,
key=lambda x: [item or 0 for item in x[1:]]))
siehe angehängtes Dokument Schützenfest.ods
sehr schöne Lösung!
Gruß
Stephan
Re: Sortierung Deckserie (Schießsport)
Verfasst: Mo, 20.03.2017 11:04
von TrueColor
Hallo Karolus,
Karolus hat geschrieben: Mo, 20.03.2017 10:15
könntest du das mal bitte erläutern oder zu einer guten Erklärung linken (für jmd., der der eigentlich keine Ahnung von Python hat? Was macht das? Der restliche Code ist ja für mich gut verständlich.
Danke!
Re: Sortierung Deckserie (Schießsport)
Verfasst: Mo, 20.03.2017 11:09
von mikeleb
Hallo,
und noch eine Formellösung ...
Re: Sortierung Deckserie (Schießsport)
Verfasst: Mo, 20.03.2017 12:33
von Karolus
TrueColor hat geschrieben: Mo, 20.03.2017 11:04
Hallo Karolus,
Karolus hat geschrieben: Mo, 20.03.2017 10:15
könntest du das mal bitte erläutern oder zu einer guten Erklärung linken (für jmd., der der eigentlich keine Ahnung von Python hat? Was macht das? Der restliche Code ist ja für mich gut verständlich.
Danke!
Oha… womit fang ich jetzt an?
das DatenArray enhält im konkreten Fall sowohl Zahlenwerte als auch Text, ( !
die leeren Zellen enthalten einen Leerstring "" !)
python muss zum sortieren die jeweiligen Inhalte vergleichen (a grösser b), kann das aber nur mit
vergleichbaren Typen, und würde dann beim Vergleich Zahl|Text mit einem Fehler abbrechen, daher der Ausdruck
x or 0 der im Fall von x=="" eben 0*** statt dem Leerstring als Vergleichswert einsetzt.
lambda kreiert eine anonyme Funktion.
ist dasselbe wie eine explizite Funktion:
in Verbindung mit:
***
or verhält sich in python etwas anders als in Basic, und liefert den ersten Ausdruck zurück der logisch Wahr ist, falls kein Ausdruck Wahr ist den letzten.
https://docs.python.org/3.5/howto/sorti ... ght=sorted
https://docs.python.org/3.5/howto/funct ... expression
Re: Sortierung Deckserie (Schießsport)
Verfasst: Mo, 20.03.2017 16:34
von TrueColor
Ah, jetzt wird's klar, danke dir!
Scheint 'ne gute Doku zu sein, was du da verlinkt hast, recht gut verständlich.
Re: Sortierung Deckserie (Schießsport)
Verfasst: Mo, 20.03.2017 18:46
von Karolus
Hallo
Der Ansatz von oben bereinigt von hässlichen
lambdas und anderen Wiederholungen.
Dafür ist das in der Form nicht mehr kompatibel mit AOO und LO < 5.1 wegen der neuen
slice-Syntax für
Teil-Zellbereiche (#12),
und des Verzichts auf explizite tuple-Umwandlung (#13ff)
Code: Alles auswählen
from functools import partial
def compare(k):
if isinstance(k, tuple):
return [compare(item) for item in k[1:]]
return k or 0
def sort_schuetzenliste2(*_):
sort = partial(sorted, reverse=True, key=compare)
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.CurrentSelection
series = sel[ : ,1:]
data = [sort(row) for row in series.DataArray ]
series.DataArray = data
sel.DataArray = sort(sel.DataArray)
Re: Sortierung Deckserie (Schießsport)
Verfasst: Mo, 20.03.2017 20:19
von CROW1973
Soooo

Jetzt bin ich registriert.
Hab die Datei jetzt noch auf 250 Zeilen erweitert sollten mal mehr als 4 Teilnehmer dabei sein

Jetzt muss ich noch nach dem Namen noch einen Vereinsnamen rein basteln, aber das schaffe ich auch noch irgendwie.
*Edit*
Verein ist nun auch dabei

Möchte euch mein Ergebnis natürlich nicht vorenthalten!
Re: Sortierung Deckserie (Schießsport)
Verfasst: Di, 21.03.2017 09:34
von CROW1973
Hallo nochmals
Ich muss leider nochmals lästig sein, sorry dafür!!
Ich habe das File nun halbwegs fertig, aber auch einen Fehler gefunden
Sobald 2 Schützen das gleich Ergebnis haben (z.B. beide Schützen haben 2x 60 Punkte geschossen), wird mir nur Schütze 1 angezeigt und bei Schütze 2 ist ein Fehler.
Ich habe es mal abgespeichert und hier angehängt
.
Desweiteren würde ich es auch gerne so haben, wenn beide punktgleich sind, dass sie auch den selben Platz haben.
Also
Platz 1 60 60
Platz 2 60 40
Platz 3 59 59
Platz 3 59 59
Platz 5 58 30
Platz 6 57 50
Platz 6 57 50
Platz 8 56 50
usw
Re: Sortierung Deckserie (Schießsport)
Verfasst: Di, 21.03.2017 11:04
von Karolus
Hallo
Dir wurde bereits eine Lösung vorgeschlagen, die "ohne" diesen Fehler daherkommt…
Re: Sortierung Deckserie (Schießsport)
Verfasst: Di, 21.03.2017 12:21
von CROW1973
Hallo Karolus
Ich habe die Methode von mikeleb genommen, da es genau das ist, was ich gesucht habe.
Jetzt habe ich gestern Stunden dazu verbracht, es so weit zu bringen, wie meine zuletzt angehängte Datei.
Ich habe deine Version auch ausprobiert, aber im Excel wird mir da kein Button angezeigt. Nur ich verwende Open Office im Verein, alle anderen verwenden Excel.
Das von dir verstehe ich leider überhaupt nicht. Wo füge ich das ein usw usw
Das von mikeleb verstehe ich halbweg und es funktioniert ja jetzt tadelos (in Open Office und Excel), bis auf die "Kleinigkeit".
Wäre toll, wenn ihr mir hier noch für den letzten Schritt weiterhelfen könntet. Wenn nicht, muss ich leider ein Auswertungsprogramm um 250€ kaufen.
Sorry wenn ich mich so blöd anstelle, aber das ist absolut nicht mein Gebiet
lg
Tommy
Re: Sortierung Deckserie (Schießsport)
Verfasst: Di, 21.03.2017 12:36
von echo
Desweiteren würde ich es auch gerne so haben, wenn beide punktgleich sind, dass sie auch den selben Platz haben.
Hallo
In
sortiert.$N$2:$N$250 steht als Rang 1;1;3;4.....usw 2 fehlt, obwohl Vergleich() in deiner Formel danach sucht
Die beiden Zeilen 1;1; unterscheiden sich nicht, daher kannst du auch nicht nach beiden Zeilen suchen
Vorschlag: in Sortiert!N2
ersetze
=RANG(M2;$M$2:$M$250) durch =RANG(M2;$M$2:$M$250)
+ZEILE()/1000 (Kannst die Nachkommastellen ja ausblenden)
Runter kopieren, jetzt unterscheiden sich die Einträge ohne den Rang zu verändern und du kannst danach suchen
in Rangliste! B11 den Vergleich() ein wenig erweitert, das wars
=VERSCHIEBUNG(sortiert.$A$1;VERGLEICH(
KKLEINSTE(sortiert.$N$2:$N$250;$A11);sortiert.$N$2:$N$250;0);SPALTE()-2)
in Excel heißt die Funktion =VERSCHIEBUNG() =BEREICH.VERSCHIEBEN(), daher würde ich INDEX() auch der VERSCHIEBUNG() vorziehen
=INDEX(sortiert.$A$2:$L$250;VERGLEICH(KKLEINSTE(sortiert.$N$2:$N$250;$A11);sortiert.$N$2:$N$250;0);SPALTE(A1))
LG Holger
Re: Sortierung Deckserie (Schießsport)
Verfasst: Di, 21.03.2017 12:39
von CROW1973
Hallo echo
Danke! Ich werde mal versuchen das umzusetzen!
lg
Re: Sortierung Deckserie (Schießsport)
Verfasst: Di, 21.03.2017 13:00
von Karolus
Hallo
Mit Excel-kompatibilität kann ich dir nicht dienen, der Aufwand steht für mich in keinem vernünftigen Verhältnis zum "Aufwand" ein paar Vereinskollegen davon zu überzeugen
kostenlos Libre|Apache -office zu installieren.
Wenn nicht, muss ich leider ein Auswertungsprogramm um 250€ kaufen.
Wow - Ein stolzer Preis für eine derart triviale Aufgabe!