如何在Excel VBA监视窗口中监视字典中的值?

20
我正在使用Excel VBA中的字典,通过 dict As New Dictionary(并添加对脚本运行时的引用)。当我尝试在调试期间监视它们时,我只能看到字典中的键,而不能看到每个键的相应值。
是否有办法也能看到值呢?这将使我的调试更加容易。
编辑:根据你们的回答,没有简单的解决方案,但我可以做以下事情。
使用全局变量Dim d_obj As Object并不断监视它。每当我需要查找字典的值时,我在立即窗口中输入Set d_obj(key) = ...,然后就可以在监视窗口中看到该值了。
另外,我可以编写一个函数,该函数接受一个字典并将其值作为列表返回,并在立即窗口中类似地使用此函数。感谢大家!

你的意思是你想要看到“值”和“键”吗? - markblandford
1
我只能看到字典中存在的键,但无法看到每个键对应的值。你是如何调试以查看这些值的?在立即窗口中可以使用以下命令:?dict.Item(1) - Siddharth Rout
5
我认为你做不到,最好的方法是@SiddharthRout提出的:在观察窗口中键入dict(yourKey)。请注意,在某些版本的VBA中存在一个错误:如果您在观察窗口中键入dict(aKeyThatDoesNotExist),则该键可能会被创建为空值,这会导致奇怪且难以复制的错误... - assylias
另一种选择是创建一个自定义类,该类具有与字典相同的方法,并包含一个字典和一个数组,每当字典更改时更新数组... 您只需要将声明从“Dim dict as Dictionary”更改为“Dim dict as MyDictionary”。其余部分不变。但这对于调试来说是很多工作... - assylias
1
通常情况下,如果我要在字典中操作一个复杂对象列表,我会在对其进行更改之前将其从字典中分离出来... 就像你上面描述的那样将其赋值给一个对象。这有点繁琐,但是如果你强制类型化该对象,则可以借助IDE的方法/属性类型提示的好处。对我来说,这最终可以节省时间,因为我不必去检查类的方法拼写等。 - Pynner
显示剩余6条评论
2个回答

26

我通常在立即窗口中键入dict.items,然后选择它并按Shift+F9将其插入监视窗口。

另外,这里是一个立即窗口的一行代码,用于列出所有项:

for each i in dic.Items: debug.Print i: next

2
我会使用递归函数,用于在监视窗口中显示所有简单类型变量和所有嵌套字典的内容。这将产生以下形式的输出:Original Answer。
Fred:rabbit; Tiddles:cat; Fluffy:cat; Food:[1:lettuce; 2:biscuits; ]; 

最初的回答:键和值之间用“:”分隔,项目之间用“;”分隔,嵌套字典显示在方括号中。
Public Function DictionaryContents(ByVal dcDictionary, Optional ByVal boolShowKeyIndex As Boolean = False)

  Dim Keys
  Keys = dcDictionary.Keys

  Dim i As Long
  Dim stIndex As String

  Dim stOutput As String
  stOutput = vbNullString

  For i = 0 To dcDictionary.Count - 1

    If boolShowKeyIndex Then
      stIndex = "(" & i & ")"
    End If

    stOutput = stOutput & Keys(i) & stIndex & ":"

    If IsObject(dcDictionary(Keys(i))) Then
      stOutput = stOutput & "[" & DictionaryContents(dcDictionary(Keys(i)), boolShowKeyIndex) & "]"
    Else
      stOutput = stOutput & dcDictionary(Keys(i))
    End If

    stOutput = stOutput & "; "

  Next i

  DictionaryContents = stOutput

End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接