Цикл по Scripting.Dictionary с использованием индекса / номера элемента
Похожий наЭта проблемапри использованииScripting.Dictionary
объект в VBA, результат кода ниже является неожиданным.
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
Используя нулевой индекс, достигается тот же результат:
For i = 0 To d.Count - 1
s = d.Item(i)
Debug.Print s
Next i
Наблюдая за объектом, я действительно вижу, что у него есть два элемента, ключ для вновь добавленного1
как добавлено изi
, Если я увеличу этот цикл до большего числа, то количество элементов в словаре будет увеличено, один раз для каждого цикла.
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.
Я могу обойти это с другими методами зацикливания, но это застало меня врасплох, когда я пытался хранить объекты и получалobject expected error наs = d.Item(i)
линия.
Для протокола, я знаю, что могу делать такие вещи:
For Each v In d.Keys
Set o = d.item(v)
Next v
Но мне более любопытно, почему я не могу перебирать элементы по номерам.