2009-10-09 11 views
70

Ich habe ein Excel-Arbeitsblatt, das das folgende Makro hat. Ich würde es gern jede Sekunde wiederholen, aber dangered, wenn ich die Funktion dazu finde. Ist das nicht möglich?Wie für eine bestimmte Zeit zu pausieren? (Excel/VBA)

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

Loop 
End Sub 

Antwort

98

Verwenden Sie die Wait method:

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

oder (für Excel 2010 und später):

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

DANKE !!! Gibt es einen eleganteren Weg, es aufzuhalten als ESC zu benutzen? – Keng

+0

Ich bin mir nicht sicher, was Sie damit meinen, aber ich spekuliere, dass Sie 'DoEvents' wollen, wie hier gezeigt: http://www.dailydoseofexcel.com/archives/2005/06/14/stopwatch/ –

+0

Ihr Link ist passwortgeschützt . – htm11h

54

Fügen Sie diese auf Ihrem Modul

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

Oder für 64 -Bit-Systeme verwenden:

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 
+1

Warum nicht die VBA-Methode verwenden, um dies zu tun, eher als mit kernel32.dll? –

+8

Ich habe diese Methode verwendet, da sie zwischen den verschiedenen Office-Produkten wie Access portierbar ist und nicht Excel-spezifisch ist. – Buggabill

+0

Es gibt auch eine andere VBA-Anwendung (ERS), die ich verwende, die eine _very_ begrenzte Teilmenge der Sprache hat. – Buggabill

0

Try this:

Threading.thread.sleep(1000) 
+0

Funktioniert nicht standardmäßig –

13

diese einwandfrei funktioniert für mich. fügen Sie einen beliebigen Code vor oder nach der "Do To" -Schleife ein. In Ihrem Fall, legen Sie die 5 Zeilen (time1 = & zeit2 = & "tun, bis" Loop) am Ende in Ihrem do-Schleife

sub whatever() 
Dim time1, time2 

time1 = Now 
time2 = Now + TimeValue("0:00:01") 
    Do Until time1 >= time2 
     DoEvents 
     time1 = Now() 
    Loop 

End sub 
+1

Ich mag diese Lösung am meisten, weil ich die Nachrichtenwarteschlange nicht anhalten wollte. –

+0

Diese Lösung ist präzise und erfordert nicht die Deklaration der Schlaf-API-Funktion. Früher habe ich Zeit in doppelten Werten gespeichert und verwende stattdessen Mikrosekunden mit dem gleichen Ergebnis. – DrMarbuse

+0

Diese Lösung funktioniert besser als die ähnlichen Lösungen unter "Timer", da der Timer-Ansatz erst kurz vor Mitternacht fehlschlägt. – vknowles

12

Die Erklärung für Schlaf in kernel32.dll nicht in 64- arbeiten Bit Excel. Dies wäre ein wenig allgemeiner sein:

#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 
+2

Fehler beim Kompilieren in Office 2013. Die Fehlerüberprüfung in VBA für Office 2013 scheint die Compileranweisungen zu ignorieren. –

+2

Compiliert für mich in Office Fein 2013 –

+0

Die meisten Menschen sind sich einig, dass Win64/VBA7 dwMilliseconds Long ist, nicht LongPtr. Excel VBA verbirgt Fehler wie diese durch Stapel Korrektur nach externen Anrufen zu tun, aber Fehler wie diese werden die meisten Versionen von Open Office – david

31

statt mit:

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

i bevorzugen:

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

weil es viel einfacher ist, danach zu lesen.

+7

Absturz Und es funktioniert während in Office 2013 die # 0: 0: 1 # Format auf 1 Sekunde wandelt nach Mitternacht . –

3

Application.Wait Second(Now) + 1

1

Ich hatte das Problem zu beantworten gemacht:

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 
2
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 
4

Nur aufgeräumt Version von Code des clemo - funktioniert in Access, die nicht die Application.Wait hat Funktion.

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 
+1

Wenn "Timer" die Anzahl der Sekunden seit Mitternacht angibt, schlägt diese Vorgehensweise fehl, wenn sie kurz vor Mitternacht ausgeführt wird (d. H., So dass "sngEnd"> = 86.400 ist). Um Mitternacht wird 'Timer' auf 0 zurückgesetzt und bleibt somit für immer weniger als 'sgnEnd'. – vknowles

+0

P.S. Der obige Code von @clemo funktioniert zu jeder Tageszeit. – vknowles

1

Normalerweise verwende ich die Timer Funktion, um die Anwendung zu unterbrechen. Fügen Sie diesen Code auf dein

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

Wenn "Timer" die Anzahl der Sekunden seit Mitternacht angibt, schlägt dieser Ansatz fehl, wenn er kurz vor Mitternacht ausgeführt wird (d. H., Dass "T0" kleiner ist als die Anzahl der Sekunden vor Mitternacht). Um Mitternacht wird "Timer" auf 0 zurückgesetzt, bevor das Verzögerungslimit erreicht ist. 'Delay' erreicht nie die Verzögerungsgrenze, also läuft die Schleife für immer. – vknowles

2

Hier ist eine Alternative zu schlafen:

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

Im folgenden Code, den ich eine „glow“ -Effekt blinkt auf einer Spin-Taste, um die Benutzer, um es zu lenken, wenn sie "Probleme haben", die Verwendung von "Schlaf 1000" in der Schleife führte zu keinem sichtbaren Blinken, aber die Schleife funktioniert gut.

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 
Verwandte Themen