it-swarm.com.de

VBA Macro On Timer-Stil zum Ausführen von Code jede festgelegte Anzahl von Sekunden, d. H. 120 Sekunden

Ich muss alle 120 Sekunden ein Stück Code ausführen. Ich suche nach einer einfachen Möglichkeit, dies in VBA zu tun. Ich weiß, dass es möglich ist, den Timer-Wert vom Ereignis Auto_Open zu erhalten, um die Verwendung einer magischen Zahl zu verhindern, aber ich kann nicht ganz genau wissen, wie ein Timer ausgelöst wird, damit alle 120 Sekunden etwas ausgeführt wird. 

Ich möchte nicht wirklich eine Endlosschleife mit einem Schlaf verwenden, wenn ich es vermeiden kann.


EDIT:

Cross-post basierend auf einer Antwort finden Sie unter: Excel VBA Application.OnTime. Ich denke, es ist eine schlechte Idee, diese Gedanken so oder so zu verwenden?

36

Wenn die Arbeitsmappe zum ersten Mal geöffnet wird, führen Sie den folgenden Code aus:

alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"

Dann haben Sie einfach ein Makro in der Arbeitsmappe namens "EventMacro", das es wiederholt.

Public Sub EventMacro()
    '... Execute your actions here'
    alertTime = Now + TimeValue("00:02:00")
    Application.OnTime alertTime, "EventMacro"
End Sub
56
Alain

Ja, Sie können Application.OnTime dafür verwenden und dann in eine Schleife schreiben. Es ist so etwas wie ein Wecker, bei dem Sie die Schlummer-Taste gedrückt halten, wenn Sie möchten, dass der Wecker erneut klingelt. Die folgende Aktualisierung aktualisiert Zelle A1 alle drei Sekunden mit der Zeit.

Dim TimerActive As Boolean
Sub StartTimer()
    Start_Timer
End Sub

Private Sub Start_Timer()
    TimerActive = True
    Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
End Sub

Private Sub Stop_Timer()
    TimerActive = False
End Sub

Private Sub Timer()
    If TimerActive Then
        ActiveSheet.Cells(1, 1).Value = Time
        Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
    End If
End Sub

Sie können die StartTimer-Prozedur in Ihr Auto_Open-Ereignis einfügen und ändern, was in der Timer-Prozedur gemacht wird (im Moment wird nur die Zeit in A1 mit ActiveSheet.Cells(1, 1).Value = Time aktualisiert).

Hinweis : Sie möchten den Code (außer StartTimer) in einem Modul und nicht in einem Arbeitsblattmodul. Wenn Sie es in einem Arbeitsblattmodul haben, muss der Code geringfügig geändert werden.

21
Todd Main

In Arbeitsmappenereignissen:

Private Sub Workbook_Open()
    RunEveryTwoMinutes
End Sub

In einem Modul:

Sub RunEveryTwoMinutes()
    //Add code here for whatever you want to happen
    Application.OnTime Now + TimeValue("00:02:00"), "RunEveryTwoMinutes"
End Sub

Wenn Sie möchten, dass nur der erste Code after ausgeführt wird, wird die Arbeitsmappe geöffnet. Fügen Sie dem Ereignis Workbook_Open eine Verzögerung von 2 Minuten hinzu

8
Alex P

(Dies ist in den MS Access-Hilfedateien umschrieben. Ich bin mir sicher, dass XL etwas ähnliches hat.) Grundsätzlich ist TimerInterval eine Eigenschaft auf Formularebene. Verwenden Sie nach dem Festlegen den untergeordneten Form_Timer, um die beabsichtigte Aktion auszuführen.

Sub Form_Load()
    Me.TimerInterval = 1000 '1000 = 1 second
End Sub

Sub Form_Timer()
    'Do Stuff
End Sub
2
PowerUser

Ich habe festgestellt, dass die Verwendung von OnTime schmerzhaft sein kann, insbesondere wenn:

  1. Sie versuchen zu codieren, und der Fokus im Fenster wird bei jedem Auslösen des Ereignisses unterbrochen.
  2. Sie haben mehrere Arbeitsmappen geöffnet, Sie schließen diejenige, die den Zeitgeber verwenden soll, und die Arbeitsmappe wird immer wieder ausgelöst und erneut geöffnet (wenn Sie vergessen haben, das Ereignis ordnungsgemäß zu beenden).

Dieser Artikel von Chip Pearson war sehr aufschlussreich. Ich bevorzuge die Verwendung des Windows-Timers anstelle von OnTime.

0
Gravity Grave

Meine Lösung:

Option Explicit
Public datHora As Date

Function Cronometro(action As Integer) As Integer 
'This return the seconds between two >calls
Cronometro = 0
  If action = 1 Then 'Start
    datHora = Now
  End If
  If action = 2 Then 'Time until that moment
    Cronometro = DateDiff("s", datHora, Now)
  End If
End Function

Wie benutzt man? Einfach...

dummy= Cronometro(1) ' This starts the timer

seconds= Cronometro(2) ' This returns the seconds between the first call and this one
0
Julian