VBA 偵錯 - 單步執行主程序,但運行從中呼叫的例程?

VBA 偵錯 - 單步執行主程序,但運行從中呼叫的例程?

假設我有一個大的主要例程,它可以執行許多操作並呼叫各種其他程式。

調試時,我會單步執行主程序,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完全,它將停在下一行。

相關內容