Ich verwende den Windows-API-Timer in Excel für ein VBA-Projekt (eine Art Anfänger mit VBA) und während der Untersuchung, warum Excel stürzt, ich dachte an diese Frage.Ausführen von anderen Subs nach TimerProc beendet alle X Sekunden (API SetTimer in Excel VBA)
Im Makro mit mehreren Subs startet das erste Sub den Timer, der den TimerProc-Code ausführt, etwa alle 5 Sekunden. Nach dem Start des Timers endet der erste Sub und der nächste beginnt. Andere Funktionen werden in der zweiten Sub aufgerufen und das Programm beendet, bevor 5 Sekunden auf dem Timer erreicht ist. Technisch ist also das gesamte Makro bis zum Aufruf von TimerProc vollständig.
An diesem Punkt, ist es möglich, irgendeinen anderen Teil einer anderen Unterfunktion oder NACH dem Beenden des TimerProc-Codes auszuführen/aufzurufen? Offensichtlich können Sie im TimerProc-Code Anrufe tätigen, aber wie wäre es, wenn es vorbei ist? Wenn beispielsweise KillTimer im TimerProc ausgeführt wird, aber der Timer im TimerProc nicht neu gestartet wird, gibt es eine Möglichkeit, den Timer an einem anderen Ort neu zu starten?
Hinweis: Ich bin mit der Methode des Aufrufs detaillierten Windows-Timers in http://www.cpearson.com/excel/OnTime.aspx
Versuchte Beispiel:
Public Declare Function SetTimer Lib "user32" (_
ByVal HWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (_
ByVal HWnd As Long, _
ByVal nIDEvent As Long) As Long
Public TimerID As Long
Public TimerSeconds As Single
Sub StartTimer()
TimerSeconds = 10000 ' how often to "pop" the timer, in milliseconds
TimerID = SetTimer(0&, 0&, TimerSeconds, AddressOf TimerProc)
End Sub
Sub EndTimer()
'On Error Resume Next
KillTimer 0&, TimerID
End Sub
Sub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, _
ByVal nIDEvent As Long, ByVal dwTimer As Long)
timerFinished = True
Call EndTimer
'Instead of calling StartTimer here inside TimerProc, I want to exit TimerProc and re-run the below sub, which will now call StartTimer
End Sub
Sub
Sub exampleSub()
Call StartTimer
If timerFinished = True Then
Msgbox "It worked!"
call StartTimer
End If
End Sub
Der Timer zur Zeit auf 10 festgelegt ist Sekunden, und das Beispiel Sub wird definitiv beendet sein, bevor diese 10 Sekunden Treffer und TimerProc ist ein kann ausgeführt werden und ändert das timerFinished-Bool in True. Gibt es eine Möglichkeit, nach Ablauf von TimerProc den exampleSub erneut auszuführen (jetzt, da timerFinished True ist), um den Timer ohne, der StartTime im TimerProc selbst aufruft, neu zu starten? Ich möchte sicherstellen, dass der TimerProc vollständig beendet wird.
A.S.H danke für die Antwort. Wo würde ich 'Application.OnTime Now,' exampleSub '' in das Programm einfügen? Wenn ich es irgendwo außerhalb von TimerProc ablege, woher weiß das Programm, wann es zurückgehen soll, nachdem TimerProc aufgerufen wurde? Außerdem benötige ich tatsächlich mehr Auflösung als Sekunden für mein Timing, speziell Zehntelsekunden. – jdyagoda
@jdyagoda Ich denke an die Stelle Ihres Kommentars * "Anstatt StartTimer hier in TimerProc aufzurufen, möchte ich TimerProc beenden und das folgende Sub-Skript erneut ausführen, das jetzt StartTimer" * aufruft. Die Anweisung wird genau das tun: 'exampleSub' wird gestartet, sobald das' TimerProc' zurückkommt (es wird nicht mehr im Call-Stack vorhanden sein). –
Wenn Sie einen Haltepunkt im 'exampleSub' platzieren und den Aufruf-Stack anzeigen. Sie können überprüfen, ob nichts darüber ist ... abgesehen von der VBA-Laufzeit ... –