VBA - 从每个字典中的字典中删除项目是否安全?

时间:2016-01-13 23:48:10

标签: excel vba excel-vba dictionary

所以,我对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中处理?

1 个答案:

答案 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