Подобно этой проблеме, при использовании объекта 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
. Если я увеличиваю этот цикл до более высокого числа, то количество элементов в словаре увеличивается один раз для каждого цикла.
Я тестировал это в Office/VBA 2003, 2010 и 2013 годах. Все проявляют одинаковое поведение, и я ожидаю, что другие версии (2007) также будут.
Я могу обойти это с помощью других методов looping, но это меня не впечатлило, когда я пытался хранить объекты и получал ожидаемую ошибку объекта в строке s = d.Item(i)
.
Для записи я знаю, что могу делать такие вещи:
For Each v In d.Keys
Set o = d.item(v)
Next v
Но мне больше любопытно, почему я не могу перебирать элементы по номерам.