Outlook et VBA
Envoyer un message Outlook depuis Excel
Pour avoir accès aux objets d'une autre application, donc pour manipuler les informations du serveur, on doit référencer sa bibliothèque d'objets (un fichier .olb) via le menu Outils / Références de l'éditeur VBA. Ce menu est la liste des serveurs OLE enregistrés dans la base de registre de Windows.
La technologie Automation
Automation, appelée également OLE (Object Linking and Embedding) ou OLE Automation, est une technologie qui permet de manipuler les objets d'une autre application directement à partir d'Excel. Pour utiliser la technologie Automation, on doit définir dans le code VBA une variable objet associée aux objets de type application.Pour réaliser notre exemple (Envoyer un message Outlook depuis une liste d'adresse Excel), il faut d'abord sélectionner une référence au module externe Access via le menu Outils / Références de l'éditeur VBA. On coche l'option Microsoft Outlook 12.0 Object Library (11.0 correspond à 2003, 12.0 pour 2007 et 14.0 pour 2010).
Sub proc_Envoyer_Un_Message()
' Déclaration
Dim monoutlook As Outlook.Application
Dim MonMail As MailItem
'Affectation
Set monoutlook = New Outlook.Application
Set MonMail = monoutlook.CreateItem(olMailItem)
'Traitement
MonMail.To = "titi@toto.fr"
MonMail.Subject = "Pour le test"
MonMail.Body = "Comment vas tu?"
'MonMail.Display 'Affiche le message (mode test)
MonMail.Send ' Envoie le message
monoutlook.Quit ' Quite l'instance d'Outlook
End Sub
' Déclaration
Dim monoutlook As Outlook.Application
Dim MonMail As MailItem
'Affectation
Set monoutlook = New Outlook.Application
Set MonMail = monoutlook.CreateItem(olMailItem)
'Traitement
MonMail.To = "titi@toto.fr"
MonMail.Subject = "Pour le test"
MonMail.Body = "Comment vas tu?"
'MonMail.Display 'Affiche le message (mode test)
MonMail.Send ' Envoie le message
monoutlook.Quit ' Quite l'instance d'Outlook
End Sub
Liste de diffusion (Groupe)
Envoyer un message Outlook à plusieurs destinataires depuis une liste Excel
Une liste de 5 adresses mail est saisie dans la plage A1:A5 d'Excel
Sub proc_Envoyer_Message_a_plusieurs_destinataires()
' Déclaration
Dim monoutlook As Outlook.Application
Dim MonMail As MailItem
'Affectation
Set monoutlook = New Outlook.Application
Set MonMail = monoutlook.CreateItem(olMailItem)
Dim i As Integer
Dim mesadresses(4) As String
Dim mesautresadresses As String
' je récupère les adresses dans une variable tableau
For i = 0 To 4
mesadresses(i) = Range("A" & i + 1).Value
Next i
' Je concatène la variable tableau avec des ";"
mesautresadresses = Join(mesadresses, ";")
' j'envoie le tout
MonMail.To = mesautresadresses
MonMail.Subject = "Pour le test"
MonMail.Body = "Comment vas tu?"
MonMail.Display 'Affiche le message (mode test)
MonMail.Send ' Envoie le message
monoutlook.Quit ' Quite l'instance d'Outlook
' Vide les variables (facultatif)
Set MonMail = Nothing
Set monoutlook = Nothing
End Sub
' Déclaration
Dim monoutlook As Outlook.Application
Dim MonMail As MailItem
'Affectation
Set monoutlook = New Outlook.Application
Set MonMail = monoutlook.CreateItem(olMailItem)
Dim i As Integer
Dim mesadresses(4) As String
Dim mesautresadresses As String
' je récupère les adresses dans une variable tableau
For i = 0 To 4
mesadresses(i) = Range("A" & i + 1).Value
Next i
' Je concatène la variable tableau avec des ";"
mesautresadresses = Join(mesadresses, ";")
' j'envoie le tout
MonMail.To = mesautresadresses
MonMail.Subject = "Pour le test"
MonMail.Body = "Comment vas tu?"
MonMail.Display 'Affiche le message (mode test)
MonMail.Send ' Envoie le message
monoutlook.Quit ' Quite l'instance d'Outlook
' Vide les variables (facultatif)
Set MonMail = Nothing
Set monoutlook = Nothing
End Sub
Autre technique quasi-identique : la boucle FOR NEXT englobe l'envoie
Sub proc_Envoyer_Plusieurs_Message_Avec_Outlook()
Dim monoutlook As Outlook.Application
Dim MonMail As MailItem
Set monoutlook = New Outlook.Application
Dim i As Integer
Dim mesadresses(3) As String
' je rajoute un fichier joint
MonMail.Attachments.Add ("C:\Documents and Settings\Administrateur\Mes documents\test_fj.xls")
' je récupère les adresses dans une variable tableau
For i = 1 To 3
' Un Message par adresse :
Set MonMail = monoutlook.CreateItem(olMailItem)
mesadresses(i) = Range("A" & i).Value
MonMail.To = mesadresses(i)
MonMail.Subject = "Pour le test"
MonMail.Body = "Coucou"
MonMail.Display
Next i
'MonMail.Send ' Envoie le message
monoutlook.Quit ' Quite l'instance d'Outlook
End Sub
Dim monoutlook As Outlook.Application
Dim MonMail As MailItem
Set monoutlook = New Outlook.Application
Dim i As Integer
Dim mesadresses(3) As String
' je rajoute un fichier joint
MonMail.Attachments.Add ("C:\Documents and Settings\Administrateur\Mes documents\test_fj.xls")
' je récupère les adresses dans une variable tableau
For i = 1 To 3
' Un Message par adresse :
Set MonMail = monoutlook.CreateItem(olMailItem)
mesadresses(i) = Range("A" & i).Value
MonMail.To = mesadresses(i)
MonMail.Subject = "Pour le test"
MonMail.Body = "Coucou"
MonMail.Display
Next i
'MonMail.Send ' Envoie le message
monoutlook.Quit ' Quite l'instance d'Outlook
End Sub
Chargement dynamique de librairie (menu Outils / Références)
Pour récupérer dynamiquement une bibliothèque d'objets (un fichier .olb), on utilise la méthode AddFromFile de l'objet ThisWorkbook. L'utilisation de cet objet nécessite d'avoir coché l'option "Faire confiance au projet Visual Basic" du menu Excel "Outils / Macro / Sécurité" (onglet Dévellopeur sous Excel 2007). De plus, il est conseillé d'utiliser cet objet dans une procédure dédiée.
Sub proc_charge_references_librairie()
' Récupère la librairie Outlook (menu Outils / Références...)
ThisWorkbook.VBProject.References.AddFromFile _
Filename:="C:\Program Files\Microsoft Office\OFFICE11\MSOUTL.OLB"
End Sub
' Récupère la librairie Outlook (menu Outils / Références...)
ThisWorkbook.VBProject.References.AddFromFile _
Filename:="C:\Program Files\Microsoft Office\OFFICE11\MSOUTL.OLB"
End Sub