VBA断点引入错误?

Posted

技术标签:

【中文标题】VBA断点引入错误?【英文标题】:VBA Breakpoint Introducing Errors? 【发布时间】:2014-02-03 21:43:18 【问题描述】:

有没有人在 VBA 控制台中遇到过断点,实际上会引入错误?这怎么可能发生?

故事的简短版本是,我有一些代码在没有打开断点的情况下执行时按预期工作。但是,当在几个位置(在子例程和类方法中)打开断点时,代码会在单步执行代码时引发莫名其妙的错误。我通常会发现这是一个极不可能的解释,但是在花了 2.5 天尝试调试代码后却发现它在断点关闭的情况下正确执行后,我无法理解可能是什么问题。

详情:

当断点打开时会出现两个不同的错误。

Run-time error '457': This key is already associated with an element of this collection

Run-time error '424': Object required

单步执行代码从断点到行后会出现457错误

 dictE.Add M.SubMatches.Item(0), tmpQ

到达这行代码的条件之一是 dictE.Exists(M.SubMatches.Item(0)) 为 False。

出现457错误时选择Debug后会出现424错误。以同样滑稽的方式,错误将由(不同的)行引发

 pathE = dictE.Item(Matches.Item(i).SubMatches.Item(0)).InFile

到达这行代码的条件之一是 dictE.Exists(Matches.Item(i).SubMatches.Item(0)) 为 True(并且始终定义对象的 .InFile 属性)。

这两个错误都发生在自定义类的同一方法中。我想发布所有相关代码,但它与工作相关且是专有的。任何想法为什么会发生这种情况?这是一个已知的问题?我尝试在谷歌上搜索类似问题的报告,但一无所获。

【问题讨论】:

您是否在断点上使用监视窗口?请参阅@assylias 在此处问题下的评论:***.com/questions/9803708/… 基本上,在中断模式下检查字典对象的键值似乎存在一些问题 - 检查不存在的键值实际上可以添加该键。 @TimWilliams 是的,我在 Watch 窗口中查看了其中一个问题值,但我不确定我是否一直都在那里。我明天可以尝试在没有定义手表的情况下在输入文件的新副本上重现该问题。 +1 @TimWilliams 检查不存在的键值将该键添加到字典:) 【参考方案1】:

不确定它是否与您的问题有关,但这里有一个说明,说明在使用字典并在断点处停止时可能会发生意外情况...

Debug.Print "Break" 上放置一个断点,然后运行这段代码:

Sub Tester()

    Dim d As Object

    Set d = CreateObject("scripting.dictionary")

    d.Add "K1", "first"
    d.Add "K2", "second"
    d.Add "K3", "third"

    Debug.Print d.Count '>>3 - as expected
    Debug.Print "Break" ' Enter '? d("blah")' in Immediate pane
                        '                      while halted here...
    Debug.Print d.Count '>> 4 ! key "blah" was added...

End Sub

【讨论】:

谢谢!就是这样。我用断点测试了我的代码,但在监视窗口中没有表达式,它按预期工作。多么可怕的错误!我花了两天时间拔头发,试图修复一些没有因此而损坏的东西。

以上是关于VBA断点引入错误?的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA SQL 错误,连接失败

VBA 中涉及两个整数和一个长整数的溢出错误

用Excel使用VBA时显示运行错误5,错误调用参数,程序特别简单,如图,求问哪里出错了

Access 2010 VBA 不保存对字段的更改

VBA Excel 2016 中未定义子或函数

关于vba代码错误"91"?