正如我以前用Python语言编写的那样,我习惯于使用Dictionary的数据结构。现在,我需要在VBA中编程,如果可能的话,我想使用相同的结构。
为了学习VBA中的方法,我编写了这个程序。第一个.count
方法抛出“4”,但第二个.count
方法抛出“5”。当我调试时,我惊讶于一个新的密钥“COSLADA”在dic
中,其值为空。因此,当我打算检索不存在的关键项时,.item()
方法会创建一个空值的新项目,而不是它会引发错误。
Sub Diccionarios()
Dim dic As Scripting.Dictionary
Set dic = New Scripting.Dictionary
With dic
.Add "ALCORCON", "MADRID"
.Add "COLLADO VILLALBA", "MADRID"
.Add "FUENLABRADA", "MADRID"
.Add "TORRREJON DE ARDOZ", "MADRID"
End With
MsgBox dic.Count
MsgBox dic.Item("COSLADA")
MsgBox dic.Count
End Sub
当密钥不存在时,是否还有其他字典方法来检索不创建具有空值的项目的项目值?
答案 0 :(得分:2)
这是众所周知的行为,微软经常会在博客和其他在线广告中受到关注。
“解决方法”(如果您可以将其称为处理已知行为的已知方法)是在请求项目之前使用Scripting.Dictionary的Exists method来测试密钥的存在。
Sub Diccionarios()
Dim dic As Scripting.Dictionary
Set dic = New Scripting.Dictionary
With dic
.Add "ALCORCON", "MADRID"
.Add "COLLADO VILLALBA", "MADRID"
.Add "FUENLABRADA", "MADRID"
.Add "TORRREJON DE ARDOZ", "MADRID"
End With
MsgBox dic.Count
If dic.Exists("COSLADA") Then _
MsgBox dic.Item("COSLADA")
If dic.Exists("FUENLABRADA") Then _
MsgBox dic.Item("FUENLABRADA")
MsgBox dic.Count
End Sub
简单地说,Microsoft Scripting.Dictionary的后端与Python的字典不同,它们的行为不同,因为它们不是同一个东西。我从来没有真正理解为什么这么多人无法理解这一点。