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

Posted

技术标签:

【中文标题】VBA 中 Scripting.Dictionary 类的 .item() 方法的奇怪行为【英文标题】:Strange behaviour of .item() method of Scripting.Dictionary class in VBA 【发布时间】:2015-06-05 09:43:47 【问题描述】:

正如我之前使用 Python 语言编写的程序一样,我习惯于使用数据的字典结构。现在,我需要在 VBA 中编程,如果可能的话,我想使用相同的结构。

为了学习 VBA 中的方法,我编写了这个程序。第一个.count 方法抛出“4”,但第二个.count 方法抛出“5”。当我调试时,我很惊讶dic 中有一个新键“COSLADA”,其值为空。因此,当我打算检索一个不存在的关键项时,.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

当键不存在时,是否有任何其他 Dictionary 方法可以检索不创建具有空值的项目的项目值?

【问题讨论】:

您需要先使用.Exists方法检查密钥。 【参考方案1】:

这是已知的行为,Microsoft 经常在博客和其他关于它的在线诽谤中受到批评。

“解决方法”(如果您可以将其称为处理已知行为的已知方法)是在请求项目之前使用 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 的字典不同,它们的行为也不同,因为它们不是同一个东西。我从来没有真正弄清楚为什么这么多人无法理解这一点。

【讨论】:

以上是关于VBA 中 Scripting.Dictionary 类的 .item() 方法的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

VBA-在VBA中使用公式

excel中使用vba以只读方式打开工作薄的操作方法

vba中怎么将变量的值变为字符串

在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA

vba中怎么遍历单元格中所有字符串

如何在excel的vba中进行繁简转换