Depuración de VBA: ¿recorre el programa principal, pero ejecuta rutinas llamadas desde él?

Depuración de VBA: ¿recorre el programa principal, pero ejecuta rutinas llamadas desde él?

Digamos que tengo una gran rutina principal, que hace muchas cosas y llama a varios otros programas.

Al depurar, reviso mi programa principal F8para poder ver línea por línea lo que está sucediendo.

Sin embargo, cuando hago esto, cualquier rutina que llame desde ese sub principal también se ejecuta. En lugar de desplazarse a esa rutina llamada End Suby colocar un descanso, ¿hay alguna manera de que VBA simplemente ejecute esa rutina, pero luego se detenga cuando regrese a mi programa principal?

Actualmente, tengo dos formas de hacer esto. Añadir un salto en la líneadespuésLlamo a un sub, en la rutina PRINCIPAL, o, agrego una interrupción en la End Sublínea de esa rutina llamada.

Por ejemplo,

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

Entonces, cuando reviso mi programa principal línea por línea, me gustaría poder ejecutarlo do_thingssin tener que interrumpir For Each cel in rng..., o End Sub.

Supongo que una solución es tener VBA automáticamente breakcuando llegue a una End Sublínea, o algo así. Estoy abierto a ideas, he buscado y no puedo encontrar nada más que las soluciones actuales que mencioné anteriormente.

(Lo siento si el título es un poco torpe, realmente no se me ocurre una mejor manera de expresarlo; siéntete libre de editarlo).

Respuesta1

Lo hay, aunque puede que no resulte evidente a primera vista.

Cuando estés en esa subrutina (aunque funciona en cualquier rutina), ve a Debug --> Step Out( CTRL+SHIFT+F8).

Esto en realidadcompletoesa rutina, luego vaya a la siguiente línea en el otro código, si corresponde. (En la primera lectura, supuse que simplemente detendría esa rutina en la línea actual y volvería a la rutina que la llamó).

Por ejemplo:

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 de lo anterior:

ingrese la descripción de la imagen aquí

Editar: Un comentario excelente que quería agregar para que esta respuesta sea más completa. Según @MathieuGuindon, cuando la do_things rnglínea está resaltada, puedes hacer Debug --> Step Over( SHIFT+F8) ycorrer do_thingscompletamente y se detendrá en la siguiente línea.

información relacionada