2017-06-16 12 views
1

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.

Antwort

0

exampleSub zu starten, nachdem TimerProc` abgeschlossen wird, können Sie verwenden:

Application.OnTime Now, "exampleSub" 

Die obige Aussage VBA weist exampleSubso schnell wie möglich, nach der aktuellen Verarbeitung (alle Routinen zur Zeit in dem Call-Stack zu starten) ist fertig.

Übrigens können Sie eine Application.OnTime Schleife verwenden, um Ihr ursprüngliches Problem zu lösen, ohne die SetTimer API zu benötigen. Letzteres ist nur interessant, wenn Sie das Timing in Millisekunden benötigen, während die Einheit OnTime eine Sekunde beträgt.

+0

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

+0

@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). –

+0

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 ... –

Verwandte Themen