代码之家  ›  专栏  ›  技术社区  ›  3-14159265358979323846264

编写脚本。字典在不使用字典的情况下添加项目。添加-BUG?

  •  6
  • 3-14159265358979323846264  · 技术社区  · 7 年前

    编写脚本。字典喜欢在你查找值的时候无缘无故地添加值!用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 回复  |  直到 7 年前
        1
  •  4
  •   CallumDA    7 年前

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

    我会用这样的东西:

    If dict.Exists(something) Then
        myVariable = dict.Item(something)
    End If
    
        2
  •  3
  •   user4039065 user4039065    7 年前

    将一个键创建为表示1的字符串(例如。 "1" )使用传统的dict.Add<键(>&书信电报;项目(>);。

    紧接着,您可以使用数字1作为键添加另一个快捷方式。就我个人而言,我使用快捷方式添加/覆盖 dict.item(1) = "abc" 但你的方法也很有效。

    tbh,我甚至不确定是否。CompareMode=vbTextCompare将字符串1解析为数字1。无论如何,您当前使用的是vbBinaryCompare,因此无法匹配。