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