2012-09-04 22 views
13

Ich möchte einen bestimmten Code in Outlook (VBA) jede halbe Stunde ausführen.Outlook VBA - Führen Sie einen Code alle halbe Stunde

Auch der Outlook-Benutzer sollte nicht gestört werden, wenn der Code ausgeführt wird. Es sollte nur im Back-End laufen.

Es gibt ein Ereignis namens Application_Reminder. Es läuft bei jedem Auftreten einer Erinnerung in Outlook. Dies beinhaltet jedoch immer noch die Benutzerinteraktion. Ich möchte ein komplettes Backend-Verfahren.

+1

einen Blick auf diese:

+0

Wenn das Erinnerungsereignis ausgelöst wird, führen Sie Ihren Code aus, planen Sie 30 Minuten später eine weitere Aufgabenerinnerung und brechen Sie das Ereignis ab. – JimmyPena

+0

Ich habe gehört, es ist möglich, Timer-Ereignis zu verwenden. Kann jemand bitte Code teilen, um dies mit einem Timer zu erreichen? – Tejas

Antwort

13

http://www.outlookcode.com/threads.aspx?forumid=2&messageid=7964

Platzieren Sie den folgenden Code in das Modul Dieseoutlooksitzung (Tools-> Makros-> VB-Editor):

Private Sub Application_Quit() 
    If TimerID <> 0 Then Call DeactivateTimer 'Turn off timer upon quitting **VERY IMPORTANT** 
End Sub 

Private Sub Application_Startup() 
    MsgBox "Activating the Timer." 
    Call ActivateTimer(1) 'Set timer to go off every 1 minute 
End Sub 

den folgenden Code in einem neuen VBA-Modul

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long 
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long 

Public TimerID As Long 'Need a timer ID to eventually turn off the timer. If the timer ID <> 0 then the timer is running 

Public Sub ActivateTimer(ByVal nMinutes As Long) 
    nMinutes = nMinutes * 1000 * 60 'The SetTimer call accepts milliseconds, so convert to minutes 
    If TimerID <> 0 Then Call DeactivateTimer 'Check to see if timer is running before call to SetTimer 
    TimerID = SetTimer(0, 0, nMinutes, AddressOf TriggerTimer) 
    If TimerID = 0 Then 
    MsgBox "The timer failed to activate." 
    End If 
End Sub 

Public Sub DeactivateTimer() 
Dim lSuccess As Long 
    lSuccess = KillTimer(0, TimerID) 
    If lSuccess = 0 Then 
    MsgBox "The timer failed to deactivate." 
    Else 
    TimerID = 0 
    End If 
End Sub 

Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long) 
    MsgBox "The TriggerTimer function has been automatically called!" 
End Sub 

Wichtige Punkte:

1) Diese Timer-Funktion funktioniert nicht erfordern, dass ein bestimmtes Fenster geöffnet ist; es arbeitet im Hintergrund

2) Wenn Sie nicht über den Timer deaktivieren, wenn die Anwendung es wahrscheinlich zum Absturz schließt wird, beim Start

3) Das Beispiel zeigt den Timer aktiviert wird, aber es kann genauso einfach sein durch ein anderes Ereignis genannt

4) Wenn Sie nicht das msgbox sehen was anzeigt, dass der Timer beim Start aktiviert wurde, Ihre Makrosicherheit zu hoch eingestellt

5) Um den Timer zu deaktivieren, nachdem eine Iteration zu haben, das Zeitintervall add: Wenn TimerID <> 0 Dann Call DeactivateTimer nach der msgbox Anweisung in Unter TriggerTimer

Jemand schlug vor, sonst

„ein Punkt zu beachten, wenn Sie überprüfen nicht, ob TimerID die gleiche wie idevent im TriggerTimer ist, können Sie jeder so oft bekommen, und nicht die Zeit, die Sie gefragt zum."

Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long) 
    'keeps calling every X Minutes unless deactivated 
    If idevent = TimerID Then 
     MsgBox "The TriggerTimer function has been automatically called!" 
    End If 
End Sub 
+0

Funktioniert wie ein Charme. –

+1

Funktioniert dank. Obwohl "Public Sub ActivateTimer (ByVal nMinutes As Long)" in "As Double" geändert werden sollte, steckte ich in einer Schleife, da ich Bruchteile einer Minute verwendete, die auf 0 gerundet wurde. – thydzik

3

Für Win64, musste ich es, dies ändern:

Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongLong, ByVal nIDEvent As LongLong, ByVal uElapse As LongLong, ByVal lpTimerfunc As LongLong) As LongLong 
Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongLong, ByVal nIDEvent As LongLong) As LongLong 

Public TimerID As LongLong 'Need a timer ID to eventually turn off the timer. If the timer ID <> 0 then the timer is running 

Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long) 
    MsgBox "The TriggerTimer function has been automatically called!" 
End Sub 


Public Sub DeactivateTimer() 
Dim lSuccess As LongLong 
    lSuccess = KillTimer(0, TimerID) 
    If lSuccess = 0 Then 
    MsgBox "The timer failed to deactivate." 
    Else 
    TimerID = 0 
    End If 
End Sub 

Public Sub ActivateTimer(ByVal nMinutes As Long) 
    nMinutes = nMinutes * 1000 * 60 'The SetTimer call accepts milliseconds, so convert to minutes 
    If TimerID <> 0 Then Call DeactivateTimer 'Check to see if timer is running before call to SetTimer 
    TimerID = SetTimer(0, 0, nMinutes, AddressOf TriggerTimer) 
    If TimerID = 0 Then 
    MsgBox "The timer failed to activate." 
    End If 
End Sub 
1

Richtige für obere Antwort für 64-Bit:

Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongLong, ByVal nIDEvent As LongLong, ByVal uElapse As LongLong, ByVal lpTimerfunc As LongLong) As LongLong 
Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongLong, ByVal nIDEvent As LongLong) As LongLong 

Public TimerID As LongLong 'Need a timer ID to eventually turn off the timer. If the timer ID <> 0 then the timer is running 

Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long) 
    MsgBox "The TriggerTimer function has been automatically called!" 
End Sub 


Public Sub DeactivateTimer() 
Dim lSuccess As LongLong    '<~ Corrected here 
    lSuccess = KillTimer(0, TimerID) 
    If lSuccess = 0 Then 
    MsgBox "The timer failed to deactivate." 
    Else 
    TimerID = 0 
    End If 
End Sub 

Public Sub ActivateTimer(ByVal nMinutes As Long) 
    nMinutes = nMinutes * 1000 * 60 'The SetTimer call accepts milliseconds, so convert to minutes 
    If TimerID <> 0 Then Call DeactivateTimer 'Check to see if timer is running before call to SetTimer 
    TimerID = SetTimer(0, 0, nMinutes, AddressOf TriggerTimer) 
    If TimerID = 0 Then 
    MsgBox "The timer failed to activate." 
    End If 
End Sub 
Verwandte Themen