Chris está desarrollando una macro de Excel que muestra una serie de elementos al usuario. Le gustaría introducir un retraso en la macro de, digamos, un segundo entre cada pieza de información que muestra, y se pregunta si existe una manera fácil de agregar ese retraso.

Hay algunas formas de introducir un retraso en su macro. La forma tradicional es utilizar el método Wait, que se utiliza con el objeto Application. Lo usa para introducir un retraso de un segundo de esta manera:

Application.Wait (Now() + TimeValue("0:00:01"))

Tenga en cuenta que el parámetro requerido por el método Wait es el momento en el que desea que su macro se reanude. En otras palabras, es el momento de «esperar hasta». Es por eso que el ejemplo anterior usa la hora actual (de la función Now) incrementada en un solo segundo.

Si prefiere no usar el método Wait (por cualquier motivo), también puede usar un bucle para esperar su tiempo:

Dim WaitTime As Date

WaitTime = Now() + TimeValue("0:00:01")

Do While Now < WaitTime Loop

Una variante de este enfoque se basa en la función Timer, que devuelve el número de segundos desde la medianoche:

Dim Endpoint as Single

Endpoint = Timer + 1 Do While Timer < Endpoint Loop

Al usar un bucle de esta manera, probablemente no será un gran problema si se demora solo un segundo. Si necesita retrasar más tiempo, probablemente querrá colocar la función DoEvents en el ciclo:

Dim Endpoint as Single

Endpoint = Timer + 1 Do While Timer < Endpoint     DoEvents Loop

La razón es simple: si no lo hace, Excel no responderá a ningún otro evento mientras esté en el ciclo. Esto puede hacer que parezca que su sistema se ha congelado o colgado mientras espera.

Si necesita más granularidad en sus retrasos (hasta el rango de milisegundos), es posible que desee confiar en la función de suspensión, que es parte de la API de Windows. (No es parte de VBA). Para usarlo, necesitará incluir una declaración al comienzo de su módulo, en el área de declaraciones, antes de cualquier procedimiento:

#If VBA7 And Win64 Then     Public Declare PtrSafe Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)

#Else     Public Declare Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)

#End If

Luego, dentro de su macro, puede usar la función Sleep de esta manera:

Sleep(1000)

Esto detiene el sistema durante 1000 milisegundos, que es 1 segundo.

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (5134) se aplica a Microsoft Excel 2007, 2010, 2013 y 2016.