gpt4 book ai didi

vba - Dictionary.Exists 为变量和常量键返回不同的值

转载 作者:行者123 更新时间:2023-12-04 20:10:40 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Dictionary is populated with an empty item after checking dictionary item in watch window

(1 个回答)


4年前关闭。




我一直在使用 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 时,我实际上得到了 Exists 方法的不同结果。与具有相同值的常数相比 lColLen .这是 Set dColLenFreqs = New Dictionary 行之后的监 window 口状态已执行:
How could this watch window be possible ever?
我尝试切换到后期绑定(bind)并完全限定我的字典变量声明,但这并没有解决问题。
如果相关,该函数的目的是获取字典输入(dRowsInEachCol 是预期的输入,但我修改为在函数内创建字典以消除此问题并缩短代码),并返回字典dRowsInEachCol 中的唯一项作为键,dRowsInEachCol 中每个唯一项的频率作为项。
我想知道:
  • 这只是 Scripting.Dictionary 对象中的一个错误,还是我遗漏了什么?
  • 如果是 Scripting.Dictionary 对象中的错误,有哪些可用的解决方法?我已阅读有关与 mac 兼容的字典类 like this onethis one ,但我担心这些会导致其他故障。这些恐惧有根据吗?另一个想法是只切换到临时 excel 范围或集合和数组,可能包含在一个类中。我也愿意接受其他建议。

  • This previous question似乎也与我的问题有些相关,可能对引用有用。
    编辑 wrt 重复:由于 this question,这被标记为重复,并且在阅读了蒂姆威廉姆斯的答案之后,我可以看到为什么这些问题是相关的,尽管另一个问题是不同的,因为它假设蒂姆威廉姆斯的答案,然后问为什么。我真的没有什么可以添加到我的问题中以进一步区分它,并且我同意链接到另一个问题是有帮助的,但是如果有人遇到与我相同的问题并且没有意识到这是由监 window 口引起的,他们将更有可能在搜索结果中找到这个问题。

    最佳答案

    无法在此处复制 - 在第一次通过循环时,所有三个 Exists 监视值都是错误的。

    你还设置了哪些其他 watch ?有可能另一只 watch 正在改变 Exists结果:在使用 Dictionary 对象时,您需要小心观察窗口。

    例如。看:

    Dictionary is populated with an empty item after checking dictionary item in watch window

    编辑:怀疑,在添加 watch 后

    dColLenFreqs.Item(lColLen) 

    watch 上
    dColLenFreqs.Exists(lColLen) 

    现在输出 True。

    如果您删除所有 watch 并仅查看 Debug 输出,您也会看到它与预期的一样。

    关于vba - Dictionary.Exists 为变量和常量键返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48896394/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com