Цикл по 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

Но мне более любопытно, почему я не могу перебирать элементы по номерам.

Ответы на вопрос(3)

Ваш ответ на вопрос