2012-09-04 16 views
13

Quiero ejecutar un código específico en Outlook (VBA) cada media hora.Outlook VBA - Ejecuta un código cada media hora

Además, el usuario de la perspectiva no debe molestarse cuando se ejecuta el código. Debería ejecutarse solo en back-end.

Hay un evento llamado Application_Reminder. Se ejecuta cuando a cada aparición de recordatorio en perspectiva. Pero esto todavía implica la interacción del usuario. Quiero un procedimiento final completo.

+1

Tome un vistazo a esto:

+0

Cuando se dispare el evento Recordatorio, ejecute el código, programe otro recordatorio de tarea 30 minutos después y luego cancele el evento. – JimmyPena

+0

Escuché que es posible usar el evento Timer. ¿Alguien puede compartir el código para lograr esto usando un temporizador? – Tejas

Respuesta

13

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

Coloque el código siguiente en el módulo ThisOutlookSession (Herramientas-> Macros-> 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 

Coloque el código siguiente en un nuevo módulo de VBA

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 

Puntos clave:

1) Esta función del temporizador no no requiere que una ventana en particular esté abierta; funciona en segundo plano

2) Si no se desactiva el temporizador cuando se cierra la aplicación es probable que bloquee

3) El ejemplo muestra que el temporizador está activado en el arranque, pero apenas puede ser tan fácil llamado por un evento diferente

4) Si no ve el MsgBox lo que indica que el temporizador se activa al inicio, su seguridad de macros está establecido demasiado alto

5) Para que la desactivación del temporizador después de una iteración agregue el intervalo de tiempo: Si TimerID <> 0 Luego, llame DeactivateTimer after msgbox declaración en sub TriggerTimer

Alguien sugirió

"Un punto a destacar, si no se comprueba si TimerID es la misma que en el idevent TriggerTimer, se obtiene de vez en cuando, y no a la vez que pidió para."

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

Funciona como un encanto. –

+1

Trabaja gracias. aunque 'Public Sub ActivateTimer (ByVal nMinutes As Long)' debe cambiarse a 'Como doble', estaba atascado en un bucle ya que utilicé fracciones de un minuto que redondearon a 0. – thydzik

3

Para Win64, tenía que cambiar a esto:

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

correcta de respuesta superior a 64 bits:

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 
Cuestiones relacionadas