VBA – 从一个字典中删除项目是否安全?

所以,我对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的经验,所以我不知道它是如何工作的。

我问的原因是上面的代码工作得很好,使用这种方法的algorithm也很好。 我只需要certificate在VBA中这是一个安全的做法,如果不是这样的话,在VBA中这些情况如何处理呢?

最后一行说明了这种方法的问题。

只要引用testDict.Item(Key)将会创build一个密钥(如果它不存在),所以在尝试检查可能不存在的密钥的值之前,应始终使用testDict.Exists(Key)

至于在循环键的同时进行删除,如果你想确定,那么先抓住一个键的副本,并循环… …

补充:如果在循环中添加一个项目,它将不会显示为Keyvariables的值。

 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