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
- VBA Array in Excel — einen Bereich 100× schneller lesen
- VBA Range in Excel — Zellen ansprechen, lesen & schreiben
- VBA For-Schleife in Excel — 8 Praxisbeispiele
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).
