Excel VBA - 暂停代码执行
Posted
技术标签:
【中文标题】Excel VBA - 暂停代码执行【英文标题】:Excel VBA - Pause code execution 【发布时间】:2015-10-19 06:06:19 【问题描述】:我有一个复杂的 VBA 函数和一个包含多个工作表的工作簿。 假设代码遍历 Sheet1 的每一行并对这些数据进行处理。
我希望能够在 SourceRow = 16
上暂停,查看我在不同工作表上得到的结果,然后继续(按确定,或击键)
我试过了
If SourceRow = 16 Then
MsgBox "ReachedRow 16"
End If
但是消息框是模态的,我无法切换到不同的工作表来查看数据。
附: 16 仅作为示例,暂时硬编码,但以后不会。
【问题讨论】:
Debug.Assert False
?
断点是否足够?这将允许代码在到达一行时停止(可以在 If 语句内),然后允许您更改工作表等,然后恢复代码
@Evan 我同意断点是一个可能的选择,但是当我做鲍里斯所指的事情时,如果我在循环中包含一个特定点的中断并且需要添加一个“if i = x”语句,然后按照 Joshua 的说明使用 Stop,这样就不需要添加额外的代码行来单击断点。
【参考方案1】:
您可以使用Stop
语句然后按F5 来恢复代码执行。这类似于添加断点。
If SourceRow = 16 Then
Stop
End If
该行在暂停时将突出显示为黄色,您应该能够浏览工作表。
例子:
您可以以类似的方式使用Debug.Assert (sourcerow <> 16)
,它会在sourcerow<>16
计算结果为false 时暂停代码,也就是说,当sourcerow 等于16 时。(感谢RBarryYoung 的评论)
如果您不希望代码永久停止,请考虑通过单击 VB 编辑器中编辑窗口左侧的灰色区域来添加断点,该区域应如下所示:
到达该行时代码将停止。再次按 F5 以恢复代码执行。或者,您可以连续按 F8 以逐行浏览代码。这消除了设置许多断点的需要。
只需单击栗色圆圈即可解除断点。断点不会保存在您的代码中,因此这是一种临时方法(与上面列出的两种方法相反,如果您保存工作簿,它们将保留在您的 VBA 代码中)。
图片取自this tutorial from Wise Owl关于断点。
【讨论】:
其实你可以只使用Debug.Assert (SourceRow <> 16)
而不用If
结构也可以。
已更新,因为这是更好的方法。【参考方案2】:
-
右键单击
SourceRow
(代码中的任意位置),然后单击Add Watch...
。
在出现的对话框中,在Expression
文本框中输入以下内容:
SourceRow = 16
在Watch Type
下,选择Break when value is True
。
点击OK
。
当达到该值时,这将自动导致您的程序中断/暂停,并且无需仅为调试/暂停目的添加任何新代码。
【讨论】:
谢谢!我一直不知道如何处理“观看”。每天学些新东西。 :thumbsup: (快速提问:你认为添加一些“手表”而不是在代码中使用 5 个“中断”更好吗?或者它是 100% 的用户偏好,并且两者都完成相同的操作?) 这是一个可以单独提出的问题,并且会产生很多 cmets。监视更多的是关于变量检查,断点更多的是关于暂停执行。但是,许多调试器(如 VBA 的)在其 watch 中构建了一些断点功能,因此您可以创建本质上是条件断点的东西。 Watch 最酷的地方在于,如果代码很长,您不必找出所有断点。此外,您可能希望也可能不希望根据条件在一行上中断,而断点总是会在那里中断。如果你的条件是 i = 5,那么 Watch 每次 i = 5 都会断码,这样就更强大了。 @DavidGM - 这是一个很好的观点。我使用了一些断点,但只有它们是因为我正在等待循环达到某个值。这对我来说是一个令人惊讶的富有成果的线程。谢谢你们!!以上是关于Excel VBA - 暂停代码执行的主要内容,如果未能解决你的问题,请参考以下文章