par , 31/12/2020 à 14h47 (1632 Affichages)
Dans Outlook il n'y a pas de Scheduler comme application_ontime() pour Excel.
Et on ne peut pas non plus lancer une macro comme dans EXCEL avec application.run
Plusieurs solutions existent cependant.
Soit votre macro peut être lancée totalement via un VBS.
voici quelques liens non exhaustifs vers des tuto VB SCRIPT.
https://tahe.developpez.com/web/vbscript/
https://vb.developpez.com/faq/vbs
-->Vous programmez le planificateur de tâches de Windows (gestionnaire de tâches) , en lui demandant d'exécuter le VBS demandé.
L'avantage de cette méthode c'est que vous pouvez aussi lancer Outlook s'il n'est pas démarré.
Soit vous voulez ou devez lancer une macro qui se trouve dans OUTLOOK.
2 Méthodes pour cela
Dans celles-ci on va prendre pour exemple ce traitement
Dans OUTLOOK, ouvrez les macros avec alt+F11 et créez un module se nommant MonModule
1 2 3 4 5 6 7
| Sub maMacro()
'ici on fait le traitement programmé souhaité.
Dim myfolder
Set myfolder = Session.GetDefaultFolder(olFolderInbox)
MsgBox myfolder.FullFolderPath & vbCr & myfolder.Items.Count
End Sub |
--> Vous utilisez le planificateur de tâche et un VBS qui va envoyer un Email , envoi que vous allez intercepter pour lancer votre macro.
Exemple de VBS (les SendKeys ("{ESC}") servent à fermer un menu qui serait ouvert et qui empêcherai le lancement
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| On Error Resume Next
Set oShell = CreateObject("WScript.Shell")
tries=0
Err.Clear
Do
Set Ol = GetObject(, "outlook.application")
If Err then
WScript.Sleep(500)
Err.Clear
Else
Exit Do
End If
tries= tries +1
Loop While tries<5
If Ol Is Nothing Then
wscript.Quit(99)
Else
Set Olt = Ol.CreateItem(0)
Olt.Subject = "#SCHEDULE#SENT"
Olt.to = "test@toto.fr"
Err.Clear
Do
if Err.Number <> 0 then
WScript.Sleep(500)
oShell.SendKeys ("{ESC}")
end if
Err.Clear
Olt.display
j = j + 1
Loop until Err.Number = 0 or j=5
Olt.send
End if
wscript.Quit(1) |
Dans OUTLOOK, ouvrez les macros avec alt+F11 dans ThisOutlookSession et copiez le code suivant
'ici on utilise l'événement Application_ItemSend pour INTERCEPTER le mail envoyé et vérifier si c'est le GO pour notre traitement.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Private Sub Application_ItemSend(ByVal item As Object, Cancel As Boolean)
If Not item.Class = olMail Then Exit Sub
'ICI on TEST si c'est un LANCEMENT envoyé par VBS
If InStr(1, item.SUBJECT, "#SCHEDULE#SENT", vbTextCompare) > 0 Then
DoEvents
Call monmodule.mamacro'...your macro name here
'on annule l'envoi
Cancel = True
DoEvents
'on supprime cet Email
item.delete
Exit Sub
End If
END SUB |
l'avantage de cette méthode c'est qu'un programme externe peut être le lanceur (comme une macro Excel ou Word).
-->L'autre méthode c'est d'utiliser les RAPPELS de OUTLOOK , que l'on va intercepter lors de son affichage pour lancer le traitement de notre choix.
L'inconvénient de cette méthode c'est que OUTLOOK doit être démarré, (attention aussi si vous avez une appli mobile )
Dans OUTLOOK, ouvrez les macros avec alt+F11 dans ThisOutlookSession copiez ce code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| ' The Private subs go in ThisOutlookSession
Private WithEvents olRemind As Outlook.Reminders
Private Sub Application_Reminder(ByVal Item As Object)
'Juste avant l'affichage du RAPPEL on teste si c'est notre GO
If InStr(1, Item.Subject, "#SCHEDULE#SENT", vbTextCompare) > 0 Then
'SI OUI
'ON PEUT SUPPRIMER l'affichage de ce rappel
Set olRemind = Outlook.Reminders
DoEvents
'ON LANCE NOTRE TRAITEMENT
Call MonModule.maMacro '...your macro name here
End If
End Sub
Private Sub olRemind_BeforeReminderShow(Cancel As Boolean)
'---------------------------------------------------------------------------------------
' Procedure : olRemind_BeforeReminderShow
' Author : Diane Poremsky
' Date : 30/12/2020
' Reference : https://www.slipstick.com/developer/code-samples/running-outlook-macros-schedule/
' Purpose : dismiss reminder
'---------------------------------------------------------------------------------------
Dim varTime As Variant
For Each objRem In olRemind
If InStr(1, objRem.Caption, "#SCHEDULE", vbTextCompare) > 0 Then
If objRem.IsVisible Then
objRem.Dismiss
'pour relancer le traitement dans 1 mn on remplace Dismiss par Snooze
' objRem.Snooze (1)
Cancel = True
End If
Exit For
End If
Next objRem
End Sub |
Dans Outlook créez une TACHE (fonctionne aussi avec un rdv ou un Rappel sur un Email)
L'important c'est de le nommer "#SCHEDULE#SENT" ou du moins que le sujet contienne ce texte .
Indiquez bien la date de rappel !! Vous pouvez aussi paramétrer un PERIODICITE