VBA: Envoyer un email avec Excel (via Outlook)

Vous avez un listing de clients en Excel et vous voulez l'utiliser pour envoyer des emails personnalisés? Vous avez besoin d'avertir quelqu'un par email à la fin de votre programme? Alors lisez ce qui suit car en VBA, tout est possible (ou presque)!

Envoyer email avec Excel
Envoyer un email avec Excel

Je vous propose ici le code VBA qui vous permettra d'envoyer un email avec Excel en passant (en arrière plan et sans l'intervention humaine) par Outlook. Il s'agit une fonctionnalité très pratique. Le code qui suit est conçu de manière à ce que même un débutant en VBA puisse l'implementer et l'utiliser facilement.

Les utilisateurs  plus avancées de VBA n'auront aucun problème d'insérer ce code dans une boucle et créer ainsi un puissant outil de publipostage – qui, de plus est, contrairement à d'autres outils, tout à fait gratuit.

Comment envoyer un email dans Excel (Access / Word,…) avec VBA?

Le code VBA qui suit vous permet donc d'envoyer un ou plusieurs emails à partir d'Excel. Ce code contient deux procédures. Une qui envoie les emails proprement dit (procédure EnvoyerEmail) et une autre qui gère l'application Outlook (pour faire en sorte que Outlook soit prêt à envoyer les emails – même si Outlook lui même n'est pas ouvert) – procédure PreparerOutlook.

Le code est écrit de manière à ce qu'il soit lisible et compréhensible. En gros, vous devez fournir à la procédure EnvoyerEmail les arguments suivants (sous forme de texte):

  • le sujet de l'email
  • l'adresse email du destinataire
  • le contenu de l'email
  • en option, le chemin complet du fichier qui doit être attaché à l'email en tant que pièce jointe

Les arguments sont dans cet ordre précis et tous les 4 doivent être de type String.

L'appel de la procédure (dont le code se trouve plus loin) nous donne alors:

Sub EnvoyerEmail(ByVal Sujet As String, ByVal Destinataire As String, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String)

Le code va fonctionner directement, il suffit de le copier/coller. La seule exigence est d'avoir Microsoft Outlook installé et ajouter à votre projet la Référence à Outlook (voir la section suivante).

Il vous est donc très facile d'ajouter ce code à votre Projet et commencer à envoyer des emails.

Ajouter la Référence Microsoft Outlook X.0 Object Library

Ceci est une étape importante car si la Référence n'est pas ajouté, le code ci-dessous ne fonctionnera pas.

Si vous connaissez la procédure d'ajout d'une Référence VBA

Vous devez tout simplement ajouter la Référence de Outlook: Microsoft Outlook X.0 Object Library

Si vous ne savez pas comment ajouter une Référence VBA

Rassurez vous, ce n’est pas bien compliqué:

  1. Ouvrez le Visual Basic Editor (VBE) s’il n’est pas déjà ouvert (via Alt + F11 ) à partir de votre fichier.
  2. Dans la barre de menus, cliquez sur “Outils” (ou “Tools” si votre VBE est en anglais) et ensuite sur “Références” (“References“).
  3. Dans la liste, trouvez la ligne  Microsoft Outlook X.0 Object Library (où X est un chiffre) et cochez la case à côté.
  4. Cliquez sur OK et sauvegardez votre projet.
 

Code VBA complet pour envoyer des emails dans Excel

Ci-dessous se trouve donc le code VBA complet dont vous aurez besoin. Il suffit de le copier/coller dans un Module de votre Projet VBA.

Pour que le code fonctionne correctement, vous devez copier/coller son entièreté dans un Module de votre Projet VBA.

Choix du format de l'email: HTML, simple texte ou texte riche (formaté)

Ce code VBA vous permet de choisir quel format de l'email vous voulez utiliser: texte formaté ("Rich text"), HTML (formatage comme une page web) ou simple texte sans aucun format. Selon votre choix, vous devez mettre en commentaire une de ces trois possibilités.

  • pour le format HTML, vous pouvez laisser le code initial inchangé (lignes 34-35  et 40-41 en commentaire et les lignes 28-29 actives)
  • pour le format texte simple, les lignes 28-29 et 40-41 doivent être en commentaire et les lignes 34-35 actives
  • pour le format texte formaté, mettez les lignes 40-41 activeslignes 28-29 et 34-35 en commentaire
  • vous pouvez, bien sûr, effacer les lignes inutiles plutôt que de les mettre en commentaire

Quelle est la différence entre les différents formats?

En gros, le format HTML vous permet d'utiliser les balises & le code HTML pour formater le contenu de votre email. Il est donc facile d'utiliser des images, liens etc. Le simple texte a son avantage également: il aura moins de risque d'être considéré comme pourriel par les services de courrier électronique (Gmail, Hotmail,…) et donc il aura plus de chances d'atteindre le destinataire. Le texte formaté n'a, aujourd'hui, plus vraiment la cote et dans 99% de cas, il n'y a plus de raison de l'utiliser – le format HTML est beaucoup plus répandu…

