6

我希望能够在调用我的 VBA 代码时打开/关闭进入中断模式的选项。我知道这样做的唯一方法是在代码的所有“入口点”设置断点,或者让这些方法中的每一个都调用一个单独的函数以进行调试。

“入口点”可能是按钮点击或工作表事件,其中有很多。

例如,我可以这样做:

Private Sub bt1Click()
    callThisOnEveryMethod
    'other code
End Sub
Private Sub bt2Click()
    callThisOnEveryMethod
    'other code
End Sub
'etc, repeat 100 times
Private Sub callThisOnEveryMethod()
    'set breakpoint on this method
End Sub

这并不是很理想,因为我依赖于我将其添加到每个方法和每个后续方法中。我真的不相信自己能以这种方式获得 100% 的结果,而且仅出于调试目的而出现很多混乱。我也可以在此处添加其他代码,甚至将其包装在if MY_GLOBAL_DEBUG_BOOLEAN then类型语句中,但我仍然需要将此代码(或调用方法)添加到我编写的每个可以启动 VBA 执行的方法中。

想象一下,我可能有 100 个方法可以作为 VBA 代码执行的开始。

每次我想这样做时,在每个方法上设置和删除断点也不理想,因为要打开/关闭的数量。

我想以某种方式告诉 VBA “无论何时开始执行代码,立即中断并进入调试模式,而不管断点、断言如何,并且不需要每个方法都有很多额外的代码。”

这可能吗?

4

2 回答 2

12

有两个选项可以中断代码并进入调试模式:

a) 简单的Stop指令:

Sub MyProcedure()
   '...any code here
   Stop     'execution will stop here, debugging will start here
   '...the rest of the code
End sub

b) 以Debug.Assert False这种方式:

Sub MyProcedure()
   '...any code here
   Debug.Assert False     'execution will stop here, debugging will start here
   '...the rest of the code
End sub

但是,您可以使用任何条件Debug.Assert Condition- 每次条件将返回False,代码将停止。一个样本:

Dim A
A=10
Debug.Assert A<>10   'stopping execution here... entering debugging mode
于 2013-11-05T20:10:55.413 回答
3

恐怕答案是否定的,如果不在每个入口点程序中插入代码或断点,就无法做到这一点。

为什么没有办法做到这一点?好吧,真正的问题是,为什么要有办法做到这一点?重点是什么?永久调试模式没有意义。调试模式的想法是当且仅当您需要调试特定过程或错误时才进入它。我不确定你到底想达到什么目的?

无论如何,您建议的方式callThisOnEveryMethod可能是您可以获得的最接近的方式。或者实际上,不需要定义一个新的过程:只需使用

Debug.Assert MY_GLOBAL_DEBUG_BOOLEAN

在入口点程序的顶部,其中MY_GLOBAL_DEBUG_BOOLEAN是一个公共模块级常量,必须将其设置为 False 才能进入调试模式。

于 2013-11-05T21:13:39.060 回答