VBA-从for each中的字典中删除项是否安全?

VBA-从for each中的字典中删除项是否安全?,vba,excel,dictionary,Vba,Excel,Dictionary,因此,我对VBA(Visual Basic For Applications)完全没有经验 基本上,我的代码可以在字典中运行,并从字典中删除某些元素。下面是一个快速示例(不在生产代码中): 我知道在某些语言中,这将摆脱底层迭代器。但是,我没有Visual Basic方面的经验,所以我不知道它是如何工作的 我提出这个问题的原因是,上面的代码工作得非常好,而使用这种方法的算法也工作得很好。我只需要确认这在VBA中是一种安全的做法,如果不是,在VBA中通常如何处理此类情况?最后一行说明了这种方法的问题

因此,我对VBA(Visual Basic For Applications)完全没有经验

基本上,我的代码可以在字典中运行,并从字典中删除某些元素。下面是一个快速示例(不在生产代码中):

我知道在某些语言中,这将摆脱底层迭代器。但是,我没有Visual Basic方面的经验,所以我不知道它是如何工作的


我提出这个问题的原因是,上面的代码工作得非常好,而使用这种方法的算法也工作得很好。我只需要确认这在VBA中是一种安全的做法,如果不是,在VBA中通常如何处理此类情况?

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

只要参考
testDict.Item(Key)
就会创建一个不存在的键,因此在尝试检查可能不存在的键的值之前,应该始终使用
testDict.Exists(Key)

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

添加:如果在循环中添加项目,它将不会显示为
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

这可能是一个很好的问题,只要:(a)代码有效,(B)它在任何方面都不是假设的或不完整的。如果您选择转到,请在发帖前阅读。如果您有任何问题或顾虑,请加入我们的讨论。这似乎是一个假设性的问题,在代码审查中是离题的。@Quill这绝对不是一个假设性的问题?上面的代码经过编译并验证有效,问题特别指出它有效,并且如果它是安全的做法:)这个问题是关于堆栈溢出的主题,正如第一个关于主题的原因:收回我的接近票。谢谢大家的教育:)为我给任何人带来的困惑或误解道歉。嘿,蒂姆!感谢您的回复:)好的,那么在使用该项之前最好检查字典中是否存在密钥?或者应该使用另一种方法通过密钥访问项目?另外,为了澄清起见,在for-each期间从字典中删除元素是否是安全操作?我将接受澄清后的答复:)并再次感谢你的答复。
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