Verwenden eines Timers in Office VBA-Makros

Für diejenigen von uns, die sich tief mit VB.NET beschäftigen, kann die Reise zurück zu VB6 eine verwirrende Reise sein. Einen Timer in VB6 zu benutzen ist so. Gleichzeitig ist das Hinzufügen von zeitgesteuerten Prozessen zu Ihrem Code für neue Benutzer von VBA-Makros nicht offensichtlich.

Timer für Neulinge

Ein typischer Grund für die Verwendung eines Timers ist das Codieren eines Word-VBA-Makros, um einen in Word geschriebenen Test automatisch zeitlich festzulegen. Ein weiterer häufiger Grund ist, zu sehen, wie viel Zeit verschiedene Teile Ihres Codes in Anspruch nehmen, damit Sie die langsamen Abschnitte optimieren können. Manchmal möchten Sie vielleicht sehen, ob in der Anwendung etwas passiert, wenn der Computer nur im Leerlauf zu sitzen scheint, was ein Sicherheitsproblem sein kann. Timer können das.

Starten Sie einen Timer

Sie starten einen Timer, indem Sie eine OnTime-Anweisung codieren. Diese Anweisung ist in Word und Excel implementiert, weist jedoch je nach verwendeter Syntax eine andere Syntax auf. Die Syntax für Word lautet:

expression.OnTime (Wann, Name, Toleranz)

Die Syntax für Excel sieht folgendermaßen aus:

expression.OnTime (EarliestTime, Procedure, LatestTime, Schedule)

Beide haben den ersten und den zweiten Parameter gemeinsam. Der zweite Parameter ist der Name eines anderen Makros, das ausgeführt wird, wenn die Zeit im ersten Parameter erreicht ist. Das Codieren dieser Anweisung entspricht im Grunde dem Erstellen einer Ereignisunterroutine in VB6- oder VB.NET-Begriffen. Das Ereignis erreicht die Zeit im ersten Parameter. Das Ereignis-Unterprogramm ist der zweite Parameter.

Dies unterscheidet sich von der Codierung in VB6 oder VB.NET. Zum einen kann sich das im zweiten Parameter genannte Makro in jedem Code befinden, auf den zugegriffen werden kann. In einem Word-Dokument empfiehlt Microsoft, es in die Dokumentvorlage "Normal" einzufügen. Wenn Sie es in ein anderes Modul einfügen, empfiehlt Microsoft, den vollständigen Pfad zu verwenden: Project.Module.Macro.

Der Ausdruck ist normalerweise das Anwendungsobjekt. Die Word- und Excel-Dokumentation besagt, dass der dritte Parameter die Ausführung des Ereignismakros abbrechen kann, falls ein Dialogfeld oder ein anderer Prozess die Ausführung innerhalb einer bestimmten Zeit verhindert. In Excel können Sie in diesem Fall einen neuen Zeitpunkt festlegen.

Codieren Sie das Zeitereignismakro

Dieser Code in Word richtet sich an den Administrator, der eine Benachrichtigung anzeigen möchte, dass die Testzeit abgelaufen ist, und das Ergebnis des Tests ausdrucken möchte.

Public Sub TestOnTime ()
Debug.Print "Der Alarm wird in 10 Sekunden ausgelöst!"
Debug.Print ("Before OnTime:" & Now)
alertTime = Now + TimeValue ("00:00:10")
Application.OnTime alertTime, "EventMacro"
Debug.Print ("After OnTime:" & Now)
End Sub
Sub EventMacro ()
Debug.Print ("Ausführen von Ereignismakro:" & Now)
End Sub

Daraus ergibt sich im unmittelbaren Fenster folgender Inhalt:

Der Alarm wird in 10 Sekunden ausgelöst!
Vor OnTime: 25.12.2000 19:41:23 Uhr
Nach OnTime: 25.12.2000 19:41:23 Uhr
Ausführen des Ereignismakros: 27.02.2010 19:41:33 Uhr

Option für andere Office-Apps

Andere Office-Anwendungen implementieren OnTime nicht. Für diese haben Sie mehrere Möglichkeiten. Erstens können Sie die Timer-Funktion verwenden, die einfach die Anzahl der Sekunden seit Mitternacht auf Ihrem PC zurückgibt und Ihre eigenen Berechnungen vornimmt, oder Sie können Windows-API-Aufrufe verwenden. Die Verwendung von Windows-API-Aufrufen hat den Vorteil, dass sie präziser sind als Timer. Hier ist eine von Microsoft vorgeschlagene Routine, die den Trick macht:

Private Deklarationsfunktion getFrequency Lib "kernel32" _
Alias ​​"QueryPerformanceFrequency" (CyFrequency As Currency) So lange
Private Deklarierungsfunktion getTickCount Lib "kernel32" _
Alias ​​"QueryPerformanceCounter" (cyTickCount As Currency) So lange
Sub TestTimeAPICalls ()
Dim dTime As Double
dTime = MicroTimer
Dimmen Sie StartTime als Single
StartTime = Timer
Für i = 1 bis 10000000
Dim j As Double
j = Sqr (i)
Nächster
Debug.Print ("MicroTimer Time taken was:" & MicroTimer - dTime)
End Sub
Funktion MicroTimer () As Double
'
'Gibt Sekunden zurück.
'
CyTicks1 als Währung dimmen
Statische CyFrequenz als Währung
'
MicroTimer = 0
'Holen Sie sich die Frequenz.
Wenn cyFrequency = 0, dann getFrequency cyFrequency
»Hol dir Zecken.
getTickCount cyTicks1
'Sekunden
Wenn cyFrequency, dann ist MicroTimer = cyTicks1 / cyFrequency
Funktion beenden