
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 Sub
e 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 Sub
linha 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_things
sem precisar interromper o For Each cel in rng...
, ou o End Sub
.
Eu acho que uma solução é ter o VBA automaticamente break
quando ele atinge uma End Sub
linha 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:
Editar: um excelente comentário que gostaria de adicionar para tornar esta resposta mais completa. Por @MathieuGuindon, quando a do_things rng
linha estiver destacada, você pode fazer Debug --> Step Over
( SHIFT+F8) ecorrer do_things
completamente e irá parar na próxima linha.