Respuestas:
Utilice el método de espera :
Application.Wait Now + #0:00:01#
o (para Excel 2010 y posteriores):
Application.Wait Now + #12:00:01 AM#
Application.Wait(Now + #0:00:01#)
¡Salud!
Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)
por un segundo, Application.wait(now + 0.5e-5)
por medio de un segundo etc.
Agrega esto a tu módulo
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
O, 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
Sleep()
permite especificar tiempos de espera de menos de 1 segundo. Application.Wait
a veces es demasiado granular.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
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 después.
esto funciona perfectamente para mí. inserte cualquier código antes o después del ciclo "hacer hasta". En su caso, coloque las 5 líneas (time1 = & time2 = & "do until" loop) al final dentro de su do loop
sub whatever()
Dim time1, time2
time1 = Now
time2 = Now + TimeValue("0:00:01")
Do Until time1 >= time2
DoEvents
time1 = Now()
Loop
End sub
Timer
porque el Timer
enfoque falla justo antes de la medianoche.
La declaración 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
Timer
da el número de segundos desde la medianoche, entonces este enfoque falla si se ejecuta justo antes de la medianoche (es decir, sngEnd
es> = 86,400). A medianoche, se Timer
restablece a 0 y, por lo tanto, permanece menos de sngEnd
siempre.
La mayoría de las soluciones presentadas utilizan Application.Wait, que no tiene en cuenta el tiempo (milisegundos) ya transcurrido desde que comenzó la cuenta de segundos actual, por lo que tienen una imprecisión intrínseca de hasta 1 segundo .
El enfoque del temporizador es la mejor solución , pero debe tener en cuenta el reinicio a la medianoche, por lo que aquí hay un método de suspensión muy preciso que usa el temporizador:
'You can use integer (1 for 1 second) or single (1.5 for 1 and a half second)
Public Sub Sleep(vSeconds As Variant)
Dim t0 As Single, t1 As Single
t0 = Timer
Do
t1 = Timer
If t1 < t0 Then t1 = t1 + 86400 'Timer overflows at midnight
DoEvents 'optional, to avoid excel freeze while sleeping
Loop Until t1 - t0 >= vSeconds
End Sub
UTILICE ESTO PARA PROBAR CUALQUIER FUNCIÓN DE SUEÑO: (abrir la ventana de depuración inmediata: CTRL + G)
Sub testSleep()
t0 = Timer
Debug.Print "Time before sleep:"; t0 'Timer format is in seconds since midnight
Sleep (1.5)
Debug.Print "Time after sleep:"; Timer
Debug.Print "Slept for:"; Timer - t0; "seconds"
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í tienes 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 "resplandor" en un botón giratorio para dirigir a los usuarios hacia él si "tienen problemas", el uso de "dormir 1000" en el ciclo no dio como resultado un parpadeo visible, pero el ciclo funciona 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
Hice esto para responder al 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
Normalmente uso la función de 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
Timer
da el número de segundos desde la medianoche, entonces este enfoque falla si se ejecuta justo antes de la medianoche (es decir, que T0
es menor que el número de segundos de retraso desde la medianoche). A medianoche, se Timer
restablece a 0 antes de que se alcance el límite de retraso. Delay
nunca alcanza el límite de retardo, por lo que el ciclo se ejecuta para siempre.
Loop Until Delay >= 1
, o corre el riesgo de pasar de 1 y nunca salir del bucle.
Las funciones de espera y suspensión bloquean Excel y no puede hacer nada más hasta que finalice el retraso. Por otro lado, los retardos de bucle no le dan un tiempo exacto para esperar.
Entonces, hice esta solución uniendo un poco de ambos conceptos. Se repite hasta que llega el momento que desea.
Private Sub Waste10Sec()
target = (Now + TimeValue("0:00:10"))
Do
DoEvents 'keeps excel running other stuff
Loop Until Now >= target
End Sub
Solo necesita llamar a Waste10Sec donde necesite el retraso
Puede usar Application.wait now + timevalue ("00:00:01") o Application.wait now + timeserial (0,0,1)
DoEvents
demostración aquí dailydoseofexcel.com/archives/2005/06/14/stopwatch