Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1848to1852
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Rank in mehrdimensionalem array

Rank in mehrdimensionalem array
08.10.2021 20:56:50
BuddyHoli
Hallo ihr Götter,
Ich habe noch einmal eine Frage zu Ranks.
Stellt euch einen Array dieser Bauart vor:

Dim PointTable() as Variant
players = 5
playdays= 34
ReDim PointTable (1 to players, 0 to playdays)
In der ersten "Spalte" des Arrays stehen die Namen der Spieler.
In den Spalten playdays 1 bis 34 stehen die Punkte, die jeder Spieler pro Spieltag erzielt haben.
Im Prinzip würde ich nun gerne per VBA die jeweils größte Punktzahl pro Spieltag ermitteln und dann allen Spielern, die diese Punktzahl erzielt haben, in einen ähnlich aufgebauten Array PlayerStats(1 to players, 0 to NumberOfStats) den Wert einer Statistik um 1 hochsetzen, zb

PlayerStats(SpielerMitGrössterPunktzahl, 5) = PlayerStats(SpielerMitGrössterPunktzahl, 5) + 1
Nur wie ermittle ich 1) für höchste Punktzahl je Spieltag und wie finde ich alle Spieler mit dieser Punktzahl?
Erneut besten Dank

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Zeit für die nächste Stufe
08.10.2021 21:41:24
Yal
Hallo Buddy,
da es Dir auch darum geht etwas zu lernen: diese Art von Aufgaben wird am besten mit Object und Collections.
Im Grund genommen kennst Du schon welche davon: "Worksheets" ist die Collection aller Objekte "Worksheet".
So wie man den Komfort geniesst, solche Konstrukt vom Excel zu bekommen, so musst Du deine Daten organisieren, sodass Du bequem damit umgehen kannst.
Daher wird es geben:
_ eine Klasse "Players": nur eine einzige Objekt. Beinhaltet die Collection, die die Objekte Player sammelt, Die Funktionen Add und Count. Aber auch die Function "GetTopPlayer"
_ eine Klasse "Player": ein Objekt pro Player. Beinhaltet die Eigenschaft "Name" (Key), die Collection "Playdays" und die Funktionen "Punktzahl" und Playday_add
_ eine Klasse "Playday": beinhaltet die Eigenschaft "Datum" (Key) und Punktzahl
Ein Teil der Klasse clsPlayers sieht dann so aus:

Private Players As Collection
Private Sub Class_Initialize()
Set Players = New Collection
End Sub
Public Property Get Count() As Long
Count = Players.Count
End Property
Public Function Add(PlayerName As String) As clsPlayer
Dim P As clsPlayer
On Error Resume Next
Set P = Players(PlayerName)
If P Is Nothing Then
Set P = New clsPlayer
P.Name = PlayerName
Players.Add P, PlayerName
Set Add = P
End If
End Function
Public Function GetTopPlayer() As clsPlayer
Dim P As clsPlayer
Dim TopP As clsPlayer
For Each P In Players
If P.Punktzahl > TopP.Punktzahl Then Set TopP = P
Next
Set GetTopPlayer = TopP
End Function
Es wird eine lange, aber lustige Nacht :-)
VG
Yal
Anzeige
AW: Zeit für die nächste Stufe
08.10.2021 21:58:14
BuddyHoli
Ok ja ich lerne gern. Aber hier verstehe ich aktuell nur Bahnhof und ich wäre gezwungen, wirklich alles umzuschreiben.
Das mache ich gern hinterher, um zu lernen. Aber die Datei enthält mehr als nur die Statistik der Spieler zu einem Tippspiel.
Ich habe ein Arbeitsblatt mit den Saisondaten seit 1963.
Daraus erstelle ich eine Tabelle für beliebige Zeiträume
Versus Statistiken für zwei Mannschaften in beliebigen Zeiträumen
Top und Flop Listen beliebige Zeiträume
Das Tippspiel aus einer gewählten Saison
Die Spielerstatistiken zum Tippspiel aus Basis von Regeln, die der Benutzer eingibt oder auswählt.
Das alles umschreiben, ja gern. Aber kurz vor der ersten Fertigstellung wahrscheinlich sehr komplex oder?
Anzeige
AW: Zeit für die nächste Stufe
08.10.2021 22:20:40
Yal
Hallo Buddy,
ja, die objekt-orientierte Denkweise verinnerlicht man nicht in ein paar Minunten. Da riskiert man eine schlechte Note ;-)
Komplexität ist relativ: es ist sehr komplex ein Kabel in der Wand zu verlegen, es ist dafür ganz leicht, das Licht anzumachen.
Es ist immer ein Ratio zwischen Aufwand im Voraus und Aufwand im Nachhinein. Es ist aber die Grundlage der Programmier- oder Nicht-Programmier-Entscheidung:
Mein Chef will heute eine Berechnung, wofür ich per Hand 30 Minuten, Programmieren bräuchte ich 1,8 Stunde, dafür ein paar Sekunden zum Rechnen: wie wahrscheinlich ist es, dass in den nächsten Zeit diese Berechnung mehr als 2 mal nochmal gemacht werden muss?
Wenn Du programmierst, legst Du die Strasse, worauf deine nächste Programmierung ausrollen wird. Oder eine Buckelpiste.
Quick & Dirty ist nur am Anfang quick. Es wird sehr schnell sehr sehr dirty und sowas von gar nicht quick...
Das war die Philosophie am Freitag Abend. Gute Nacht.
VG
Yal
Anzeige
AW: Zeit für die nächste Stufe
08.10.2021 22:23:53
BuddyHoli
Wie gesagt... Wenn du Bock hast, bin ich gern bereit zu lernen, wie das richtig funktioniert ;) für Nacht
AW: Zeit für die nächste Stufe
08.10.2021 22:39:52
Yal
Die Basics: https://codekabinett.com/rdumps.php?Lang=1&targetDoc=objekte-klassen-vba-programmierung
Erste Code Kommt in einem Klassen-Modul, das clsPlaer heissen soll:

