1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Excel-Ranking erstellen

Dieses Thema im Forum "Visual Basic, Visual Basic for Applications (VBA) " wurde erstellt von ChrisZensen, 20. November 2017.

  1. ChrisZensen

    ChrisZensen New Member

    Hallo zusammen,
    ich habe jetzt schon eine Zeit lang experimentiert und getestet, laufe aber immer wieder in Probleme herein. Vorab: ich habe keine große Ahnung vom Programmieren. Hintergrund ist folgender:
    Ich habe mir ein Dokument gebaut, wo eine Liste mittels Eingabemaske erzeugt wird. Die Liste erscheint im Blatt "Tabelle1". Nun soll folgendes passieren. Ich habe ein weiteres Tabellenblatt "Tabelle3". Sobald dieses aktiviert wird, soll der Inhalt der Spalten 2, 3, 4 und 9 von "Tabelle1" kopiert und dort eingefügt werden. Gleichzeitig soll jedoch auch ein Ranking stattfinden, soll heißen, wenn in den Spalten 2, 3 und 4 die Daten identisch sind, soll der Zahlenwert in Spalte 9 addiert werden und nur noch einmal in einer Zeile angezeigt werden. Um das zu vereinfachen, vielleicht ein praktisches Beispiel: In meinen Spalten 2, 3 und 4 stehen Zuname, Vorname und Geburtsdatum, in Spalte 9 Punkte. Hat der Hans Müller, geboren 19.11.1988 zwei Zeilen mit einmal 3 und einmal 4 Punkten, so soll er im neuen Tabellenblatt nur noch eine Zeile füllen mit seinen 7 Punkten.
    Ich verzweifle echt langsam daran, vielleicht kann mir ja hier einer freundlicherweise helfen :)

    Vielen Dank bereits im Voraus und liebe Grüße,
    Chris
  2. Mat

    Mat Active Member c-b Experte

    Du hättest den Text ruhig formatieren können. Das liest sich, als würdest du ein Bild beschreiben anstatt den Screenshot zu posten. ;)

    Also ohne jetzt zu wissen, welchen Code du bisher hast, hier eine mögliche Vorgehensweise in einem Makro:

    1. Kopiere die Daten aus Tab1 nach Tab3: Sub Kopieren()
    2. Lösche in Tab3 die Spalten, die du nicht brauchst: Sub Polieren()
      • Starte am besten die Makroaufzeichnung (kopiere vorher per Hand den Inhalt aus Tab1 nach Tab3)
      • Lösche nun in Tab3 die nicht benötigten Spalten
      • Beende die Makroaufzeichnung und bearbeite die von der Aufzeichnung generierte Methode
      • Sinnvollen Namen geben, wie zum Beispiel Sub Polieren() (in diese Funktion könnten später auch Methoden, die ungültige Einträge entfernen)
    3. Fasse die Punkte in Tab3 zusammen: Sub Summieren()
      • Gehe, angefangen von der 2. Zeile, für jede Zeile von oben nach unten jeweils einmal durch die ganze Liste durch
      • Also fang zum Beispiel bei A2:C2 an, der Spitzname in A1 ist die ID (er ist einmalig)
      • Die zweite Reihe (A2:C2) ist jetzt deine Referenz, alle nachfolgenden Zeilen werden mit ihr verglichen
      • Du prüfst nun also ab Referenzzeile+1 (in diesem Fall A3:C3) ob der Spitzname der gleiche ist wie in der Referenzzeile
      • Wenn ja, dann addierst du die Punkte aus der untersuchten Zeile (hier C3) auf die Punkte der Referenzzeile (also A3)
      • Anschließend löschst du diese Zeile
      • Diese Vorgehensweise muss so lange durchgeführt werden, bis du an einer leeren Zeile angelangst, dann ist er fertig
      • Also brauchst zum Beispiel du eine While-Schleife in der sich eine For-Schleife befindet
      • While soll dann so lange laufen, wie die Referenzzeile nicht leer ist
      • Innerhalb der While-Schleife gehst du immer eine Zeile weiter und startest dann die For-Schleife
      • Die For-Schleife bezieht sich dann dynamisch immer auf eine kleiner werdende Anzahl von Zeilen, also Pseudocode:
        • Referenzzeile = A2:C2; for(Zeile = A3:C3 bis Zeile = Ende) if Zeile.Spitzname = Referenzzeile.Spitzname then summiere und lösche
        • Referenzzeile = A3:C3; for(Zeile = A4:C4 bis Zeile = Ende) if Zeile.Spitzname = Referenzzeile.Spitzname then summiere und lösche
        • Referenzzeile = Ax:Cx; for(Zeile = Ay:Cy bis Zeile = Ende) if Zeile.Spitzname = Referenzzeile.Spitzname then summiere und lösche
    4. Einträge sortieren: Sub Sortieren()
      • Makroaufnahme in Tab3 starten, alles markieren und Daten absteigend nach Punkten sortieren
      • Methode sinnvoll umbenennen
      • Ranges anpassen, damit er alle vorhandenen Zeilen nimmt
        • Entweder gibts da eine Methode von Excel (fällt mir grad nicht ein)
        • Oder du lässt eine Schleife durchlaufen, die die Zeilen zählt
        • Oder du zählst während deiner Summier-Methode mit..die kennt ja die Anzahl der Zeilen
    5. Sage Excel, dass deine Methoden beim Aktivieren von Tab3 ausgeführt werden sollen: Private Sub Worksheet_Activate()
    Sind zumindest Anhaltspunkte.

    Dein Event könnte am Ende so aussehen (nur ein Beispiel, kannst auch weniger oder gar keine Methoden benutzen und alles komplett in Worksheet_Activate reinklatschen) :
    Code:
    Private Sub Worksheet_Activate()
        Kopieren()
        Polieren()
        Summieren()
        Sortieren()
    End Sub
    PS: Es ist wichtig, dass die Methodennamen sich reimen. Das erhöht die Performance.