Depuração VBA - percorre o programa principal, mas executa rotinas chamadas a partir dele?

Depuração VBA - percorre o programa principal, mas executa rotinas chamadas a partir dele?

Digamos que eu tenha uma rotina primária grande, que faz muitas coisas e chama vários outros programas.

Ao depurar, percorro meu programa principal F8para poder ver linha por linha o que está acontecendo.

No entanto, quando faço isso, todas as rotinas que eu chamo desse sub principal também são executadas. Em vez de rolar até aquela chamada rotina End Sube colocar um Break, existe uma maneira de fazer com que o VBA apenas execute essa rotina, mas pare quando eu voltar ao meu programa principal?

Atualmente, tenho duas maneiras de fazer isso. Adicione uma quebra na linhadepoisEu chamo um sub, na rotina MAIN - ou - adiciono uma quebra na End Sublinha da rotina chamada.

Por exemplo,

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

Então, ao passar pelo meu programa principal linha por linha, gostaria de poder executá-lo do_thingssem precisar interromper o For Each cel in rng..., ou o End Sub.

Eu acho que uma solução é ter o VBA automaticamente breakquando ele atinge uma End Sublinha ou algo assim. Estou aberto a ideias, pesquisei e não consigo encontrar nada além das soluções atuais que mencionei acima.

(Desculpe se o título é um pouco desajeitado, não consegui pensar em uma maneira melhor de expressá-lo - fique à vontade para editar).

Responder1

Existe - embora possa não ser óbvio à primeira vista.

Quando estiver nessa sub-rotina (embora funcione em qualquer rotina), vá em Debug --> Step Out( CTRL+SHIFT+F8).

Isto irá realmentecompletoessa rotina e, em seguida, vá para a próxima linha no outro código, se aplicável. (Na primeira leitura, presumi que ele simplesmente interrompesse a rotina na linha atual e voltaria para a rotina que a chamou).

Por exemplo:

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 do acima:

insira a descrição da imagem aqui

Editar: um excelente comentário que gostaria de adicionar para tornar esta resposta mais completa. Por @MathieuGuindon, quando a do_things rnglinha estiver destacada, você pode fazer Debug --> Step Over( SHIFT+F8) ecorrer do_thingscompletamente e irá parar na próxima linha.

informação relacionada