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

问题描述 投票:0回答:2

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

是否有任何其他字典方法来检索项目的值,当键不存在时不会创建具有空值的项目?

vba excel dictionary key-value
2个回答
2
投票

这是众所周知的行为,微软经常在博客和其他在线谩骂中受到批评。

“解决方法”(如果您可以将其称为处理已知行为的已知方法)是使用 Scripting.Dictionary 的 Exists 方法 在请求项目之前测试密钥是否存在。

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 的字典不同,它们的行为也不同,因为 它们不是同一件事。我从来没有真正弄清楚为什么这么多人无法理解这一点。


0
投票

旧线程,但这是我最近遇到的非常令人沮丧的问题的答案。

在设置字典变量后,我立即使用 .Add 方法不断收到运行时错误。观察变量表明,一旦 Set 执行,字典变量就已经有了一些键,这在使用 .Add 来获取这些键时会导致运行时错误。

最终确定这是因为某些元素上有一个监视表达式(这样我可以在进一步调试时看到它们的内容),并且在单步执行代码时一旦初始化变量,就会触发元素的创建。删除了监视表达式,运行时错误消失了。还停止使用 .Add 并仅使用分配,该分配会自动添加密钥(如果尚不存在)。 希望这对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.