🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Dictionary in Excel — Nachschlagen, Duplikate entfernen & Gruppieren (6 Beispiele)

|

VBA Dictionary in Excel — Nachschlagen, Duplikate entfernen & Gruppieren (6 Beispiele)

Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 05.06.2026

Kurz gesagt — Ein Dictionary speichert Schlüssel → Wert-Paare und findet jeden Wert sofort über seinen Schlüssel — ganz ohne Schleife. Anlegen, befüllen, nachschlagen:

Sub DictGrundlagen()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    dict("AAPL") = 182.5          ' über Schlüssel hinzufügen oder aktualisieren
    dict("MSFT") = 410.2

    If dict.Exists("AAPL") Then    ' vor dem Lesen prüfen
        MsgBox "AAPL = " & dict("AAPL")
    End If
End Sub

Wo ein Array jeden Eintrag durchsuchen muss, springt ein Dictionary direkt zum Ziel. Deshalb nutzen Analysten es vor allem für zwei Dinge: Duplikate entfernen und Zählen/Gruppieren. Beides steht unten.

Warum ein Dictionary — und was ein Schlüssel ist

Ein Schlüssel ist eine eindeutige Bezeichnung; ein Wert ist, was Sie darunter ablegen. Schlüssel müssen eindeutig sein, also ist das Dictionary perfekt, wann immer „Habe ich das schon gesehen?" oder „Wie viele von jedem?" die Frage ist. Das Nachschlagen über den Schlüssel ist O(1) — praktisch sofort — egal wie viele Einträge es enthält.

Beispiel 1 — Einrichtung: späte gegen frühe Bindung

Es gibt zwei Wege, ein Dictionary zu erzeugen, und ihre Verwechslung führt zum gefürchteten Fehler „Benutzerdefinierter Typ nicht definiert".

' ── Späte Bindung (keine Einrichtung, läuft überall) ──
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' ── Frühe Bindung (schneller + IntelliSense) ──
' Zuerst: Extras ▸ Verweise ▸ "Microsoft Scripting Runtime" anhaken
Dim dict As New Scripting.Dictionary

Welche nehmen? Späte Bindung für Code, den Sie weitergeben (auf dem anderen Rechner nichts einzurichten). Frühe Bindung beim Entwickeln, wegen der Autovervollständigung. Diese Anleitung nutzt späte Bindung, damit jedes Beispiel sofort läuft.

Beispiel 2 — Hinzufügen, aktualisieren und der „stille" Trick

Es gibt zwei Wege, Daten hineinzugeben, und der Unterschied zählt:

dict.Add "AAPL", 182.5      ' ausdrücklich — FEHLER, falls "AAPL" schon existiert
dict("MSFT") = 410.2        ' Zuweisung — fügt hinzu, wenn neu, aktualisiert sonst

Die zweite Form ist das stille Hinzufügen: Eine Zuweisung an einen nicht vorhandenen Schlüssel erzeugt ihn. Bei Duplikaten gibt es nie einen Fehler — genau das macht die nächsten beiden Muster so sauber.

Beispiel 3 — .Exists vor dem Lesen (Phantom-Schlüssel vermeiden)

Das Lesen eines fehlenden Schlüssels mit dict(key) erzeugt ihn stillschweigend (leer). Um die Zugehörigkeit zu prüfen, ohne etwas hinzuzufügen, nutzen Sie immer .Exists:

Dim sku As String
sku = Range("A2").Value

If dict.Exists(sku) Then
    Range("B2").Value = dict(sku)        ' sicher — Schlüssel ist wirklich da
Else
    Range("B2").Value = "nicht gefunden"
End If

Beispiel 4 — Eine eindeutige Liste bauen (Duplikate in einem Durchgang) ⭐

Die klassische Aufgabe: Spalte A hat tausende Zeilen mit Wiederholungen; Sie wollen jeden Wert einmal. Das stille Hinzufügen lässt Duplikate automatisch zusammenfallen:

Sub EindeutigeWerte()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim zelle As Range
    For Each zelle In Range("A2:A10000")
        If zelle.Value <> "" Then dict(zelle.Value) = 1   ' Duplikate überschreiben, Liste bleibt eindeutig
    Next zelle

    ' dict.Keys ist nun die entdoppelte Liste — in Spalte D schreiben:
    Range("D2").Resize(dict.Count).Value = Application.Transpose(dict.Keys)
    MsgBox dict.Count & " eindeutige Werte"
End Sub

Keine verschachtelten Schleifen, kein Sortieren, keine Hilfsspalte — und es bleibt schnell bei 100.000 Zeilen.

Beispiel 5 — Zählen / gruppieren (eine Häufigkeitszählung) ⭐

Sie wollen „wie viele Aufträge pro Region"? Erhöhen Sie den Wert bei jedem Auftreten des Schlüssels um eins. Das stille Hinzufügen startet einen fehlenden Schlüssel bei 0, also funktioniert schon das erste + 1:

