VBA 调试 - 逐步执行主程序,但运行从中调用的例程?

VBA 调试 - 逐步执行主程序,但运行从中调用的例程?

假设我有一个大型的主例程,它可以执行许多操作并调用各种其他程序。

调试时,我逐步执行主程序,F8以便逐行查看发生了什么。

但是,当我这样做时,我从主子程序调用的任何例程也会被逐步执行。除了滚动到调用的例程End Sub并放置一个 Break 之外,有没有办法让 VBA 只运行该例程,然后在我回到主程序时停止?

目前,我有两种方法可以做到这一点。在行中添加换行符我在主例程中调用一个子程序 - 或者 - 我在被调用例程的End Sub行中添加一个断点。

例如,

Sub main_program()
Dim rng As Range
Set rng = Range("A1:Z1000")

do_things rng

Dim cel As Range
For Each cel In rng.SpecialCells(xlCellTypeBlanks)
    Debug.Print cel.Offset(1, 0).Value
Next cel
End Sub

Sub do_things(rng As Range)
Dim cel As Range
For Each cel In rng
    If cel.Value <> "something" Then
        cel.Font.Bold = True
    End If
Next cel
End Sub

因此,当逐行执行主程序时,我希望能够运行而不必在, 或 上do_things设置中断。For Each cel in rng...End Sub

我猜一个解决方案是让 VBAbreak在遇到一行时自动End Sub执行,或者其他什么。我愿意听取各种想法,我已经搜索过,除了上面提到的当前解决方案之外,真的找不到其他解决方案。

(抱歉,如果标题有点笨拙,我真的想不出更好的措辞方式 - 请随意编辑)。

答案1

有——尽管乍一看可能不明显。

当您处于该子程序中时(尽管它适用于任何程序),请转到Debug --> Step OutCTRL+SHIFT+F8)。

这实际上完全的该例程,然后转到另一行代码(如果适用)。(第一次阅读时,我以为它只是在当前行停止该例程,然后返回到调用它的例程)。

例如:

Sub main_program()
Dim rng As Range
Set rng = Range("A1:B10")

do_things rng

Dim cel As Range
For Each cel In rng.SpecialCells(xlCellTypeBlanks)
    Debug.Print cel.Offset(1, 0).Value
Next cel
End Sub

Sub do_things(rng As Range)
Dim cel As Range
For Each cel In rng
    cel.Value = "Test"
Next cel
For Each cel In rng
    If cel.Row Mod 2 = 1 Then cel.EntireRow.Font.Bold = True
Next cel
End Sub

上面的 .gif:

在此处输入图片描述

编辑:我想添加一条很好的评论,以使这个答案更加完整。根据@MathieuGuindon,当该do_things rng行突出显示时,您可以执行Debug --> Step Over( SHIFT+F8) 和跑步 do_things完全停止,然后它会在下一行停止。

相关内容