与此问题类似,在 VBA 中使用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
,添加 from i
。如果我将此循环增加到更高的数字,则字典中的项目数会增加,每个循环一次。
我已经在 Office/VBA 2003、2010 和 2013 中对此进行了测试。它们都表现出相同的行为,我希望其他版本 (2007) 也会如此。
我可以使用其他循环方法来解决这个问题,但是当我尝试存储对象并且在线上遇到对象预期错误时,这让我措手不及s = d.Item(i)
。
为了记录,我知道我可以做这样的事情:
For Each v In d.Keys
Set o = d.item(v)
Next v
但我更好奇为什么我似乎无法按数字遍历项目。