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 - 暂停代码执行的主要内容,如果未能解决你的问题,请参考以下文章

VBA代码在excel中执行需要很长时间

执行代码时,执行不会在 excel vba 函数中移动

添加工作表后,VBA Excel 代码停止执行

EXCEL VBA 窗体显示期间不执行下面代码,也不影响操作工作表?

用python批量执行VBA代码

excel vba 能多线程同时操作吗?