Risposte:
Usa il metodo Wait :
Application.Wait Now + #0:00:01#
oppure (per Excel 2010 e versioni successive):
Application.Wait Now + #12:00:01 AM#
Application.Wait(Now + #0:00:01#)Salute!
Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)per un secondo, Application.wait(now + 0.5e-5)per mezzo secondo ecc.
Aggiungilo al tuo modulo
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Oppure, per i sistemi a 64 bit, utilizzare:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Chiamalo nella tua macro in questo modo:
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
Sleep (1000) ' delay 1 second
Loop
End Sub
Sleep()consente di specificare tempi di attesa inferiori a 1 secondo. Application.Waita volte è troppo granulare.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
invece di usare:
Application.Wait(Now + #0:00:01#)
preferisco:
Application.Wait(Now + TimeValue("00:00:01"))
perché è molto più facile leggere dopo.
questo funziona perfettamente per me. inserire qualsiasi codice prima o dopo il ciclo "do until". Nel tuo caso, metti le 5 righe (time1 = & time2 = & "do until" loop) alla fine del tuo 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
Timerperché l' Timerapproccio fallisce poco prima di mezzanotte.
La dichiarazione per Sleep in kernel32.dll non funzionerà in Excel a 64 bit. Questo sarebbe un po 'più generale:
#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 versione pulita del codice di clemo - funziona in Access, che non ha la funzione 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
Timerfornisce il numero di secondi trascorsi dalla mezzanotte, allora questo approccio fallisce se viene eseguito appena prima della mezzanotte (cioè, tale che sngEndsia> = 86.400). A mezzanotte, si Timerripristina a 0 e quindi rimane inferiore sngEndper sempre.
La maggior parte delle soluzioni presentate utilizza Application.Wait, che non tiene conto del tempo (millisecondi) già trascorso dall'inizio del conteggio dei secondi correnti, quindi hanno un'imprecisione intrinseca fino a 1 secondo .
L'approccio Timer è la soluzione migliore , ma devi tenere in considerazione il ripristino a mezzanotte, quindi ecco un metodo Sleep molto preciso utilizzando Timer:
'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
USARE QUESTO PER TESTARE QUALSIASI FUNZIONE SLEEP: (aprire la finestra di debug Immediata: 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
Ecco un'alternativa al sonno:
Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub
Nel codice seguente faccio lampeggiare un effetto "bagliore" su un pulsante di selezione per indirizzare gli utenti ad esso se stanno "avendo problemi", l'uso di "sleep 1000" nel ciclo non ha prodotto lampeggi visibili, ma il ciclo funziona alla grande.
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
ho fatto questo per rispondere 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
Di solito utilizzo la funzione Timer per mettere in pausa l'applicazione. Inserisci questo codice nel tuo
T0 = Timer
Do
Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds
Timerfornisce il numero di secondi trascorsi dalla mezzanotte, allora questo approccio fallisce se viene eseguito appena prima di mezzanotte (cioè, tale che T0è inferiore al numero di secondi di ritardo dalla mezzanotte). A mezzanotte, si Timerripristina a 0 prima che venga raggiunto il limite di ritardo. Delaynon raggiunge mai il limite di ritardo, quindi il ciclo viene eseguito per sempre.
Loop Until Delay >= 1, altrimenti rischi di andare oltre 1 e non uscire mai dal ciclo.
Le funzioni di attesa e sospensione bloccano Excel e non puoi fare nient'altro fino al termine del ritardo. D'altra parte, i ritardi del ciclo non ti danno un tempo esatto di attesa.
Quindi, ho creato questa soluzione unendo un po 'di entrambi i concetti. Continua fino a quando il tempo è il tempo che desideri.
Private Sub Waste10Sec()
target = (Now + TimeValue("0:00:10"))
Do
DoEvents 'keeps excel running other stuff
Loop Until Now >= target
End Sub
Devi solo chiamare Waste10Sec dove hai bisogno del ritardo
Puoi utilizzare Application.wait ora + timevalue ("00:00:01") o Application.wait ora + timeserial (0,0,1)
DoEventscome demo