Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA - Tabelle mit Mannschaftsergebnissen sortieren

VBA - Tabelle mit Mannschaftsergebnissen sortieren
18.04.2024 19:30:20
Schneider, Franz
Hallo,

aus einer umfangreichen Tabelle mit unsortierten Ergebnissen von Mannschaftsmitgliedern eines Sportvereins habe ich zur Erstellung einer Ergebnisliste die Daten in eine gesonderte Tabelle übernommen, die für eine Mannschaftsergebnisliste erforderlich sind. Jede Mannschaft besteht aus 3 Mitgliedern, denen eine Mannschaftsnummer und die Buchstaben a, b und c zugeordnet sind. Die Tabelle, die im ersten Schritt nach diesen Mannschaftsnummern sortiert ist, soll nun für eine Ergebnisliste im nächsten Schritt nach der Disziplinnummer, Mannschaftsklasse und dem Mannschaftsergebnis (Summe der 3 Mannschaftsmitglieder) sortiert werden. Ich habe mit meinen bescheidenen VBA-Kenntnissen ein Makro entwickelt, das auch dieses Ziel erreicht (siehe Musterdatei https://www.herber.de/bbs/user/168844.xlsm ).

Vor der Sortierung ist allen 3 Mannschaftsmitgliedern mit einer Formel das gleiche Mannschaftsergebnis zugeordnet worden. Genau das ist mein Problem. Ich habe in der Musterdatei die Formel händisch in die Hilfsspalte P eingetragen. Ich weiß nicht, wie ich das mit einem Makro hinbekommen soll. Hat jemand eine Lösung?

Noch eine Anmerkung: Die Anzahl der Mannschaften ist je nach Veranstaltung unterschiedlich.

Schon einmal vielen Dank.

Viele Grüße
Franz
Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
18.04.2024 20:55:16
Alwin Weisangler
Hallo Franz,

ein Weg wäre so:



Option Explicit

Sub MannschaftsSumme()
Dim i&, j&, k&, tmp$, erg#, last&, arr(), objDict
Set objDict = CreateObject("Scripting.Dictionary")
With Tabelle1
For i = 4 To .Cells(Rows.Count, 5).End(xlUp).Row
tmp = .Cells(i, 5)
For j = 1 To Len(tmp) - 1
If IsNumeric(Mid(tmp, j, 1)) Then erg = erg & Mid(tmp, j, 1)
Next j
objDict(erg) = 0
erg = 0
Next i
arr = objDict.Keys
For i = 1 To UBound(arr) + 1
For j = 4 To .Cells(Rows.Count, 5).End(xlUp).Row
If Len(.Cells(j, 5)) = Len(arr(i - 1)) + 1 Then
If CDbl(Left(.Cells(j, 5), Len(arr(i - 1)))) = arr(i - 1) Then
erg = erg + CDbl(.Cells(j, 13))
k = k + 1
last = j
End If
End If
Next j
For j = (last + 1) - k To last
.Cells(j, 16) = erg
Next j
last = 0
k = 0
erg = 0
Next i
End With
End Sub


Gruß Uwe
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
18.04.2024 21:08:29
Yal
Hallo Franz,

versuche mit dem Formel
=SUMMENPRODUKT($M$4:$M$51*(LINKS(RECHTS("0000"&E4;5);4)=LINKS(RECHTS("0000"&$E$4:$E$51;5);4)))

(Leichter wäre eine Hilfespalte zu benutzen, wo =LINKS(RECHTS("0000"&E4;5);4) stehen würde.)

So hast Du in jeder Zeile dieselbe Formel, was leichter einzutragen ist.
Mit VBA lässt sich diese Formel so eintragen:
ActiveSheet.Range("P4:P" & Cells(Rows.Count, "B").End(xlUp).Row).FormulaLocal = _

"=SUMMENPRODUKT($M$4:$M$51*(LINKS(RECHTS(""0000""&E4;5);4)=LINKS(RECHTS(""0000""&$E$4:$E$51;5);4)))"


VG
Yal
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
19.04.2024 12:31:27
Schneider, Franz
Hallo zusammen,

vielen Dank für die schnellen unterschiedlichen Lösungsvorschläge. Es wird einige Zeit in Anspruch nehmen, bis ich sie durchgearbeitet und hoffentlich einigermaßen verstanden habe. Welche ich für meine Originaldatei bevorzugt nutzen kann und werde, das wird sich danach erweisen. Ich werde mich anschließend wieder melden. Ggf. komme ich auch noch mit Verständnisfragen auf euch zu.

Gruß Franz
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
18.04.2024 22:26:31
Piet
Hallo

upps, ich sehe es gibt schon drei Antworten der Kollegen, will aber meinen Code nicht in die Tonne kloppen!
Ich habe dir in deinen Code ein Makro für die Summen Formeln eingesetzt, und teile deines Codes verkürzt.
Ich hoffe das er in dieser Kurzfassung noch einwandfrei läuft. Dich wird vielleicht diese Codezeile wundern.
Range("R4").Copy Range("R5:R" & Zei21) - So kopiert man Formeln oder Werte OHNE PasteSpecial.

mfg Piet

'neu eingefügt für Formelmakro

Dim AC As Range, lz1 As Long
Dim FAdr As String, n As Long
Dim Adr As String, Edr As String
'
' *** Codes für Mannschaftsliste ***
'-------------------------------------------------------------------------------------------------------
'
Sub Mannschaftsliste_erstellen()
Dim Zei21 As Integer

ActiveSheet.Unprotect
Application.ScreenUpdating = False
Worksheets("Mannschaften").Activate
'
' ** Ermitteln der letzten Zeile der Tabelle **
'
Zei21 = Cells(Rows.Count, 3).End(xlUp).Row
' MsgBox Zei21
'
' ** Einfügen der Formel zur Ermittlung des Mannschaftsergebnisses in Hilfsspalte P **
'
'1. Formel + Summen Adresse setzen
Adr = "$M$4": FAdr = "P4": n = 1

'alle Klassen als Summe auswerten
For Each AC In Range("F4:F" & Zei21)
If AC.Cells(2, 1) > AC.Value Then
Edr = Cells(AC.Row, "M").Address 'End Adresse
Range(FAdr).Resize(n, 1).FormulaLocal = "=SUMME(" & Adr & ":" & Edr & ")"
Adr = Cells(AC.Row + 1, "M").Address 'neue Anf-Adresse
FAdr = Cells(AC.Row + 1, "P").Address: n = 1 '1.Formel Zelle
Else: n = n + 1 'Zeilenzähler
End If
Next AC

' ** Kopieren der Disziplinnummern, Einfügen in Hilfsspalte Q und Entfernen der Punkte **
'
Range("C4:C" & Zei21).Copy
Range("Q4").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Range("Q4:Q" & Zei21).Replace ".", "", xlPart

' ** Entfernen der letzten 2 Stellen der Disziplinnummer für das Sortieren (Hilfsspalte R) **
'
Range("R4").FormulaR1C1 = "=LEFT(RC[-1],LEN(RC[-1])-2)"
Range("R4").Copy Range("R5:R" & Zei21)

' ** Sortieren nach Disziplinnummer (Hilfsspalte R), M-Klasse (Spalte F) und M-Ergebnis (Hilfsspalte P)
With ActiveWorkbook.Worksheets("Mannschaften")
.SortFields.Clear
.Range("B4:R" & Zei21).Sort _
Key1:=.Range("R4"), order1:=xlAscending, _
Key2:=.Range("F4"), Order2:=xlAscending, _
Key3:=.Range("P4"), Order3:=xlDescending, _
Header:=xlNo
End With
'
' ** Platzierungen der Mannschaft zu jedem Mannschaftsmitglied einfügen **

Range("N4").FormulaR1C1 = "=IF(RC[-1]="""","""",1)"
Range("N5").FormulaR1C1 = "=IF(RC[-1]="""","""",IF(OR(R[-1]C[-10]>RC[-10],R[-1]C[-8]>RC[-8]),1,IF(AND(R[-1]C[-10]=RC[-10],R[-1]C[-8]=RC[-8],LEFT(R[-1]C[-9],LEN(R[-1]C[-9])-1)=LEFT(RC[-9],LEN(RC[-9])-1)),R[-1]C,R[-1]C+1)))"
Range("N5").Copy Range("N6:N" & Zei21)
Application.CutCopyMode = False

Range("A1").Select
Application.ScreenUpdating = True
End Sub
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
20.04.2024 20:56:59
Schneider, Franz
Hallo Piet,

zunächst danke für deinen Lösungsvorschlag, die Einarbeitung in die Mustertabelle und die Kürzungsvorschläge zu Codes, die mir nicht bekannt waren.

Leider kommt es beim Einfügen der Mannschaftssummen an einer Stelle zu einem mir nicht erklärbaren Fehler. Addiert werden sollen jeweils die 3 Ergebnisse der Mannschaftsmitglieder. In meiner Mustertabelle werden jedoch an einer Stelle die Ergebnisse von 2 Mannschaften addiert. Ich habe den Bereich im aktuellen Stand der beigefügten Datei (https://www.herber.de/bbs/user/168885.xlsm) gelb markiert. Richtig sind die grün markierten Werte. Zudem habe ich die absoluten Formeln in der Spalte P als Werte kopiert, da sie sonst bei der anschließenden Sortierung Fehler verursachen. Beim Code der Sortierung kam es durch ein noch fehlendes ".Sort" zu einer Fehlermeldung.

Bis auf das Problem bei der beschriebenen Summenbildung scheint der Code korrekt abzulaufen.

Gruß Franz
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
19.04.2024 17:42:04
Schneider, Franz
Hallo Yal,

danke für deine Antwort. Die Formel funktioniert in VBA. Es gibt da nur ein Problem. Die Formel ist auf die Endzeile 51 begrenzt. In der realen Anwendung variiert die Anzahl der Mannschaften jedoch. Ich habe es mit verschiedenen Möglichkeiten versucht, aber ich finde keine variable Lösung für diese Formel. Hast du eine?

Gruß Franz
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
19.04.2024 20:27:07
Yal
Hallo Franz,

man kann natürlich nur Gold suchen, wenn man vorher welche gesehen hat.
Bei VBA ist es ein bisschen umstandlicher. Es reicht nicht, einen Code gesehen zu haben, muss man sich damit auseinandersetzen, um zu verstehen, was es bedeutet.

Ich hoffe, diese Code-Schnippsel bringt dein Wissen weiter.

Dim LetzteZeile As Long


LetzteZeile = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row
ActiveSheet.Range("P4:P" & LetzteZeile).FormulaLocal = _
"=SUMMENPRODUKT($M$4:$M$" & LetzteZeile & "*(LINKS(RECHTS(""0000""&E4;5);4)=LINKS(RECHTS(""0000""&$E$4:$E$" & LetzteZeile & ";5);4)))"


VG
Yal
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
20.04.2024 15:01:26
Schneider, Franz
Hallo Yal,

ja, dein Code-Schnipsel hat mein Wissen erweitert und zum gesuchten Ergebnis geführt. Mein Problem war, dass ich bei der Suche nach Lösungen meine angewendete Variable "Zei21" nicht in der erforderlichen Form in Anführungszeichen gesetzt habe. Ich bin halt eben kein Profi, sondern nur einer mit rudimentären Kenntnissen in VBA (siehe oben), der Excel für seine Vorhaben nicht nur als Schreibmaschine nutzen will. Anders als du unterstellt hast, habe ich mich - wie ich schon in meiner Anfrage angemerkt habe - mit dem Problem auseinandergesetzt.

Erlaube mir noch eine Anmerkung zum Umgang in Foren mit Ratsuchenden:
Es kommt nicht gut an, wenn ein Antwortender einem Fragesteller, der mit seinem VBA-Wissen an seine Grenzen stößt, Vorhaltungen macht, was er zu tun und zu lassen hat, ohne seine Vorarbeit zur Problemlösung zu kennen. Es sollte selbstverständlich sein, sich in der Reaktion nur auf die Fragestellung zu beschränken. Sorry, das musste gesagt werden.

Gruß Franz
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
22.04.2024 10:11:48
Yal
Hallo Franz,

ja, Du hast recht und ich bitte um Entschuldigung für meine nicht korrekten Ausdrucksweise. Ich bedanke mich mich für deine herrliche Rückmeldung.
Es ist leider so, dass durch das Geschriebenen die Stimmung des Satzes nicht übertragen werden kann. Mit dem Satz "man kann natürlich nur Gold suchen, wenn man vorher welche gesehen hat" wollte ich nur die Idee rüberbringen, dass es normal ist, dass Du auf die Lösung kommt, weil Dir die Erfahrung fehlt (und dementsprechend liefern wir Beispiele). Hätte ich mich an diesen Satz beschränkt, wäre es vielleicht gut gegangen, aber ich bin von "Schwätzer-Typ" und habe was hizugefügt, was die Weiche beim Lesenden in einer anderen Richtung gestellt. Sorry dafür.

Solltest Du auf diese Meinung gekommen sein, weil ich in einem anderen Beiträg ein Fragenden Untätigkeit vorwerfe, ist es nicht so: ich gehe unvoreingenommen in jeder Fragestellung und mit jedem Fragenden.

VG
Yal
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
22.04.2024 10:14:57
Yal
Und ich sollte unbedingt mich nochmal durchlesen bevor ich poste: in der Satz fehlt einen "nicht".
Richtig wäre:
dass es normal ist, dass Du nicht auf die Lösung kommt, weil Dir die Erfahrung fehlt
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
22.04.2024 14:38:34
Schneider, Franz
Hallo Yal,

ok, angenommen. Die Sache ist schon vergessen. Du kannst sicher sein, ich bin nicht nachtragend.

Gruß Franz
Anzeige
AW: VBA - Tabelle mit Mannschaftsergebnissen sortieren
18.05.2024 13:17:11
Schneider, Franz
Hallo zusammen,

sorry, dass ich mich erst jetzt melde, aber andere Arbeiten waren vorrangig.

Danke für die funktionierenden Vorschläge, die mir sehr geholfen haben, VBA besser zu verstehen und mir Lösungsalternativen gezeigten. Entschieden habe ich mich für den Vorschlag von Yal, den ich mit zwei Zeilen in mein Projekt eingearbeitet habe. Die beiden Zeilen im Code sind kurz und knapp, und bei eventuell späteren Zeilenänderungen im Formularkopf scheint mir eine unkomplizierte Anpassung auch mit meinen Kenntnissen einfacher möglich.

Ich kann mich jetzt daran begeben, die Liste optisch zu verfeinern und Zwischenüberschriften einzuarbeiten. Sollte ich dabei auf für mich nicht lösbare Probleme stoßen, dann werdet ihr mich im Forum wiederfinden. Nochmals vielen Dank und schöne Pfingstfeiertage.

Viele Grüße
Franz
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige