调用.add()之前添加项的字典对象

时间:2012-07-09 18:25:36

标签: vba scripting dictionary excel-vba excel

我正在使用 MS Scripting Runtime库中的字典对象来存储一系列数组,并根据需要对阵列单元执行操作。有一个for循环来完成创建所有这些条目的过程。我的问题是,在使用.exists属性时,即使在添加项目之前它也会返回True

更紧密的调试表明,即使没有使用.add命令,也会在for循环开始时将密钥添加到字典中,并且在循环结束之前不会使用该密钥。

我尝试了一些不同的配置,但这是一个失败的简单示例:

Dim dTotals As Dictionary
Set dTotals = New Dictionary

dTotals.CompareMode = BinaryCompare

For Each cell In rAppID
    If Not dTotals.Exists(cell) Then
    Set rAppIDCells = Find_Range(cell, rAppID)
    Set rAppIDValues = rAppIDCells.Offset(0, 6)
    dAppIDTotal = WorksheetFunction.Sum(rAppIDValues)
    dTotals.Add Key:=cell.Value, Item:=dAppIDTotal
    End If
Next cell

每个单元格包含字符串/唯一ID。在If语句中,代码返回false,即使在第一次迭代时也是如此。

2 个答案:

答案 0 :(得分:4)

在脚本运行时的official documentation‌中,它说“如果在尝试返回现有项目时未找到密钥,则会创建一个新密钥并将其相应的项目留空。”

...是的,当你在一个循环中进行调试时,它甚至在调用'.exists'函数之前就会弹出天空。一切都很好......

而不是尝试添加刚刚添加的项目,如:

dTotals.Add Key:=cell.Value, Item:=dAppIDTotal

...只需将当前位于您的钥匙的空对象设置为新对象:

dTotals(cell.Value) = dAppIDTotal

所以你的代码块变成了:

If Not dTotals.Exists(cell) Then
    Set rAppIDCells = Find_Range(cell, rAppID)
    Set rAppIDValues = rAppIDCells.Offset(0, 6)
    dAppIDTotal = WorksheetFunction.Sum(rAppIDValues)
    dTotals(cell.Value) = dAppIDTotal
End If

瞧。我倾向于在每次重访VBA时重新发现这个“功能”。如果您因添加不打算存储的新密钥而导致内存泄漏,您可能还会注意到它的影响。

答案 1 :(得分:2)

当我有一个试图返回"缺少"的手表时,我在调试时出现了这个问题。钥匙的项目。实际上,当我真的看了[scriptingdictonaryObject] .exists()condtional)时,进一步受挫的调试会遇到同样的问题。我建议"失踪"因手表而增加了键。当我删除手表并创建临时工作表以在运行时复制阵列时,不再添加不需要的密钥。