Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在调用代码时强制VBA编辑器进入中断模式?_Vba_Excel_Ide_Editor - Fatal编程技术网

如何在调用代码时强制VBA编辑器进入中断模式?

如何在调用代码时强制VBA编辑器进入中断模式?,vba,excel,ide,editor,Vba,Excel,Ide,Editor,每当调用VBA代码时,我希望能够打开/关闭进入中断模式的选项。我知道的唯一方法是在代码的所有“入口点”设置断点,或者让这些方法中的每一个都调用单独的函数进行调试 “进入点”可能是按钮点击或工作表事件,而且数量相当多 例如,我可以做: Private Sub bt1Click() callThisOnEveryMethod 'other code End Sub Private Sub bt2Click() callThisOnEveryMethod 'other

每当调用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%的结果,而且这只是为了调试目的而产生的混乱。我也可以在这里添加其他代码,甚至可以将其包装在
中,如果我的\u GLOBAL\u DEBUG\u BOOLEAN then
type语句中,但我仍然需要将此代码(或调用方法)添加到我编写的每个可以启动VBA执行的方法中

想象一下,我可能有100个方法,它们可能是VBA代码执行的开始

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

我想告诉VBA的是,“无论何时开始执行代码,立即中断并进入调试模式,而不考虑断点、断言,并且不要求每个方法都有大量额外的代码。”


这可能吗?

有两种方法可以中断代码并进入调试模式:

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条件
——每次条件返回
False
时,代码将停止。一个样本:

Dim A
A=10
Debug.Assert A<>10   'stopping execution here... entering debugging mode
dima
A=10
Debug.Assert A10'正在此处停止执行。。。进入调试模式

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

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

无论如何,你建议的方法,用
调用thisoneverymethod
,可能是你能得到的最接近的方法。或者实际上,不需要定义新的过程:只需使用

Debug.Assert MY_GLOBAL_DEBUG_BOOLEAN

在进入点过程的顶部,其中
MY_GLOBAL\u DEBUG\u BOOLEAN
是一个公共模块级常量,必须设置为False才能进入调试模式

这不是我真正想要的。我只需插入一个中间方法并在我的代码周围添加大量的
Stop
,就可以更容易地实现这个确切的功能。在维护或最终部署方面,这比这更糟糕…@enderland-因此,使用Debug.Assert然后在Stop(
Debug.Assert False
)或go(
Debug.Assert True
)之间切换其中,
False和True可以作为参数传递。或者…更精确地阐述你需要什么,给出更准确的例子。我澄清了问题。没有简单的方法。因此,
Debug.Assert Condition=False
似乎是最好的选择?这可能是一个XY问题(),这意味着有一个比您建议的解决方案更好的方法来解决您的问题。