这个问题在这里已有答案:
我一直在使用MS Scripting Runtime Library词典作为我正在进行的VBA项目的goto数据结构,我遇到了令人沮丧的问题,这让我觉得它们可能并不像我想的那么好他们是。 .Exists
方法似乎是一个非常有用的方法,但当我尝试在For循环中使用它时,我得到了一些奇怪的行为。运行此代码时,我得到了一些奇怪的行为:
Sub TestExists()
Dim i As Long
Dim dRowsInEachCol As Dictionary
Set dRowsInEachCol = New Dictionary
Dim lColLen As Long, lColLenFreq As Long
For i = 0 To 100
dRowsInEachCol.Add i, i
Next
Dim dColLenFreqs As Dictionary
For i = 0 To dRowsInEachCol.Count - 1
lColLen = dRowsInEachCol.Items()(i)
If i = 0 Then
Set dColLenFreqs = New Dictionary
End If
Debug.Print dColLenFreqs.Exists(0), _
dColLenFreqs.Exists(1), _
dColLenFreqs.Exists(lColLen)
If dColLenFreqs.Exists(lColLen) Then
lColLenFreq = dColLenFreqs.Item(lColLen) + 1
Else
lColLenFreq = 1
End If
' 'This will add a new item to dUniqColLengths _
' w/ key = column length, or overwrite item w/ _
' new column number if that key exists already _
' (INTENDED result is unique col lengths only in dict):
dColLenFreqs.Item(lColLen) = lColLenFreq
Next
End Sub
首先,当我创建字典(similar to the issue in this question)时,似乎没有一个项隐式添加的键。但是不能仅仅接受这个问题并解决它的问题,因为当我检查lColLen
与lColLen
具有相同值的常量相比时,我实际上得到了Exists方法的不同结果。这是在执行Set dColLenFreqs = New Dictionary
行之后的观察窗口的状态:
我已经尝试切换到后期绑定并完全限定我的字典变量声明,这并没有解决问题。
如果它是相关的,该函数的目的是获取字典输入(dRowsInEachCol是预期的输入,但我修改为在函数内创建字典以消除此问题并缩短代码),并返回一个字典dRowsInEachCol中的唯一项作为键,以及dRowsInEachCol中每个唯一项的频率作为项。
我想知道:
This previous question似乎与我的问题有些相关,可能对参考有用。
不重要的编辑:由于this question,这被标记为重复,在阅读了Tim Williams的答案之后,我可以看到为什么这些问题是相关的,尽管另一个问题是不同的,因为它假定了Tim Williams的答案,然后问为什么。我没有任何东西可以添加到我的问题中以进一步区分它,我同意链接到另一个问题是有帮助的,所以我会留给社区来决定它是否应该被关闭作为重复。
无法在这里复制 - 在第一次通过循环时,所有三个Exists监视值都是false。
你有什么其他的手表?另一只手表可能正在改变Exists
结果:使用Dictionary对象时需要注意观察窗口。
例如。看到:
Dictionary is populated with an empty item after checking dictionary item in watch window
编辑:怀疑,加入手表后
dColLenFreqs.Item(lColLen)
手表上
dColLenFreqs.Exists(lColLen)
现在输出True。
如果您删除所有手表,只需查看调试输出,您也会看到它按预期方式。