Antworten:
Verwenden Sie die Wait-Methode :
Application.Wait Now + #0:00:01#
oder (für Excel 2010 und höher):
Application.Wait Now + #12:00:01 AM#
Application.Wait(Now + #0:00:01#)
Prost!
Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)
für eine Sekunde, Application.wait(now + 0.5e-5)
für eine halbe Sekunde usw.
Fügen Sie dies Ihrem Modul hinzu
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Oder verwenden Sie für 64-Bit-Systeme:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Nennen Sie es in Ihrem Makro wie folgt:
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
Sleep (1000) ' delay 1 second
Loop
End Sub
Sleep()
Sie Wartezeiten von weniger als 1 Sekunde angeben können. Application.Wait
ist manchmal zu körnig.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
anstatt zu verwenden:
Application.Wait(Now + #0:00:01#)
ich bevorzuge:
Application.Wait(Now + TimeValue("00:00:01"))
weil es danach viel einfacher zu lesen ist.
Das funktioniert einwandfrei für mich. Fügen Sie einen beliebigen Code vor oder nach der "do till" -Schleife ein. Fügen Sie in Ihrem Fall die 5 Zeilen (time1 = & time2 = & "do till" -Schleife) am Ende Ihrer do-Schleife ein
sub whatever()
Dim time1, time2
time1 = Now
time2 = Now + TimeValue("0:00:01")
Do Until time1 >= time2
DoEvents
time1 = Now()
Loop
End sub
Timer
da der Timer
Ansatz kurz vor Mitternacht fehlschlägt.
Die Deklaration für Sleep in kernel32.dll funktioniert in 64-Bit-Excel nicht. Dies wäre etwas allgemeiner:
#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
Nur eine bereinigte Version von Clemos Code - funktioniert in Access, das nicht über die Application.Wait-Funktion verfügt.
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
die Anzahl der Sekunden seit Mitternacht angegeben wird, schlägt dieser Ansatz fehl, wenn er kurz vor Mitternacht ausgeführt wird (dh sngEnd
> = 86.400). Timer
Wird um Mitternacht auf 0 zurückgesetzt und bleibt somit weniger als sngEnd
für immer.
Die meisten der vorgestellten Lösungen verwenden Application.Wait, das die Zeit (Millisekunden) nicht berücksichtigt, die bereits seit Beginn der aktuellen Sekundenzählung verstrichen ist, sodass sie eine intrinsische Ungenauigkeit von bis zu 1 Sekunde aufweisen .
Der Timer-Ansatz ist die beste Lösung , aber Sie müssen das Zurücksetzen um Mitternacht berücksichtigen. Hier ist eine sehr genaue Schlafmethode mit 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
VERWENDEN SIE DIESES, UM JEDE SCHLAFFUNKTION ZU TESTEN: (Debug öffnen Sofortiges Fenster: STRG + 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
Hier ist eine Alternative zum Schlafen:
Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub
Im folgenden Code lasse ich einen "Glow" -Effekt auf einer Drehschaltfläche blinken, um Benutzer darauf hinzuweisen, wenn sie "Probleme" haben. Die Verwendung von "sleep 1000" in der Schleife führte zu keinem sichtbaren Blinken, aber die Schleife funktioniert hervorragend.
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
Ich ließ dies machen, um das Problem zu beantworten:
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
Normalerweise verwende ich die Timer- Funktion, um die Anwendung anzuhalten . Fügen Sie diesen Code in Ihren ein
T0 = Timer
Do
Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds
Timer
die Anzahl der Sekunden seit Mitternacht angegeben wird, schlägt dieser Ansatz fehl, wenn er kurz vor Mitternacht ausgeführt wird (dh T0
weniger als die Anzahl der Verzögerungssekunden ab Mitternacht). Timer
Wird um Mitternacht auf 0 zurückgesetzt, bevor das Verzögerungslimit erreicht ist. Delay
erreicht nie die Verzögerungsgrenze, daher läuft die Schleife für immer.
Loop Until Delay >= 1
, da sonst die Gefahr besteht, dass Sie über 1 hinausgehen und die Schleife niemals verlassen.
Wait and Sleep-Funktionen sperren Excel und Sie können nichts anderes tun, bis die Verzögerung beendet ist. Auf der anderen Seite geben Ihnen Loop-Verzögerungen keine genaue Wartezeit.
Also habe ich diese Problemumgehung gemacht, um ein wenig von beiden Konzepten zu verbinden. Es wird so lange wiederholt, bis die gewünschte Zeit erreicht ist.
Private Sub Waste10Sec()
target = (Now + TimeValue("0:00:10"))
Do
DoEvents 'keeps excel running other stuff
Loop Until Now >= target
End Sub
Sie müssen nur Waste10Sec anrufen, wo Sie die Verzögerung benötigen
Sie können Application.wait now + timevalue ("00:00:01") oder Application.wait now + timeserial (0,0,1) verwenden.
DoEvents
wie hier gezeigt. Dailydoseofexcel.com/archives/2005/06/14/stopwatch