
假設我有一個大的主要例程,它可以執行許多操作並呼叫各種其他程式。
調試時,我會單步執行主程序,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
因此,當逐行瀏覽我的主程式時,我希望能夠運行do_things
而不必在For Each cel in rng...
, 或End Sub
.
我猜想一個解決方案是break
當 VBA 碰到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
完全,它將停在下一行。