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.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…