MS Excel Makro - Gleiche Einträge in Spalte erkennen und zählen

2 Antworten

VBA wirkt für diese Aufgabe overpowert. Versuche, mit ZÄHLENWENN und Filtern dein Ziel zu erreichen. Das ist weniger komplex und sollte dafür ausreichend sein.

Wenn du es unbedingt in VBA gelöst bekommen willst, wäre dein Ansatz nicht schlecht. Würde uns eine Menge Arbeit ersparen.

Chris8301 
Fragesteller
 08.10.2014, 11:18

Das Skript soll als weiterer Bestandteil eines größeren Skripts in den Code implementiert werden, daher scheiden die Excel-eigenen Funktionen aus.

Ansatz habe ich so noch keinen da mein Wissen 12 Jahre alt ist, ich mir die bisherigen Parts aber Dank vielen versuchen und Recherchen im Internet zusammenschustern konnte :)

Vom Prinzip her sollte der Wert aus Spalte J in eine Variable geschrieben und die Anzahl auf "1" gesetzt werden. Wenn der gleiche dann noch mal auftaucht eben wieder "+1" usw. Das gilt natürlich für alle unterschiedlichen Einträge in der Liste.

0
Suboptimierer  08.10.2014, 12:26
@Chris8301

okey, mal ein Ansatz:

clsListe

Option Explicit

Dim saWerte(1000)
Dim iaAnzahl(1000)

Public Sub Add(sWert)
  Dim i
  Dim bGefunden
  
  bGefunden = False
  For i = 0 To UBound(saWerte)
    If (saWerte(i) = "") Then _
      Exit For
    If (saWerte(i) = sWert) Then
      iaAnzahl(i) = iaAnzahl(i) + 1
      bGefunden = True
      Exit For
    End If
  Next
  If Not bGefunden Then
    saWerte(i) = sWert
    iaAnzahl(i) = 1
  End If
End Sub

Public Sub Out()
  Dim i
  For i = 0 To UBound(saWerte)
    If saWerte(i) = "" Then _
      Exit For
    Debug.Print saWerte(i) & ": " & iaAnzahl(i)
  Next
End Sub

Die Arrays kannst du noch versuchen, dynamisch zu machen.

Aufruf:

Sub ListeZaehleWerte()
  Dim oListe
  Dim rZelle
  
  Worksheets(1).Activate
  
  Set oListe = New clsListe
  For Each rZelle In Range("J1:J100")
    If rZelle.Value <> "" Then _
      oListe.Add rZelle.Value
  Next
  
  oListe.Out
  
  Set oListe = Nothing
End Sub
1
Chris8301 
Fragesteller
 08.10.2014, 16:22
@Suboptimierer

Puh! Vielen Dank für den Code! Ich muss aber zugeben dass ich ihn nicht ganz versetehe...

Wo wird denn zum Beispiel nun der Suchbereich (die Spalte) definiert? Die Länge des Suchbereichs, ich nehme an im Teil "J1:J100" definiert, sollte auch flexibel sein da die Liste sich monatlich ändern kann. Die Länge aktuell umfasst ca. 30.000 Zeilen...

0
Suboptimierer  08.10.2014, 16:30
@Chris8301

Für Testzwecke habe ich den Bereich eingegrenzt. Willst du über die gesamte Spalte laufen, musst du Range("J:J") eingeben.

Für die Klasse machst du ein Klassenmodul (Einfügen → Klassenmodul → Name der Klasse bei der Eigenschaft des Moduls ändern)

0

Eigentlich ist das ein typisches Datenbankproblem. Wenn es aber Excel sein soll oder muss, dann ist VBA nur eine Möglichkeit, besser löst du das mit einer Pivot-Tabelle!