Respostas:
Use o método Wait :
Application.Wait Now + #0:00:01#
ou (para Excel 2010 e posterior):
Application.Wait Now + #12:00:01 AM#
Application.Wait(Now + #0:00:01#)
Saúde!
Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)
por um segundo, Application.wait(now + 0.5e-5)
por meio segundo etc.
Adicione isso ao seu módulo
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Ou, para sistemas de 64 bits, use:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Chame-o em sua macro assim:
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
Sleep (1000) ' delay 1 second
Loop
End Sub
Sleep()
permite especificar tempos de espera de menos de 1 segundo. Application.Wait
às vezes é muito granular.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
ao invés de usar:
Application.Wait(Now + #0:00:01#)
eu prefiro:
Application.Wait(Now + TimeValue("00:00:01"))
porque é muito mais fácil de ler depois.
isso funciona perfeitamente para mim. insira qualquer código antes ou depois do loop "do until". No seu caso, coloque as 5 linhas (time1 = & time2 = & "fazer até" loop) no final dentro do seu loop do
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 a Timer
abordagem falha pouco antes da meia-noite.
A declaração de Suspensão em kernel32.dll não funciona no Excel de 64 bits. Isso seria um pouco mais geral:
#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
Apenas uma versão limpa do código de clemo - funciona no Access, que não tem a função 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
fornecer o número de segundos desde a meia-noite, essa abordagem falhará se for executada um pouco antes da meia-noite (ou seja, sngEnd
se> = 86.400). À meia-noite, Timer
zera para 0 e permanece menos que sngEnd
para sempre.
A maioria das soluções apresentadas utiliza Application.Wait, que não leva em consideração o tempo (milissegundos) já decorrido desde o início da contagem do segundo atual, portanto , possuem uma imprecisão intrínseca de até 1 segundo .
A abordagem do temporizador é a melhor solução , mas você deve levar em conta a redefinição à meia-noite, então aqui está um método muito preciso de dormir usando o 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
USE ISSO PARA TESTAR QUALQUER FUNÇÃO DE SLEEP: (abrir janela imediata de depuração: 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
Aqui está uma alternativa para dormir:
Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub
No código a seguir, faço um efeito de "brilho" piscar em um botão giratório para direcionar os usuários a ele se estiverem "tendo problemas". Usar "sleep 1000" no loop resultou em nenhum piscar visível, mas o loop está funcionando muito bem.
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
Eu fiz isso para responder ao 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
Eu geralmente uso a função Timer para pausar o aplicativo. Insira este código no seu
T0 = Timer
Do
Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds
Timer
fornecer o número de segundos desde a meia-noite, essa abordagem falhará se for executada um pouco antes da meia-noite (ou seja, se T0
for menor que o número de segundos de atraso a partir da meia-noite). À meia-noite, Timer
redefine para 0 antes que o limite de atraso seja atingido. Delay
nunca atinge o limite de atraso, então o loop é executado para sempre.
Loop Until Delay >= 1
, ou corre o risco de passar de 1 e nunca sair do loop.
As funções de espera e suspensão bloqueiam o Excel e você não pode fazer mais nada até que o atraso termine. Por outro lado, os atrasos de loop não fornecem um tempo exato de espera.
Então, fiz esta solução alternativa unindo um pouco de ambos os conceitos. Ele faz um loop até a hora que você deseja.
Private Sub Waste10Sec()
target = (Now + TimeValue("0:00:10"))
Do
DoEvents 'keeps excel running other stuff
Loop Until Now >= target
End Sub
Você só precisa ligar para Waste10Sec onde você precisa do atraso
Você pode usar Application.wait now + timevalue ("00:00:01") ou Application.wait now + timeserial (0,0,1)
DoEvents
demonstração aqui. Dailydoseofexcel.com/archives/2005/06/14/stopwatch