假设我有一个大型的主例程,它可以执行许多操作并调用各种其他程序。
调试时,我逐步执行主程序,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 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
上面的 .gif:
编辑:我想添加一条很好的评论,以使这个答案更加完整。根据@MathieuGuindon,当该do_things rng
行突出显示时,您可以执行Debug --> Step Over
( SHIFT+F8) 和跑步 do_things
完全停止,然后它会在下一行停止。