我正在使用 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,即使在第一次迭代时也是如此。
答案 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)时,进一步受挫的调试会遇到同样的问题。我建议"失踪"因手表而增加了键。当我删除手表并创建临时工作表以在运行时复制阵列时,不再添加不需要的密钥。