没有人能提供一个例子脚本.字典 https://msdn.microsoft.com/en-us/library/office/gg251825.aspx对象以与添加顺序不同的顺序返回键/项目,因为 Scripting.Dictionary不这样做。绝不。如果您按渐进顺序添加以下键/项目对,那么这就是它们的返回方式。
key item
1 A
2 B
3 C
4 D
'enumerate by key
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add Key:=1, Item:="A"
dict.Add Key:=2, Item:="B"
dict.Add Key:=3, Item:="C"
dict.Add Key:=4, Item:="D"
Dim k As Variant
For Each k In dict.Keys
Debug.Print k & " - " & dict.Item(k)
Next k
您可能指的是添加键的简写“覆盖”方法,而不检查它们是否存在。如果你尝试.Add https://msdn.microsoft.com/en-us/library/5h92h863.aspx存在密钥时会抛出错误 457。但是,如果你简单地写Keys https://msdn.microsoft.com/en-us/library/etzd1tzc.aspx and Items https://msdn.microsoft.com/en-us/library/8aet97f2.aspx如果该键不存在,则将在字典中创建一个新键和项目,但如果该键存在,则该键保持不变并且该项目将被覆盖。
key item
1 A
2 B
3 C
4 D
2 E
'enumerate by key
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Item(1) = "A"
dict.Item(2) = "B"
dict.Item(3) = "C"
dict.Item(4) = "D"
dict.Item(2) = "E" 'the second entry's item is overwritten
Dim k As Variant
For Each k In dict.Keys
Debug.Print k & " - " & dict.Item(k)
Next k
覆盖方法比检查密钥是否快一点.Exists https://msdn.microsoft.com/en-us/library/office/gg251562.aspx但这种行为应该被理解。我使用覆盖来有意检索具有重复键的列表中任何键的最后一项,但这是一种特殊情况。请注意,2 .Key https://msdn.microsoft.com/en-us/library/1ex01tte.aspx没有打乱原来的顺序;它只是有它的.Item https://msdn.microsoft.com/en-us/library/84k9x471.aspx替换为后一个。
如果您已添加 Microsoft Scripting Runtime 参考库,则可以使用早期绑定 https://msdn.microsoft.com/en-us/library/0tcf61s1.aspx在你的变量声明中。这样做的好处是创建稍微快一点的字典对象并公开索引枚举的其他方法。
Dim dict As New Scripting.Dictionary
'enumerate by index position (zero-based index)
Dim i As Long
For i = 0 To dict.Count - 1
Debug.Print dict.Keys(i) & " - " & dict.Items(i)
Next i
'enumerate as elements of an array
Dim a As Long
For a = LBound(dict.Keys) To UBound(dict.Keys)
Debug.Print dict.Keys(a) & " - " & dict.Items(a)
Next a
fwiw,我发现当字典的索引枚举不可靠时.Count https://msdn.microsoft.com/en-us/library/5t9h9579.aspx超过有符号整数 (32,767)。
最后,钥匙/物品对可以一次删除一个或一次全部删除。
dict.Remove 2 'remove by key
dict.Remove dict.Keys(0) 'remove first key/item by index position
dict.Remove dict.Keys(UBound(dict.Keys)) 'remove last key/item by index position
dict.RemoveAll 'remove all