Private pName As String
Private pPlayDays As Collection
Private Sub Class_Initialize()
Set pPlayDays = New Collection
End Sub
Property Let Name(PlayerName As String)
'name kann nur einmal gesetzt werden
If pName = "" Then
pName = PlayerName
End If
End Property
Property Get Name() As String
Name = pName
End Property
Public Property Get Punktzahl() As Long
'Nur einen "Get", weil Read-Only
Dim PD As clsPlayDay
For Each PD In pPlayDays
Punktzahl = Punktzahl + PD.Punktzahl
Next
End Property
Public Function PlayDay_Add(Datum As Datum, Punktzahl As Long) As clsPlayDay
'Es darf kein PlayDay doppelt angelgt werden
Dim PD As clsPlayDay
On Error Resume Next
Set PD = Playdays(Datum)
If PD Is Nothing Then
Set PD = New clsPlayDay
PD.Datum = Datum
PD.Punktzahl = Punktzahl1
pPlayDays.Add PD, Format(Datum, "DD.MM.YYYY")
Set PlayDay_Add = PD
End If
End Function
Dann die Klasse clsPlayers (davon nur einenObjekt instanzieren):

Private pPlayers As Collection
Private Sub Class_Initialize()
Set pPlayers = New Collection
End Sub
Public Property Get Count() As Long
Count = pPlayers.Count
End Property
Public Function Player_Add(PlayerName As String) As clsPlayer
Dim P As clsPlayer
On Error Resume Next
Set P = pPlayers(PlayerName)
If P Is Nothing Then
Set P = New clsPlayer
P.Name = PlayerName
pPlayers.Add P, PlayerName
Set Player_Add = P
End If
End Function
Public Function GetTopPlayer() As clsPlayer
Dim P As clsPlayer
Dim TopP As clsPlayer
For Each P In pPlayers
If P.Punktzahl > TopP.Punktzahl Then Set TopP = P
Next
Set GetTopPlayer = TopP
End Function
Dann die clsPlayDay, die Klasse zur Objekte, das nach meinem Design (nicht der Beste. Quick eben), nur in der Collection eines clsPlayer vorkommen:

Private pDatum As Date
Private pPunktZahl As Long
Property Let Datum(PlayDayDate As Date)
'Datum darf nicht geändert werden
If CLng(pDatum) = 0 Then
pDatum = PlayDayDate
End If
End Property
Property Get Datum() As Date
Datum = pDatum
End Property
Property Let Punktzahl(PktZahl As Long)
'PunktZahl darf nicht nachträglich geändert werden
If pPunktZahl = 0 Then
pPunktZahl = PktZahl
End If
End Property
Ansonsten kannst Du nach Pattern Design suchen. EIn Bischen too much am Anfang, aber irgendwann kommt man auch selber drauf, was Sinn ergibt oder nicht.
VG
Yal
Anzeige
AW: Rank in mehrdimensionalem array
08.10.2021 22:01:49
Daniel
Hi
Mit zwei schleifen nacheinander pro Spieltag.
In der ersten Schleife suchst du die maximale Punktzahl, mit der zweiten Schleife prüfst du dann, welcher Spieler diese Punktzahl hat.
In etwa so (Code bitte nicht kopieren, sondern lesen, verstehen, selber schreiben)
Ich gehe mal davon aus, dass die Spieler in beiden Listen gleich angeordnet sind.

For Tag = 1 to playdays
MaxPunkte = 0
For Spieler = 1 to players
If MaxPunkte 
Also im Prinzip ganz einfach.
Gruß Daniel
AW: Rank in mehrdimensionalem array
08.10.2021 22:26:57
BuddyHoli
Besten Dank.
Dem Code verstehe ich sofort und probiere ihn aus sobald ich kann.
Vielen Dank und gute Nacht
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige