所以,我对VBA(Visual Basic For Applications)完全缺乏经验。
基本上,我有通过字典运行的代码并从中删除某些元素。这是一个简单的例子(不在生产代码中):
Dim testDict As New Scripting.Dictionary
testDict.Add 1, 5
testDict.Add 2, 10
testDict.Add 3, 15
testDict.Add 4, 20
testDict.Add 5, 25
testDict.Add 6, 30
Dim Key As Variant
For Each Key In testDict.Keys()
If testDict.Item(Key) = 5 Then
testDict.Remove (Key)
End If
If testDict.Item(Key) = 20 Then
testDict.Remove (Key)
End If
Next Key
我知道在某些语言中,这会抛弃底层的迭代器。但是我没有Visual Basic的经验,所以我不知道它是如何工作的。
我问的原因是上面的代码工作得很好,使用这种方法的算法也很好用。我只需要验证这是VBA中的安全做法,如果没有,这些案例通常如何在VBA中处理?
答案 0 :(得分:1)
最后一行说明了这种方法的问题。
只要提及testDict.Item(Key)
,就会创建一个密钥,如果它不存在,那么在尝试检查可能不存在的密钥值之前,应始终使用testDict.Exists(Key)
。< / p>
至于在循环键的同时进行删除,如果你想确定然后从抓取密钥的副本开始并循环...
添加:如果您在循环中添加项目,它将不会显示为Key
变量的值。
Sub TT()
Dim testDict As New Scripting.Dictionary
testDict.Add 1, 5
testDict.Add 2, 10
testDict.Add 3, 15
testDict.Add 4, 20
testDict.Add 5, 25
testDict.Add 6, 30
Dim Key As Variant
For Each Key In testDict.Keys()
If testDict.Item(Key) = 5 Then
testDict.Remove (Key)
Debug.Print "Removed ", Key
End If
If testDict.Item(Key) = 20 Then
testDict.Remove (Key)
Debug.Print "Removed ", Key
End If
Next Key
'>>> Removed 1
'>>> Removed 4
Debug.Print Join(testDict.Keys, ",")
'>>> 2,3,5,6,1
End Sub