¿Cómo hacer una pausa por una cantidad específica de tiempo? (Excel / VBA)

Tengo una hoja de cálculo de Excel que tiene la siguiente macro. Me gustaría repetirlo cada segundo, pero me daña si puedo encontrar la función para hacerlo. ¿No es posible?

Sub Macro1() ' ' Macro1 Macro ' Do Calculate 'Here I want to wait for one second Loop End Sub 

Use el método de espera :

 Application.Wait Now + #0:00:01# 

o (para Excel 2010 y posterior):

 Application.Wait Now + #12:00:01 AM# 

Agrega esto a tu módulo

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

O bien, para sistemas de 64 bits, use:

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

Llámalo en tu macro así:

 Sub Macro1() ' ' Macro1 Macro ' Do Calculate Sleep (1000) ' delay 1 second Loop End Sub 

En lugar de usar:

 Application.Wait(Now + #0:00:01#) 

yo prefiero:

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

porque es mucho más fácil de leer luego.

esto funciona a la perfección para mí. inserte cualquier código antes o después del ciclo “do until”. En tu caso, coloca el lazo de 5 líneas (time1 = & time2 = & “do until”) al final dentro de tu ciclo do

 sub whatever() Dim time1, time2 time1 = Now time2 = Now + TimeValue("0:00:01") Do Until time1 >= time2 DoEvents time1 = Now() Loop End sub 

La statement de Suspensión en kernel32.dll no funcionará en Excel de 64 bits. Esto sería un poco más general:

 #If VBA7 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 

Solo una versión limpia del código de Clemo: funciona en Access, que no tiene la función Application.Wait.

 Public Sub Pause(sngSecs As Single) Dim sngEnd As Single sngEnd = Timer + sngSecs While Timer < sngEnd DoEvents Wend End Sub Public Sub TestPause() Pause 1 MsgBox "done" End Sub 

Application.Wait Second(Now) + 1

 Function Delay(ByVal T As Integer) 'Function can be used to introduce a delay of up to 99 seconds 'Call Function ex: Delay 2 {introduces a 2 second delay before execution of code resumes} strT = Mid((100 + T), 2, 2) strSecsDelay = "00:00:" & strT Application.Wait (Now + TimeValue(strSecsDelay)) End Function 

Aquí hay una alternativa para dormir:

 Sub TDelay(delay As Long) Dim n As Long For n = 1 To delay DoEvents Next n End Sub 

En el siguiente código hago parpadear un efecto de “resplandor” en un botón de giro para dirigir a los usuarios hacia él si están “teniendo problemas”, usar “dormir 1000” en el bucle no produce un parpadeo visible, pero el bucle está funcionando muy bien.

 Sub SpinFocus() Dim i As Long For i = 1 To 3 '3 blinks Worksheets(2).Shapes("SpinGlow").ZOrder (msoBringToFront) TDelay (10000) 'this makes the glow stay lit longer than not, looks nice. Worksheets(2).Shapes("SpinGlow").ZOrder (msoSendBackward) TDelay (100) Next i End Sub 

He hecho esto para responder el problema:

 Sub goTIMER(NumOfSeconds As Long) 'in (seconds) as: call gotimer (1) 'seconds Application.Wait now + NumOfSeconds / 86400# 'Application.Wait (Now + TimeValue("0:00:05")) 'other Application.EnableEvents = True 'EVENTS End Sub 

Usualmente uso la función del temporizador para pausar la aplicación. Inserta este código en el tuyo

 T0 = Timer Do Delay = Timer - T0 Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds 

Prueba esto :

 Threading.thread.sleep(1000)