
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 Sub
y 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 Sub
lí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_things
sin tener que interrumpir For Each cel in rng...
, o End Sub
.
Supongo que una solución es tener VBA automáticamente break
cuando llegue a una End Sub
lí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:
Editar: Un comentario excelente que quería agregar para que esta respuesta sea más completa. Según @MathieuGuindon, cuando la do_things rng
línea está resaltada, puedes hacer Debug --> Step Over
( SHIFT+F8) ycorrer do_things
completamente y se detendrá en la siguiente línea.