使用索引/项目编号循环访问Scripting.Dictionary

Gaf*_*ffi 40 vba 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
Run Code Online (Sandbox Code Playgroud)

使用从零开始的索引,可以获得相同的结果:

For i = 0 To d.Count - 1
    s = d.Item(i)
    Debug.Print s
Next i
Run Code Online (Sandbox Code Playgroud)

看着这个对象,我实际上可以看到它有两个项目,新添加的键是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
Run Code Online (Sandbox Code Playgroud)

但我更好奇为什么我似乎无法按数字迭代项目.

ass*_*ias 39

根据财产的文件Item:

设置或返回Dictionary对象中指定键的项.

在您的情况下,您没有一个键是1这样做的项目:

s = d.Item(i)
Run Code Online (Sandbox Code Playgroud)

实际上在您的字典中创建一个新的键/值对,并且该值为空,因为您没有使用可选newItem参数.

该词典还具有Items方法,其允许遍历索引:

a = d.Items
For i = 0 To d.Count - 1
    s = a(i)
Next i
Run Code Online (Sandbox Code Playgroud)

  • 我遵循这一点,但是,没有办法按索引/项目编号迭代/读取?*如果你问我,看起来像是一个愚蠢的实现.; - )* (2认同)

Cra*_*ker 38

添加到assylias的答案 - assylias向我们展示D.ITEMS是一个返回数组的方法.知道了,我们不需要变量数组a(i)[见下面的警告].我们只需要使用正确的数组语法.

For i = 0 To d.Count - 1
    s = d.Items()(i)
    Debug.Print s
Next i()
Run Code Online (Sandbox Code Playgroud)

KEYS的工作方式相同

For i = 0 To d.Count - 1
    Debug.Print d.Keys()(i), d.Items()(i)
Next i
Run Code Online (Sandbox Code Playgroud)

此语法对SPLIT函数也很有用,这可能有助于使此更清晰.SPLIT还返回一个下限为0的数组.因此,下面打印"C".

Debug.Print Split("A,B,C,D", ",")(2)
Run Code Online (Sandbox Code Playgroud)

SPLIT是一个功能.它的参数在第一组括号中.方法和函数始终使用第一组括号作为参数,即使不需要参数也是如此.在示例中,SPLIT返回数组{"A","B","C","D"}.由于它返回一个数组,我们可以使用第二组括号来识别返回数组中的元素,就像我们任何数组一样.

警告:这种较短的语法可能不如使用变量数组a()在迭代整个字典时有效,因为较短的语法会在每次迭代时调用字典的Items方法.较短的语法最适合从字典中按数字提取单个项目.