VBA Dictionary object: sleutel-waarde paren opslaan (2026)
Het VBA Dictionary object is een krachtige datastructuur waarmee je sleutel-waarde paren opslaat in Excel. Met een Dictionary zoek je razendsnel waarden op via een unieke sleutel, wat ideaal is voor het verwerken van grote datasets of het bouwen van lookup-tabellen in je macro’s.
Laatst bijgewerkt: januari 2026
Wat is een VBA Dictionary?
Een Dictionary in VBA werkt als een woordenboek: je slaat informatie op met een unieke sleutel (key) en haalt deze later op met diezelfde sleutel. Dit is veel sneller dan zoeken in een array of door cellen bladeren.
Vergelijking met een Collection:
| Eigenschap | Dictionary | Collection |
|---|---|---|
| Sleutel verplicht | Nee (kan automatisch) | Nee |
| Sleutel wijzigen | Ja | Nee |
| Controleren of sleutel bestaat | Ja (.Exists) | Nee (error handling nodig) |
| Item bijwerken | Ja | Nee (verwijderen + toevoegen) |
| Snelheid | Zeer snel | Snel |
Syntaxis voor aanmaken:
' Methode 1: Early Binding (vereist referentie naar Microsoft Scripting Runtime)
Dim dict As Scripting.Dictionary
Set dict = New Scripting.Dictionary
' Methode 2: Late Binding (geen referentie nodig)
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
VBA Dictionary stap-voor-stap
Stap 1: Referentie toevoegen (Early Binding)
Als je Early Binding wilt gebruiken voor betere IntelliSense:
- Windows: Open de VBA Editor (Alt + F11) > Extra > Verwijzingen > Vink “Microsoft Scripting Runtime” aan
- Mac: Helaas is het Dictionary object niet beschikbaar op Mac. Gebruik daar een Collection of een eigen oplossing.
Stap 2: Dictionary aanmaken
Sub DictionaryAanmaken()
' Late Binding - werkt altijd zonder referentie
Dim producten As Object
Set producten = CreateObject("Scripting.Dictionary")
' Nu kun je de Dictionary gebruiken
MsgBox "Dictionary aangemaakt!"
End Sub
Stap 3: Items toevoegen met .Add
Sub ItemsToevoegen()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' Voeg items toe: dict.Add sleutel, waarde
dict.Add "A001", "Laptop"
dict.Add "A002", "Monitor"
dict.Add "A003", "Toetsenbord"
' Toon aantal items
MsgBox "Aantal items: " & dict.Count
End Sub
Stap 4: Waarde ophalen via sleutel
Sub WaardeOphalen()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "NL", "Nederland"
dict.Add "BE", "Belgie"
dict.Add "DE", "Duitsland"
' Haal waarde op via sleutel
MsgBox dict("NL") ' Toont: Nederland
MsgBox dict.Item("BE") ' Toont: Belgie
End Sub
Stap 5: Controleren of sleutel bestaat met .Exists
Sub SleutelControleren()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "jan@email.nl", "Jan Janssen"
' Controleer of sleutel bestaat
If dict.Exists("jan@email.nl") Then
MsgBox "Email gevonden: " & dict("jan@email.nl")
Else
MsgBox "Email niet gevonden"
End If
End Sub
Stap 6: Items bijwerken en verwijderen
Sub ItemsBijwerken()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "prijs", 100
' Waarde bijwerken (overschrijven)
dict("prijs") = 150
MsgBox "Nieuwe prijs: " & dict("prijs")
' Item verwijderen
dict.Remove "prijs"
' Alle items verwijderen
dict.RemoveAll
End Sub
Stap 7: Door Dictionary loopen
Sub DoorDictionaryLoopen()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "Appel", 1.50
dict.Add "Banaan", 0.80
dict.Add "Sinaasappel", 1.20
' Loop door alle sleutels
Dim sleutel As Variant
For Each sleutel In dict.Keys
Debug.Print sleutel & ": " & dict(sleutel)
Next sleutel
' Of loop door alle waarden
Dim waarde As Variant
For Each waarde In dict.Items
Debug.Print waarde
Next waarde
End Sub
Praktijkvoorbeeld: Unieke waarden tellen
Een veelvoorkomend gebruik van Dictionary is het tellen van unieke waarden of het verwijderen van duplicaten. Hieronder een compleet voorbeeld:
Sub UniekeWaardenTellen()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim cel As Range
Dim bereik As Range
' Selecteer het bereik met data
Set bereik = Range("A1:A100")
' Loop door alle cellen
For Each cel In bereik
If cel.Value <> "" Then
If Not dict.Exists(cel.Value) Then
' Nieuwe waarde: voeg toe met telling 1
dict.Add cel.Value, 1
Else
' Bestaande waarde: verhoog telling
dict(cel.Value) = dict(cel.Value) + 1
End If
End If
Next cel
' Toon resultaten
MsgBox "Aantal unieke waarden: " & dict.Count
' Schrijf naar nieuwe kolom
Dim i As Long
i = 1
Dim sleutel As Variant
For Each sleutel In dict.Keys
Cells(i, 3).Value = sleutel
Cells(i, 4).Value = dict(sleutel)
i = i + 1
Next sleutel
End Sub
Dit voorbeeld werkt vergelijkbaar met de UNIEK functie in nieuwere Excel-versies, maar dan in VBA. Wil je eerst leren hoe je eenvoudige macro’s schrijft? Bekijk dan onze VBA voor beginners handleiding.
Dictionary eigenschappen en methoden overzicht
| Eigenschap/Methode | Beschrijving | Voorbeeld |
|---|---|---|
.Add(key, item) |
Voegt nieuw item toe | dict.Add "A1", 100 |
.Item(key) |
Haalt waarde op of wijzigt deze | dict.Item("A1") = 200 |
.Key(key) |
Wijzigt een bestaande sleutel | dict.Key("A1") = "B1" |
.Exists(key) |
Controleert of sleutel bestaat | If dict.Exists("A1") Then |
.Remove(key) |
Verwijdert specifiek item | dict.Remove "A1" |
.RemoveAll |
Verwijdert alle items | dict.RemoveAll |
.Count |
Geeft aantal items | MsgBox dict.Count |
.Keys |
Geeft array van alle sleutels | For Each k In dict.Keys |
.Items |
Geeft array van alle waarden | For Each v In dict.Items |
.CompareMode |
Bepaalt hoofdlettergevoeligheid | dict.CompareMode = vbTextCompare |
CompareMode instellen
De CompareMode bepaalt of sleutels hoofdlettergevoelig zijn. Je moet dit instellen voordat je items toevoegt:
Sub CompareModeVoorbeeld()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' 0 = vbBinaryCompare (hoofdlettergevoelig, standaard)
' 1 = vbTextCompare (niet hoofdlettergevoelig)
dict.CompareMode = 1 ' Niet hoofdlettergevoelig
dict.Add "Amsterdam", "Noord-Holland"
' Dit werkt nu ook:
MsgBox dict("AMSTERDAM") ' Toont: Noord-Holland
MsgBox dict("amsterdam") ' Toont: Noord-Holland
End Sub
Veelgemaakte fouten
Fout 1: Item toevoegen met bestaande sleutel
Probleem: Je gebruikt .Add met een sleutel die al bestaat, wat resulteert in “Error 457: This key is already associated with an element of this collection”.
Oplossing: Controleer eerst of de sleutel bestaat met .Exists, of gebruik directe toewijzing om te overschrijven:
' Methode 1: Controleren met Exists
If Not dict.Exists("sleutel") Then
dict.Add "sleutel", "waarde"
End If
' Methode 2: Altijd overschrijven (zonder .Add)
dict("sleutel") = "waarde"
Fout 2: Dictionary gebruiken op Mac
Probleem: Het Scripting.Dictionary object werkt niet op Mac OS, omdat Microsoft Scripting Runtime daar niet beschikbaar is.
Oplossing: Gebruik een VBA Collection of bouw een eigen Dictionary-klasse. Voor eenvoudige lookups kun je ook de VERT.ZOEKEN of X.ZOEKEN functie gebruiken in combinatie met VBA.
Fout 3: CompareMode wijzigen na toevoegen items
Probleem: Je probeert de CompareMode te wijzigen nadat je al items hebt toegevoegd, wat resulteert in een fout.
Oplossing: Stel CompareMode in direct na het aanmaken van de Dictionary, voordat je enige items toevoegt:
Set dict = CreateObject("Scripting.Dictionary")
dict.CompareMode = 1 ' Direct na aanmaken!
dict.Add "test", "waarde"
Fout 4: Vergeten Set te gebruiken bij object toewijzing
Probleem: Je vergeet Set te gebruiken bij het aanmaken van de Dictionary, wat resulteert in “Error 91: Object variable or With block variable not set”.
Oplossing: Gebruik altijd Set bij het toewijzen van objecten:
' FOUT:
Dim dict As Object
dict = CreateObject("Scripting.Dictionary")
' GOED:
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Fout 5: Waarde ophalen van niet-bestaande sleutel
Probleem: Je probeert een waarde op te halen met een sleutel die niet bestaat. Bij een Dictionary wordt dan automatisch een leeg item aangemaakt!
Oplossing: Controleer altijd eerst met .Exists of de sleutel bestaat:
' GEVAARLIJK - maakt leeg item aan als sleutel niet bestaat:
waarde = dict("onbekend")
' VEILIG:
If dict.Exists("onbekend") Then
waarde = dict("onbekend")
Else
waarde = "Standaardwaarde"
End If
FAQ
Wat is het verschil tussen een Dictionary en een Array in VBA?
Een Array slaat waarden op met een numerieke index (0, 1, 2, …), terwijl een Dictionary waarden opslaat met een zelfgekozen sleutel (tekst of getal). Zoeken in een Dictionary is veel sneller (O(1)) dan zoeken in een Array (O(n)) bij grote datasets. Lees meer over arrays in onze VBA arrays handleiding.
Hoe maak ik een Dictionary hoofdletterongevoelig?
Stel de CompareMode eigenschap in op 1 (vbTextCompare) direct na het aanmaken van de Dictionary, voordat je items toevoegt: dict.CompareMode = 1. Standaard is een Dictionary hoofdlettergevoelig (vbBinaryCompare = 0).
Kan ik objecten opslaan in een Dictionary?
Ja, een Dictionary kan elk type data opslaan, inclusief objecten, arrays en zelfs andere Dictionaries. Gebruik Set bij het toewijzen van objecten: Set dict("obj") = myObject of dict.Add "obj", myObject.
Hoe exporteer ik een Dictionary naar een Excel werkblad?
Loop door de .Keys en .Items van de Dictionary en schrijf deze naar cellen. Gebruik een For Each-lus en een teller om elke sleutel-waarde combinatie naar een rij te schrijven. Zie het praktijkvoorbeeld eerder in dit artikel.
Werkt de Dictionary ook in Excel voor Mac?
Nee, het Scripting.Dictionary object is alleen beschikbaar op Windows. Op Mac kun je als alternatief een VBA Collection gebruiken of een eigen Dictionary-klasse bouwen. Voor lookups kun je ook overwegen om werkbladfuncties te gebruiken.
Hoe verwijder ik duplicaten met een Dictionary?
Voeg alle waarden toe aan een Dictionary als sleutels (met .Exists controle). Omdat sleutels uniek moeten zijn, bevat de Dictionary automatisch alleen unieke waarden. Schrijf daarna de .Keys terug naar het werkblad.
Wat is Early Binding vs Late Binding bij Dictionary?
Early Binding vereist een referentie naar Microsoft Scripting Runtime en biedt IntelliSense en betere prestaties. Late Binding gebruikt CreateObject() en werkt zonder referentie, wat handiger is bij het delen van code. Late Binding is iets langzamer maar flexibeler.
Hoe sorteer ik een Dictionary op sleutel of waarde?
Een Dictionary heeft geen ingebouwde sorteerfunctie. Je moet de sleutels of waarden naar een Array kopieren, deze sorteren, en dan in de gesorteerde volgorde verwerken. Gebruik bijvoorbeeld een Bubble Sort of Quick Sort algoritme op de array.
Gerelateerde VBA-onderwerpen
- VBA voor beginners – Eerste stappen in Excel VBA
- VBA variabelen – Dim, String, Integer en meer
- VBA lussen – For, Do While, For Each
- VBA arrays – Gegevens opslaan in arrays
- VBA foutafhandeling – On Error uitgelegd
- Macro opnemen – Automatiseren zonder code schrijven
Hulp nodig bij Excel?
Kom je er niet uit met VBA Dictionary of andere Excel-automatisering? Ik help je graag verder.
Neem contact op:
– WhatsApp: Stuur een bericht
– E-mail: w.bouwmeester@bouwmeesterconsultancy.nl
– Telefoon: +31 6 28963636
Of bekijk mijn Excel hulp diensten voor professionele ondersteuning.





