VBA 디버깅 - 기본 프로그램을 단계별로 실행하지만 여기에서 호출되는 루틴을 실행하시겠습니까?

VBA 디버깅 - 기본 프로그램을 단계별로 실행하지만 여기에서 호출되는 루틴을 실행하시겠습니까?

많은 일을 하고 다양한 다른 프로그램을 호출하는 큰 기본 루틴이 있다고 가정해 보겠습니다.

F8디버깅할 때 무슨 일이 일어나고 있는지 한 줄씩 볼 수 있도록 를 사용하여 기본 프로그램을 단계별로 실행합니다 .

그러나 이렇게 하면 해당 메인 서브에서 호출하는 모든 루틴도 단계별로 실행됩니다. 루틴이라는 항목으로 스크롤 End Sub하고 Break를 배치하는 대신 VBA에서 해당 루틴을 실행한 다음 주 프로그램으로 돌아갈 때 중지하도록 하는 방법이 있습니까?

현재 이 작업을 수행하는 방법에는 두 가지가 있습니다. 줄에 나누기 추가~ 후에MAIN 루틴에서 서브를 호출합니다. 또는 루틴의 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완전히 다음 줄에서 멈출 것입니다.

관련 정보