martes, 8 de septiembre de 2015

VBA: Retrasando nuestros procedimientos en Excel. Wait, Sleep y Bucles.

Veremos hoy tres trucos para retrasar los procesos de nuestras macros.
En concreto emplearemos una función API (Sleep), un método (Wait) y un bucle (Do..Loop).


Hay que advertir que la forma más exacta es la que resulta de emplear el método .Wait, y que las otras dos formas (bucle y API) son bastante aproximadas.. pero válidas si simplemente queremos dar un intervalo entre partes de nuestros procesos...

Vamos con la primera manera: Empleando bucles para retardar nuestros procedimientos.
Insertamos el código en un módulo estándar de nuestro proyecto de VBA desde el editor de VB.

Sub PasandoElTiempo(contador As Long)
Dim Inicio As Long, Fin As Long

Cuenta = 0
Fin = Cuenta + (contador * 1000)
 
Do Until Inicio >= Fin
    Inicio = Cuenta
    'La función DoEvents entrega la ejecución de la macro para que el sistema operativo pueda procesar otros eventos.
    'además pasa el control de la aplicación para el sistema operativo.
    DoEvents    'evitar siempre que sea posible
    Cuenta = Cuenta + 1
Loop
 
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Pasando()
'Primera parte de nuestro código...
'''''''''''''''''''''''''''''''''''
MsgBox "Hora exacta antes de la espera: " & Format(Time, "hh:mm:ss")

'esperamos durante tres segundos...
'no devuelve una equivalencia lógica 0.001 seg = 1 miliseg !!!
PasandoElTiempo (3)

'Segunda parte de nuestro código...
'''''''''''''''''''''''''''''''''''
MsgBox "Hora exacta tres segundos después: " & Format(Time, "hh:mm:ss")
End Sub


Al lanzar el procedimiento 'Pasando' comprobaremos en el MsgBox de antes y después el tiempo transcurrido... y que es bastante aproximado a los tres segundos perseguidos.

Segunda manera: Empleando la función API Sleep.
Insertamos el código en un módulo estándar de nuestro proyecto de VBA desde el editor de VB.

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)

Sub Durmiendo()
'Primera parte de nuestro código...
'''''''''''''''''''''''''''''''''''
MsgBox "Hora exacta antes de la espera: " & Format(Time, "hh:mm:ss")

'esperamos durante tres segundos...
'no devuelve una equivalencia lógica 0.001 seg = 1 miliseg !!!
Sleep (2000)

'Segunda parte de nuestro código...
'''''''''''''''''''''''''''''''''''
MsgBox "Hora exacta tres segundos después: " & Format(Time, "hh:mm:ss")
End Sub


Fundamental declarar la función Sleep.. ojo!!, valida para versiones de Excel 2010 y +

Tercera manera (la exacta!): Empleando el método .Wait.
Insertamos el código en un módulo estándar de nuestro proyecto de VBA desde el editor de VB.

Sub Esperando()
'Primera parte de nuestro código...
'''''''''''''''''''''''''''''''''''
MsgBox "Hora exacta antes de la espera: " & Format(Time, "hh:mm:ss")

'esperamos durante tres segundos...
Application.Wait (Now + TimeValue("0:00:03"))

'Segunda parte de nuestro código...
'''''''''''''''''''''''''''''''''''
MsgBox "Hora exacta tres segundos después: " & Format(Time, "hh:mm:ss")
End Sub


Esta última es la que nos permite controlar con la máxima exactitud nuestros tiempos de espera o retraso... la más sencilla, y la recomendada por tanto.

No hay comentarios:

Publicar un comentario

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