VBA – Dictionary

VBA has a dictionary structure. Dictionary is an object, and it can be referenced either with early binding or with a late binding, referring to Microsoft Scripting Runtime:

Adding the reference to the VBEditor, through Extras>Libraries

What is a dictionary? This is the Microsoft definition of the VBA dictionary:

Dictionary object is the equivalent of a PERL associative array. Items, which can be any form of data, are stored in the array. Each item is associated with a unique key. The key is used to retrieve an individual item and is usually an integer or a string, but can be anything except an array.

With other words, we have some kind of object, that maps values to keys. What does this mean? Let’s imagine we have a dictionary object, to which we want to save some information. E.g., information about two other people and salary. Like this:

Sub MyDictionary()
    
    Dim myDict As New Scripting.Dictionary
    myDict.Add "Peter", "Peter is a friend."
    myDict.Add "George", "George is a guy I know."
    myDict.Add "Salary", 1000
    
    Debug.Print myDict("Peter")
    
End Sub

There “Peter” is a key and “Peter is a friend” is a value. At the end of the program, we request to see the value of the key “Peter”, which is printed in the immediate window. The dictionary object has methods and properties. This is a short presentation of them.

Methods:

Add Adds a new key/item pair to a Dictionary object.
Exists Returns a Boolean value that indicates whether a specified key exists in the Dictionary object.
Items Returns an array of all the items in a Dictionary object.
Keys Returns an array of all the keys in a Dictionary object.
Remove Removes one specified key/item pair from the Dictionary object.
RemoveAll Removes all the key/item pairs in the Dictionary object.

Properties:

CompareMode Sets or returns the comparison mode for comparing keys in a Dictionary object.
Count Returns the number of key/item pairs in a Dictionary object.
Item Sets or returns the value of an item in a Dictionary object.
Key Sets a new key value for an existing key value in a Dictionary object.

What can we do with them? This is an example with all the methods and properties:

Sub MyDictionary()
    
    'Add
    Dim myDict As New Scripting.Dictionary
    myDict.Add "Peter", "Peter is a friend."
    myDict.Add "George", "George is a guy I know."
    myDict.Add "Salary", 1000
    
    'Exists
    If myDict.Exists("Salary") Then
        Debug.Print myDict("Salary")
        myDict("Salary") = myDict("Salary") * 2
        Debug.Print myDict("Salary")
    End If
    
    'Remove
    If myDict.Exists("George") Then
        myDict.Remove ("George")
    End If
    
    'Items
    Dim item As Variant
    For Each item In myDict.Items
        Debug.Print item
    Next item
        
    'Keys
    Dim key As Variant
    For Each key In myDict.Keys
        Debug.Print key
    Next key
    
    'Remove All
    myDict.RemoveAll
    
    'Compare Mode
    myDict.CompareMode = BinaryCompare
    
    myDict.Add "PeTeR", "Peter written as PeTeR"
    myDict.Add "PETeR", "Peter written as PETeR"
    PrintDictionary myDict
    
End Sub

The trick with .CompareMode is that by default its value is set to vbTextCompare, thus “PeTeR” and “PETeR” would not be allowed as different keys. However, once the value is reset to “BinaryCompare”, this is allowed.

True story…