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

Bru*_*yne 6 vba microsoft-excel

假设我有一个很大的主要例程,它可以做很多事情并调用各种其他程序。

调试时,我会逐步执行主程序,F8以便可以逐行查看正在发生的事情。

但是,当我这样做时,我从那个主子调用的任何例程也会被逐步执行。除了滚动到调用子程序的的End Sub,并放置一个分隔符,是有办法有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
Run Code Online (Sandbox Code Playgroud)

因此,当逐行浏览我的主程序时,我希望能够运行do_things而无需For Each cel in rng...End Sub.

我猜想一个解决方案是让 VBAbreak在碰到一条End Sub线或其他东西时自动运行。我对想法持开放态度,我四处搜索,除了我上面提到的当前解决方案之外,找不到任何真正的东西。

(对不起,如果标题有点笨拙,我真的想不出更好的表达方式 - 随意编辑)。

Bru*_*yne 9

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

当您在该子例程中时(尽管它适用于任何例程),请转到Debug --> Step Out( CTRL+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
Run Code Online (Sandbox Code Playgroud)

.gif 以上内容:

在此处输入图片说明

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

  • 注意:当`do_things rng` 突出显示时,Shift+F8 / "Step Over" 也将运行该过程而不进入它。 (6认同)