与此问题类似,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
设置或返回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)
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方法.较短的语法最适合从字典中按数字提取单个项目.
归档时间: |
|
查看次数: |
99274 次 |
最近记录: |