it-swarm.com.de

Wie pausiere ich für eine bestimmte Zeit? (Excel/VBA)

Ich habe ein Excel-Arbeitsblatt mit dem folgenden Makro. Ich würde gerne jede Sekunde eine Schleife machen, bin aber gefangen, wenn ich die Funktion finde, die das macht. Ist es nicht möglich

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

Loop
End Sub
93
Keng

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#
114
Ben S

Fügen Sie dies Ihrem Modul hinzu

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

Oder für 64-Bit-Systeme:

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

Nenne es in deinem Makro so:

Sub Macro1()
'
' Macro1 Macro
'
Do
    Calculate
    Sleep (1000) ' delay 1 second

Loop
End Sub
58
Buggabill

anstelle von:

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

ich bevorzuge:

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

weil es später viel einfacher zu lesen ist.

38
Achaibou Karim

das funktioniert einwandfrei für mich. Fügen Sie einen beliebigen Code vor oder nach der "do before" -Schleife ein. Fügen Sie in Ihrem Fall die 5 Zeilen (time1 = & time2 = & do do bis) in die 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
17
clemo

Die Deklaration für den Ruhezustand in kernel32.dll funktioniert nicht in 64-Bit-Excel. 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
12
dbuskirk

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
5
Brian Burns

Application.Wait Second(Now) + 1

3
g t

Hier ist eine Alternative zum Schlaf:

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

Im folgenden Code mache ich einen "Glow" -Effekt auf einem Drehknopf, 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
2
Reverus
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
2
ITI

ich hatte das gemacht, 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
1
dave

Die meisten der vorgestellten Lösungen verwenden Application.Wait, wobei die Zeit (Millisekunden), die seit dem Beginn der aktuellen Sekundenzählung bereits vergangen ist, nicht berücksichtigt wird, so dass sie eine intrinsische Ungenauigkeit von bis zu 1 Sekunde haben.

Der Timer-Ansatz ist die beste Lösung, aber Sie müssen den Reset um Mitternacht in Betracht ziehen. Hier ist eine sehr genaue Sleep-Methode 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

USE DIES, UM DIE SCHLAFFUNKTION ZU TESTEN: (Debugfenster öffnen: 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
1
cyberponk

Normalerweise verwende ich die Funktion Timer , 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

Wait and Sleep-Funktionen sperren Excel und Sie können nichts anderes tun, bis die Verzögerung abgelaufen ist. Auf der anderen Seite haben Sie bei Loop-Verzögerungen keine genaue Wartezeit.

Daher habe ich diese Problemumgehung durchgeführt, um ein wenig von beiden Konzepten zu kombinieren. Es wiederholt sich, bis die Zeit die gewünschte Zeit 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

1
Maycow Moura

Versuche dies :

Threading.thread.sleep(1000)
0
DEV