jueves, 27 de junio de 2019

VBA: Detener una macro desde otra

En ocasiones necesitamos parar o detener nuestras macros en ejecución...
[...]Quiero que mi macro mande a cerrar una macro de otro libro[...]

Habitualmente las macros se pueden detener desde el código de la propia macro (End, Exit) o bien manualmente a veces presionando las teclas:
Esc
o quizá Ctrl+break/pause

Esto suele ser suficiente... aunque en ocasiones no es todo lo efectivo que desearíamos.


Hoy veremos cómo configurar nuestras macros para que en cualquier momento del proceso en ejecución de una primera macro, poder detenerla desde una segunda.
Para ello emplearemos la función DOEVENTS, sabiendo que DoEvents transfiere el control al sistema operativo.
DoEvents es útil principalmente para acciones sencillas como permitir a un usuario que cancele un proceso después de que se haya iniciado, ya que la tarea puede continuar completamente independiente de la aplicación y el sistema operativo se encarga de la 'multitarea' y el rebanado de tiempo.

OJO!!: No uses DoEvents si otras aplicaciones pueden interactuar con el procedimiento de manera imprevista durante el tiempo que ha producido la ejecución del control.


Para mostrar el caso insertaremos dos controles 'CommadButton' tipo ActiveX con el código adjunto.

VBA: Detener una macro desde otra



Insertamos en la ventana de código de la hoja el siguiente código:

Dim ParadaEmergencia As Boolean

Private Sub CommandButton1_Click()
'iniciamos con la variable a FALSE
ParadaEmergencia = False

'lanzamos a modo de ejemplo un proceso largo
For i = 1 To 50000
    'reflejamos el dato en A1
    Range("A1").Value = i
    'Pasamos la ejecución de modo que el sistema operativo pueda procesar otros eventos.
    DoEvents
    'y controlamos la posible salida el bucle con un Exit
    If ParadaEmergencia = True Then Exit For
Next i
End Sub


Private Sub CommandButton2_Click()
'cambiamos el estado de la variable a TRUE
ParadaEmergencia = True
End Sub



Podemos comprobar si lanzamos la primera macro con el CommandButton1 (Ejecutar), en cualquier momento podemos detenerla presionando el segundo CommandButton2 (Detener).

Importante la definición de nuestra variable ParadaEmergencia al principio de la ventana, no incluida en ninguno de los procedimientos... así nos aseguramos su uso compartido entre las dos macros.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.