Как и в случае с this issue, при использовании объекта Scripting.Dictionary
в VBA результат приведенного ниже кода является неожиданным.Looping через Scripting.Dictionary с использованием индекса/номера позиции
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) также будут.
я могу обойти эту проблему с другими методами сквозных, но это застало меня врасплох, когда я пытался хранить объекты и было получение объекта ожидаемой ошибки на s = d.Item(i)
линии.
Для записи, я знаю, что я могу сделать что-то вроде этого:
For Each v In d.Keys
Set o = d.item(v)
Next v
Но я более любопытно, почему я не могу показаться, чтобы перебирать пункты по номеру.
@assylias Я вижу это в документации '.Item (Key)', но я также вижу '.Key (Key)', хотя я не уверен, как использовать метод 'Key' ... Есть ли способ итерации по номеру позиции? – Gaffi