Format par défaut: si vous omettez d'indiquer le format, c'est le format HTML qui sera appliqué par défaut.

Vous pouvez voir la différence entre ces formats dans la section suivante – les exemples d'utilisation.

Exemples d'utilisation du code VBA pour envoyer les emails depuis Excel

Et voici les exemples de l'utilisation du code précédent. Il suffit d'appeler la procédure EnvoyerEmail avec les arguments nécessaires – c'est à dire "Sujet", "Destinataire", "Contenu" et éventuellement "Pièce jointe".

Le code qui suit envoie un email sans pièce jointe et un autre avec une pièce jointe.

Exemple d'utilisation avec des variables

Vous pouvez également fournir les arguments nécessaires via des variables. Attention, vous devez avoir déclaré ces variables pour pouvoir les transférer une procédure (Sub) à une autre (ici de la procédure TestEnvoiEmail_Variables vers EnoyerEmail). Ceci est particulièrement pratique si vous voulez envoyer plusieurs emails. Il suffit alors d'utiliser une boucle au sein de laquelle on attribue les valeurs aux variables et ensuite, l'email est envoyé. La boucle recommence une autre itération en chargeant les nouvelles valeurs dans les variables. Et ainsi de suite…

 

 

Exemple de code VBA pour envoyer en email avec les balises HTML

Comme mentionné plus haut, vous pouvez créer et envoyer des emails en format HTML. Ainsi, Outlook envoie l'email comme si c'était une page web. Cela a pour l'avantage la possibilité de formater le message à votre guise. A condition de maîtriser (au moins) un peu le langage HTML (remarquez les balises HTML dans l'exemple).

 

Remarques pratiques

  • Ce code est indépendant et peut être utilisé dans les différentes application de Microsoft Office (Excel, Access, Word,…). Mais n'oubliez pas d'ajouter la Référence à Microsoft Outlook X.0 Object Library comme mentionné plus haut.
  • Il est possible d'aller encore plus en profondeur: ajouter des CC, des CCI, ajouter plusieurs pièces jointes en même temps etc. Par souci de lisibilité (surtout pour les utilisateurs moins avancés), j'ai utilisé dans ce code les options de base (et nécessaires). N'hésitez pas à laisser un commentaire si vous avez envie d'en savoir plus sur les autres fonctionnalités possibles…
    Mise-à-jour: vu les nombreuses demandes, j'ai ajouté à la fin de ce tutoriel la section "Envoyer un email avec Excel: Utilisation Avancée" qui contient les possibilités supplémentaires…
  • Selon vos besoins, vous pouvez envoyer directement le mail ou le garder prêt et l'envoyer manuellement. L'explication comment faire se trouve dans les commentaires dans le code.

 

Envoyer un email avec Excel: Utilisation Avancée

Comme souhaité par les utilisateurs dans les commentaires et dans les nombreux emails que je reçois à ce sujet, j'ai ajouté cette section afin de pouvoir y ajouter le code VBA supplémentaire qui ajoute des fonctionnalités à la fonction de base

Copie à ..., Copie invisible à ...

Copie à …, Copie invisible à …

Il est possible d’ajouter des destinataires supplémentaires en copie ou en copie invisible tout comme quand vous envoyez un email “normalement”.
Pour les destinataires en copie, vous devez ajouter: .CC = "destinataire_en_copie@email.fr"
Pour une copie invisible, le code est le suivant: .BCC = "copie_invisible@email.fr"

Ce code est à ajouter à l’intérieur du bloc:

tout comme le .To = "..."

Vous pouvez, selon votre besoin, ajouter ce code dans la fonction principale soit avec les valeurs fixes, soit vous ajoutez une ou deux variables supplémentaires pour pouvoir rendre votre fonction plus générique.

Plusieurs destinataires...

Plusieurs destinataires…

Vous pouvez ajouter plusieurs destinataires dans les champs .To, .CC et .BCC

La règle est simple: les différentes adresses email doivent être séparées par un point-virgule (;).
Exemple: .To = "paul@test.fr;marie@test.fr;contact@monentreprise.ca"

Donc si vous avez plusieurs emails et vous voulez vous baser sur ma fonction de base, vous pouvez soit “préparer” le contenu de l’argument Destinataire, soit vous ajoutez de nouvelles variables et vous “composez” le contenu de .To directement dans la fonction.

Personnellement, je vous suggérerais la première solution. Les avantages:

  • pas besoin de modifier la fonction de base
  • pas besoin de savoir en avance le nombre de destinataires
  • le nombre de destinataires n’a pas de limite
  • la “préparation” du champs .To (ou .CC ou .BCC) est tout à fait indépendante de la fonction d’envoi de l’email
Importance de l'email...

Importance de l’email…

Une autre chose que vous pouvez ajouter déterminer en VBA c’est l’importance de l’email.

Pour cela, nous utiliserons la propriété .Importance de l’objet oMailItem.
Cette propriété doit être ajoutée à l’intérieur du bloc

