Auch mit VBA kann diese Funktion doppelte Datensätze ausfiltern, indem die englische Schreibweise zum Einsatz kommt:
Application.WorksheetFunction.Unique(Array)
Im Beispiel wird die Tabelle aus der Abbildung im Bereich A2:E15 verwendet. Hier sind die Datensätze bei Frau Linz identisch und zwei Datensätze bei Frau Herzig. Aus dieser Tabelle erstellen wir den Array:
arr = Range("A2:E15")
Zum Herausfiltern der doppelten Datensätze wird die Funktion eingesetzt:
arr = Application.WorksheetFunction.Unique(arr)
Weiterverarbeitung des Ergebnisarrays
Das Ergebnis ist nun in der Variablen arr der Array mit den eindeutigen Datensätzen. Dabei gibt es jedoch zwei verschiedene mögliche Fälle:
Es können (wie im Beispiel) mehrere Zeilen sein. Dann kann der Array von 1 bis zum Ubound (der hier die Anzahl der Zeilen im Ergebnis ist) mit arr(Zeile, Spalte) durchlaufen werden:
For intI = 1 To UBound(arr)
MsgBox arr(intI, 1) & " " & arr(intI, 2) & ", " & arr(intI, 3)
Next
Hier würde für jede Zeile eine MsgBox mit Anrede Name, Vorname erscheinen.
Es kann aber auch der Fall eintreten, dass im Ergebnis nur eine Zeile übrig bleibt, die nun als Array vorliegt. Hier enthält der Array jedoch nicht die einzelne Zeile als Arrayelement der ersten Dimension, sondern bereits die einzelnen Elemente in der ersten Ebene. In dem Fall würde ein Zugriff mit arr(Zeile, Spalte) zu einem Fehler führen, weil das Auslesen nur mit arr(Spalte) erfolgen darf.
Wenn wir im VBA-Code also beide Fälle berücksichtigen wollen, müssen wir prüfen, ob der Array aus mehreren Zeilen zu mehreren Spalten oder nur aus mehreren Spalten ohne Zeile besteht. Dazu bietet sich an, die Anzahl aller Elemente des Arrays festzustellen:
intAnzahlEl = Application.WorksheetFunction.CountA(arr)
Wenn diese Zahl gleich dem Ubound des Arrays ist, muss es sich um einen eindimensionalen handeln, weil das dann die einzelnen Spalten sind. Wenn nicht, handelt es sich um einen mehrzeiligen Array, weil es dann immer mehr Elemente als der Ubound sind (Zeilen * Spalten = intAnzahlEl).
Und so können wir in unserem Code gut die Weiche stellen - an der Stelle der MsgBoxen müsste die eigentliche Verarbeitung der Daten rein:
Sub Eindeutig_vba()
Dim arr, intI As Integer, intAnzahlEl As Integer
arr = Range("A2:E15") 'Zur Ausgabe von mehreren Zeilen
'arr = Range("A2:E2") 'Zur Testausgabe einer Zeile
arr = Application.WorksheetFunction.Unique(arr)
'Anzahl aller(!) Elemente im Array:
intAnzahlEl = Application.WorksheetFunction.CountA(arr)
MsgBox "Ubound: " & UBound(arr) & vbNewLine & "Anzahl: " & intAnzahlEl
If intAnzahlEl = UBound(arr) Then ' Es gibt nur eine Zeile
MsgBox arr(1) & " " & arr(2) & ", " & arr(3)
Else ' Mehrere Zeilen
For intI = 1 To UBound(arr)
MsgBox arr(intI, 1) & " " & arr(intI, 2) & ", " & arr(intI, 3)
Next
End If
End Sub
Tipp - Sortieren:
Wenn das Ganze sortiert werden soll, kann das auch gleich am Anfang mit der integrierten Funktion erledigt werden:
arr = Application.WorksheetFunction.Unique(arr)
arr = Application.WorksheetFunction.Sort(arr, 2)
In dem Beispiel wäre der frische Array nach den Namen sortiert.