VBA中Scripting.Dictionary类的.item()方法的奇怪行为

时间:2015-06-05 09:43:48

标签: vba excel-vba dictionary key-value excel

正如我以前用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

当密钥不存在时,是否还有其他字典方法来检索不创建具有空值的项目的项目值?

1 个答案:

答案 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的字典不同,它们的行为不同,因为它们不是同一个东西。我从来没有真正理解为什么这么多人无法理解这一点。