Il existe trois niveaux d’importance de l’email:

  • olImportanceHigh – correspond à l’importance haute
  • olImportanceNormal – correspond à l’importance normale (= valeur par défaut)
  • olImportanceLow – correspond à l’importance faible

Voici donc à quoi ressemblera le code VBA:

Et pour être tout à fait exhaustif, sachez que vous pouvez remplacer ces valeurs par des valeurs numériques allant de 0 à 2:

  • 2 – correspond à l’importance haute
  • 1 – correspond à l’importance normale (= valeur par défaut)
  • 0 – correspond à l’importance faible

Ce qui donnera donc comme code:

Personnellement, je vous conseillerais d’utiliser les valeurs textuelles pour une meilleure lisibilité de votre code.

Demander un accusé de réception / Demander un accusé de lecture

Demander un accusé de réception / Demander un accusé de lecture

Et voici le code VBA qui vous permettra de demander un accusé lors de l’envoi d’un email avec Excel:
Les propriétés de l’objet oMailItem à utiliser sont .ReadReceiptRequested pour l’accusé de lecture et .OriginatorDeliveryReportRequested. Pour activé la demande d’accusé, vous devez donner la valeur True à une ou les deux de ces propriétés (selon votre besoin).
De l’autre côté, pour être sûr que les accusés sont désactivés, attribuez leur la valeur False.

Plusieurs pièces jointes...

Plusieurs pièces jointes…

Pour ajouter une pièce jointe, le code à ajouter à l’intérieur du bloc:

est le suivant:
.Attachments.Add "C:\MonDossier\MonFichier.xlsx"

Pour ajouter plusieurs pièces jointes à l’email, il suffit de répéter toute cette ligne de code en changeant le nom et le chemin du fichier.
Exemple:

Donc à la fin, votre code ressemblera à ceci:

Image dans le corps du message

Image dans le corps du message

Il se peut que vous ayez besoin d’insérer une image directement dans le corps du message (et qu’elle soit visible) plutôt que de la mettre uniquement comme pièce jointe.
C’est possible!

Attention: cette fonctionnalité marche seulement si le format du texte de l’email est le HTML (olFormatHTML)

Voici la démarche à suivre:

  1. vous devez d’abord ajouter l’image en question comme si c’était une pièce jointe. On le fait comme dans la section précédente mais en ajoutant deux paramètres. voici le code VBA:
    ce code doit être placé dans le bloc:
  2. Maintenant que Outlook sait avec quel fichier travailler, vous pouvez le placer dans le code du message à l’endroit souhaité:
    Si vous préférez, vous pouvez utiliser les guillemets doubles dans le tag HTML plutôt que les apostrophes:
    N’oubliez pas d’adapter la hauteur (height=) et la largeur (width=) de l’image si vous le souhaitez. Vous pouvez omettre de mentionner ces deux dimensions. L’image dans l’email aura alors la taille réelle (attention à la lisibilité!).
    Le code sera alors plus simple:
    Toute l’astuce consiste dans le lien entre le code HTML du corps du message et la pièce jointe. Ce lien se fait par le cid: dans la balise HTML <img src=...>. Vous devez mentionner cid: et le nom du fichier à afficher. Attention, il ne faut pas mentionner tout le chemin mais uniquement le nom du fichier. Outlook connaît déjà le chemin grâce à l’étape n° 1) décrite plus haut.
    Donc comme déjà mentionné, la balise <img> aura la forme suivante:

Remarque: il est ainsi possible d’ajouter plusieurs images dans le corps du message.

Exemple:

Choisir le compte Outlook à utiliser comme adresse d'expéditeur

Choisir le compte Outlook à utiliser comme adresse d’expéditeur

Si vous utilisez plusieurs comptes (adresses email différentes) dans Outlook, le code ci-dessus vous permettra de choisir avec quelle adresse l’email doit être envoyé.

Il vous suffit d’écrire l’adresse email qui doit être utilisé comme valeur de CompteOutlook.SmtpAddress dans le code qui suit:

Dans la fonction principale, ce code doit être ajouté à l’intérieur du bloc With oMailItem / End With, avant l’instruction d’affichage ( .Display ) et d’envoi ( .Send ). Il suffit donc de l’insérer à la place de la ligne 45 du code…

Voici donc le code complet de la fonction avec cette fonctionnalité qui vous permettra de choisir avec quel adresse l’email doit être envoyé.

Bien sûr, il est également possible d’ajouter l’adresse de l’expéditeur comme un argument supplémentaire de la fonction principale. Ce serait probablement la solution la plus élégante… La voilà donc:


Envoyer un email avec Excel: Conclusion

J'espère que ce tutoriel a été clair et vous a aidé et qu'il vous a permis d'automatiser l'envoi des emails avec Excel… N'hésitez pas à partager vos remarques dans les commentaires.

Et n'oubliez pas de consulter les autres articles et tutoriels sur Excel et sur VBA!

Pour aller plus loin en VBA

Pour terminer, voici quelques articles qui pourraient vous intéresser…

 

Laissez un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

232 commentaires sur “VBA: Envoyer un email avec Excel (via Outlook)”