Sub ZaehlenNachRegion()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim zelle As Range
    For Each zelle In Range("A2:A10000")         ' Spalte A = Region
        dict(zelle.Value) = dict(zelle.Value) + 1  ' beim ersten Mal: 0 + 1
    Next zelle

    ' Zählung in die Spalten F:G ausgeben
    Dim k As Variant, z As Long
    z = 2
    For Each k In dict.Keys
        Cells(z, 6).Value = k                    ' F = Region
        Cells(z, 7).Value = dict(k)              ' G = Anzahl
        z = z + 1
    Next k
End Sub

Das ist eine PivotTable-würdige Gruppierung in 12 Zeilen — und Sie steuern genau, was passiert.

Beispiel 6 — Schlüssel und Werte gemeinsam durchlaufen

.Keys und .Items liefern je ein 0-basiertes Array, nach Position ausgerichtet:

Dim keys As Variant, items As Variant, i As Long
keys = dict.Keys
items = dict.Items
For i = 0 To dict.Count - 1
    Debug.Print keys(i) & " => " & items(i)
Next i

Brauchen Sie Schlüssel ohne Groß-/Kleinschreibung (sodass „AAPL" und „aapl" gleich sind)? Setzen Sie dict.CompareMode = vbTextCompare bevor Sie etwas hinzufügen.

Dictionary gegen Collection — was wann?

VBA hat auch eine eingebaute Collection. Greifen Sie zum Dictionary, wenn Sie Schlüsselzugriff brauchen; eine Collection genügt für eine einfache geordnete Liste.

Bedarf Dictionary Collection
Prüfen, ob ein Schlüssel existiert .Exists(key) keine — Fehler abfangen
Einen Wert direkt ändern dict(key) = x entfernen + neu hinzufügen
Alle Schlüssel / alle Werte holen .Keys / .Items nicht verfügbar
Einträge zählen .Count .Count
Einrichtung nötig Scripting.Dictionary-Verweis oder CreateObject eingebaut, keine

Häufige Dictionary-Fehler (und die Lösung)

Symptom Ursache Lösung
„Benutzerdefinierter Typ nicht definiert" As New Scripting.Dictionary ohne Verweis Verweis setzen oder späte Bindung CreateObject(...)
„Dieser Schlüssel ist bereits zugeordnet…" .Add auf vorhandenen Schlüssel dict(key) = value zum Hinzufügen-oder-Aktualisieren
Mitgliedschaftsprüfung lässt das Dict wachsen If dict(key) <> "" Then erzeugt den Schlüssel Stattdessen mit dict.Exists(key) prüfen
Transpose der Schlüssel scheitert / schneidet ab Über ~65.536 Schlüssel sprengt Transpose Schlüssel durchlaufen und einzeln schreiben
„aapl" und „AAPL" getrennt gezählt Schlüsselvergleich standardmäßig case-sensitiv dict.CompareMode = vbTextCompare vor dem Hinzufügen setzen

Sparen Sie sich Bindung und Gerüst — fragen Sie nach dem Ergebnis

Dictionaries sind das richtige Werkzeug zum Entdoppeln und Gruppieren — aber frühe-gegen-späte Bindung, .Exists-Wächter und Transpose-Grenzen sind viel Zeremonie für „gib mir die eindeutigen Regionen und ihre Anzahl". ExcelMaster Agent lässt Sie genau das in klarem Deutsch sagen — „liste jede eindeutige Region in Spalte A und wie viele Zeilen sie hat" — und baut Dictionary, Wächter und Ausgabe für Sie. Kostenlos testen →

Weitere Anleitungen

FAQ

Was ist ein Dictionary in VBA? Ein Dictionary (Scripting.Dictionary) speichert Schlüssel-Wert-Paare und holt jeden Wert sofort über seinen Schlüssel, ohne Schleife. Schlüssel sind eindeutig, was es ideal zum Entdoppeln sowie zum Zählen und Gruppieren macht.

Wie erstelle ich ein Dictionary in Excel VBA? Späte Bindung braucht keine Einrichtung: Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary"). Für frühe Bindung und IntelliSense haken Sie unter Extras ▸ Verweise Microsoft Scripting Runtime an, dann Dim dict As New Scripting.Dictionary.

Was ist der Unterschied zwischen Dictionary und Collection in VBA? Ein Dictionary hat .Exists, lässt Werte direkt ändern und stellt .Keys/.Items bereit. Eine Collection ist eine einfachere eingebaute geordnete Liste ohne Schlüsselprüfung und ohne Zugriff auf ihre Schlüssel. Nehmen Sie ein Dictionary, sobald Sie Schlüsselzugriffe brauchen.

Wie prüfe ich, ob ein Schlüssel in einem VBA-Dictionary existiert? Mit dict.Exists(key) — gibt True/False zurück, ohne das Dictionary zu ändern. Vermeiden Sie If dict(key)…, denn das Lesen eines fehlenden Schlüssels erzeugt ihn stillschweigend.

Wie bekomme ich eine eindeutige Liste mit einem VBA-Dictionary? Durchlaufen Sie den Quellbereich und weisen Sie dict(zelle.Value) = 1 zu. Doppelte Schlüssel überschreiben sich, also ist dict.Keys die entdoppelte Liste — dann zurückschreiben mit Range("D2").Resize(dict.Count).Value = Application.Transpose(dict.Keys).