Scripting.Dictionary在不使用Dictionary.Add的情况下添加项目 - BUG?

时间:2018-02-22 13:11:58

标签: excel vba excel-vba dictionary runtime-error

当你看起来值时,Scripting.Dictionary喜欢无缘无故地添加值!用30秒的例子证明:

创建新工作表,然后填写A1:A4 = {1,2,3,4}

插入新的vba模块并添加此代码

Public Sub test()

    Dim rowIndex As Integer
    '
    Dim dict As Scripting.Dictionary
    Set dict = New Scripting.Dictionary

    For rowIndex = 1 To 4

        dict.Add Trim(Sheet1.Cells(rowIndex, 1).Value), rowIndex

        Dim notEvenAddingSoWhyAreYouAdding As Variant
        notEvenAddingSoWhyAreYouAdding = dict(Sheet1.Cells(rowIndex, 1).Value)

    Next rowIndex

End Sub

Next rowIndex

上放置一个断点

运行sub并检查dict的值。它现在有两个值,"1"1,如下图所示:

enter image description here

什么。的。地狱?!

我意识到Trim(...)行中有dict.Add()函数,这意味着有两个不同的键在使用,但为什么在查找时会添加额外的值?!这没有任何意义 - 现在dict.Count不会给出我期望的价值。

2 个答案:

答案 0 :(得分:3)

使用传统的dict.Add< key>,< item>创建一个代表1的字符串(例如"1")和密钥的项目作为数字1。

之后,您快速添加另一个数字1作为键。我个人使用dict.item(1) = "abc"快捷添加/覆盖,但您的方法也适用。

tbh,我甚至不确定.CompareMode = vbTextCompare是否会将strin 1解析为等于数字1.无论如何,您当前正在使用vbBinaryCompare,因此无法匹配。

答案 1 :(得分:3)

正如您所指出的,您有两个不同的键,1"1"。如果您尝试访问字典中尚不存在的密钥,它将自动添加该密钥。这是一种奇怪的行为。

我会用这样的东西:

If dict.Exists(something) Then
    myVariable = dict.Item(something)
End If