Looping through a Scripting.Dictionary using index/item number
dictionary, vba
Solution
According to the documentation of the `Item` property:
Sets or returns an item for a specified key in a Dictionary object.
In your case, you don't have an item whose key is `1` so doing:
s = d.Item(i)
actually creates a new key / value pair in your dictionary, and the value is empty because you have not used the optional `newItem` argument.
The Dictionary also has the `Items` method which allows looping over the indices:
a = d.Items
For i = 0 To d.Count - 1
s = a(i)
Next i
Problem
Similar to this issue, when using a `Scripting.Dictionary` object in VBA, the outcome of the code below is unexpected. ``` Option Explicit Sub test() Dim d As Variant Dim i As Integer Dim s As String Set d = CreateObject("Scripting.Dictionary") d.Add "a", "a" Debug.Print d.Count ' Prints '1' as expected For i = 1 To d.Count s = d.Item(i) Debug.Print s ' Prints ' ' (null) instead of 'a' Next i Debug.Print d.Count ' Prints '2' instead of '1' End Sub ``` Using a zero-based index, the same outcome is achieved: ``` For i = 0 To d.Count - 1 s = d.Item(i) Debug.Print s Next i ``` Watching the object, I can actually see that it has two items, the key for the newly added is `1`, as added from `i`. If I increase this loop to a higher number, then the number of items in the dictionary is increased, once for each loop. I have tested this in Office/VBA 2003, 2010, and 2013. All exhibit the same behavior, and I expect other versions (2007) will as well. I can work around this with other looping methods, but this caught me off guard when I was trying to store objects and was getting an object expected error on the `s = d.Item(i)` line. For the record, I know that I can do things like this: ``` For Each v In d.Keys Set o = d.item(v) Next v ``` But I'm more curious about why I can't seem to iterate through the items by number.