- → Comment envoyer des emails automatiques depuis Excel avec VBA et votre messagerie en moins de 20 lignes de code
- → Comment créer une macro Excel qui personnalise chaque email avec les données de votre tableau
- → Comment générer un PDF et l'attacher automatiquement à chaque email envoyé
- → Les erreurs à éviter absolument et les bonnes pratiques de l'automatisation Excel
01Pourquoi automatiser les emails depuis Excel ?
Je vais être direct : si vous gérez des relances, des alertes ou des rapports récurrents depuis Excel, vous perdez probablement entre 1h et 3h par semaine sur des tâches qu'une macro Excel VBA ferait en moins de 10 secondes. C'est le principe de base de l'automatisation Excel. C'est pas une exagération — c'est ce que je vois sur presque chaque mission.
Le principe de cette automatisation Excel est simple : Excel a déjà toutes vos données. Noms, emails, montants, dates d'échéance. Tout est là. La seule chose qui manque, c'est l'ordre d'appuyer sur "Envoyer". C'est exactement ce que fait une macro VBA — elle prend chaque ligne, construit l'email, et le balance dans votre boîte mail. Sans que vous ayez à toucher quoi que ce soit.
- ✗Filtrer le tableau à la main chaque semaine
- ✗Copier-coller nom, montant, date dans chaque email
- ✗Risque d'envoyer le mauvais montant au mauvais client
- ✗Aucune traçabilité des envois dans Excel
- ✗30 à 60 min perdues chaque semaine
- ✓1 clic sur un bouton, tous les emails partent
- ✓Chaque email est personnalisé depuis les données Excel
- ✓Zéro risque d'erreur de copier-coller
- ✓Colonne "Email envoyé le" mise à jour automatiquement
- ✓Traçabilité complète dans votre messagerie (Éléments envoyés)
Dans la pratique, j'utilise cette méthode pour des relances impayées, des alertes de stock, des rapports mensuels aux directeurs, des confirmations de commande… C'est l'un des cas d'usage les plus fréquents de l'automatisation Excel VBA que je propose chez ASPECT. Le point commun : dès qu'un email se répète avec des données qui changent à chaque fois, c'est automatisable. Et souvent, ça prend moins d'une journée à coder.
Excel sur Windows avec un client mail compatible. C'est tout. Pas de plugin, pas d'abonnement, rien à installer. Si vous avez Office, vous avez VBA. Ça fonctionne de la même façon sur Excel 2010, 2016, 2019 et Microsoft 365 — j'ai testé sur les quatre.
02Prérequis : ce qu'il faut avoir sur son poste
Avant de copier-coller quoi que ce soit, un point rapide sur l'environnement. Je vois des gens bloquer une heure sur une erreur qui vient juste d'une référence pas cochée — autant l'éviter dès le départ.
- ✓Microsoft Excel — version 2010, 2013, 2016, 2019 ou Microsoft 365 (Windows uniquement pour la méthode Outlook/mail)
- ✓Microsoft Outlook installé et configuré — avec un compte email actif (Exchange, Outlook.com, Gmail via IMAP…)
- ✓L'éditeur VBA accessible — appuyez sur ALT + F11 dans Excel pour l'ouvrir
- ✓La référence Outlook activée — dans l'éditeur VBA : Outils → Références → cocher "Microsoft Outlook XX.X Object Library"
La méthode Outlook.Application est 100% Windows. Sur Mac, l'intégration VBA avec la messagerie est très limitée et l'interaction avec l'application de messagerie plante régulièrement. Si vous êtes sur Mac, regardez la section 7 sur CDO ou Power Automate — c'est la solution que je recommande dans ce cas.
📌 Activer la référence Outlook — l'étape que tout le monde oublie
Ouvrir l'éditeur VBA
Dans Excel, faites ALT + F11. Une fenêtre un peu austère s'ouvre — c'est l'éditeur Visual Basic. Ne vous laissez pas impressionner.
Outils → Références
Dans la barre du haut de l'éditeur VBA, cliquez sur Outils → Références…. Une liste de bibliothèques apparaît — la plupart ne vous serviront jamais.
Cocher "Microsoft Outlook XX.X Object Library"
Faites défiler jusqu'à la ligne Microsoft Outlook (16.0 pour Office 365, 15.0 pour 2013…), cochez-la, OK. Sans ça, VBA vous sort l'erreur "Type défini par l'utilisateur non défini" et vous cherchez pourquoi pendant 20 minutes.
03La macro Excel de base pour envoyer un email automatique en 15 lignes
On commence simple. Voici le code minimal pour envoyer un email depuis Excel avec VBA Excel — j'ai commenté ligne par ligne parce que je déteste les tutoriels qui balancent 40 lignes de code sans expliquer ce que ça fait. Comptez 15 lignes utiles, pas plus.
Sub EnvoyerEmailSimple() ' ── Déclaration des variables ────────────────────── Dim appOutlook As Outlook.Application Dim mail As Outlook.MailItem ' ── Gestion des erreurs ──────────────────────────── On Error GoTo GestionErreur ' ── Créer une instance Outlook ───────────────────── Set appOutlook = New Outlook.Application Set mail = appOutlook.CreateItem(0) ' 0 = olMailItem ' ── Définir les propriétés de l'email ────────────── With mail .To = "client" & "@" & "exemple.fr" ' Remplacer par l'adresse réelle .CC = "compta" & "@" & "monentreprise.fr" ' Optionnel — supprimer si inutile .Subject = "Relance facture — Référence FAC-2025-042" .Body = "Bonjour," & vbCrLf & vbCrLf & _ "Nous vous contactons au sujet de la facture FAC-2025-042" & _ " d'un montant de 1 250 € échue le 01/06/2025." & _ vbCrLf & vbCrLf & _ "Merci de bien vouloir procéder au règlement." & _ vbCrLf & vbCrLf & "Cordialement," ' .Display ouvre l'email dans Outlook pour vérifier avant envoi ' .Send envoie directement — toujours tester avec .Display d'abord ! .Display End With GoTo Nettoyage GestionErreur: MsgBox "Erreur " & Err.Number & " : " & Err.Description, vbCritical Nettoyage: Set mail = Nothing Set appOutlook = Nothing End Sub
.Display — jamais .Send direct
Je ne peux pas insister assez là-dessus. La première fois que j'ai utilisé .Send directement en test, j'ai envoyé un email vide à 12 personnes. Utilisez .Display : ça ouvre l'email dans votre boîte mail pour vérification. Quand tout est bon, vous passez à .Send.
📧 Ajouter un corps HTML pour un email mis en forme
Un email en texte brut, ça passe. Mais si vous voulez mettre le montant en rouge ou structurer le message correctement — il faut passer en HTML. C'est .HTMLBody qui gère ça, et c'est franchement pas sorcier si vous avez déjà touché à du HTML basique :
' ── Remplacer .Body par .HTMLBody pour un email mis en forme ── ' Les balises HTML sont écrites normalement dans les chaînes VBA .HTMLBody = "<html>" & _ "<body style='font-family:Calibri,Arial;font-size:14px;color:#222;'>" & _ "<p>Bonjour <strong>" & nomClient & "</strong>,</p>" & _ "<p>Votre facture <strong style='color:#c0392b;'>" & _ refFacture & "</strong>" & _ " d'un montant de <strong>" & montant & "</strong>" & _ " est arrivée à échéance.</p>" & _ "<p>Merci de procéder au règlement dans les meilleurs délais.</p>" & _ "<hr>" & _ "<p style='color:#888;font-size:12px;'>ASPECT — Expert Excel & VBA</p>" & _ "</body></html>" ' Note : dans VBA, les balises HTML s'écrivent normalement avec < et > ' Exemple : "<p>" affiche <p> dans le code mais envoie <p> dans l'email ' C'est votre éditeur VBA qui fait la conversion automatiquement
04Envoyer des emails personnalisés en masse : la macro Excel VBA complète
C'est la partie qui change vraiment les choses en VBA Excel. Un seul email automatique, c'est sympa. Cent emails personnalisés en 8 secondes, c'est là que les gens comprennent pourquoi j'ai monté ASPECT. Le principe : une boucle VBA lit chaque ligne, extrait les données, construit l'email, l'envoie, coche "traité", et passe à la suivante. Vous regardez les emails partir dans Outlook sans rien faire.
📋 Structure du tableau Excel attendue
| Colonne A | Colonne B | Colonne C | Colonne D | Colonne E | Colonne F |
|---|---|---|---|---|---|
| Nom client | Réf. facture | Montant (€) | Échéance | Email envoyé ? | |
| Dupont SARL | [email protected] | FAC-2025-041 | 1 250,00 € | 01/06/2025 | Non |
| Martin & Co | [email protected] | FAC-2025-042 | 3 780,00 € | 28/05/2025 | Non |
| Lefebvre SAS | [email protected] | FAC-2025-039 | 890,00 € | 15/05/2025 | ✓ 03/06/2025 |
La colonne F, c'est votre filet de sécurité. La macro y inscrit la date dès qu'elle traite une ligne. Résultat : si vous relancez la macro par erreur le lendemain, elle ignore ce qui a déjà été envoyé. J'appelle ça l'idempotence — un grand mot pour dire "tu peux appuyer autant de fois que tu veux, ça ne doublonnera jamais".
Sub EnvoyerRelancesClients() ' ── Déclaration des variables ────────────────────────── Dim appOL As Outlook.Application Dim mail As Outlook.MailItem Dim ws As Worksheet Dim dernLigne As Long Dim i As Long Dim nomClient As String Dim emailDest As String Dim refFact As String Dim montant As String Dim echeance As String Dim nbEnvois As Integer Dim nbErreurs As Integer ' ── Pointer vers la feuille de données ───────────────── Set ws = ThisWorkbook.Sheets("Données") dernLigne = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' ── Vérification : feuille vide ? ────────────────────── If dernLigne < 2 Then MsgBox "Aucune donnée trouvée dans la feuille.", vbExclamation Exit Sub End If ' ── Initialiser Outlook ───────────────────────────────── Set appOL = New Outlook.Application nbEnvois = 0 nbErreurs = 0 ' ── Boucle sur chaque ligne à partir de la ligne 2 ───── For i = 2 To dernLigne ' Traiter uniquement les lignes non encore envoyées If ws.Cells(i, 6).Value = "" And ws.Cells(i, 2).Value <> "" Then ' ── Lire les données de la ligne ─────────────────── nomClient = ws.Cells(i, 1).Value emailDest = ws.Cells(i, 2).Value refFact = ws.Cells(i, 3).Value montant = Format(ws.Cells(i, 4).Value, "#,##0.00") & " €" echeance = Format(ws.Cells(i, 5).Value, "dd/mm/yyyy") ' ── Créer l'email ────────────────────────────────── On Error Resume Next Set mail = appOL.CreateItem(0) With mail .To = emailDest .Subject = "Relance — Facture " & refFact & " échue le " & echeance .HTMLBody = "<html><body style='font-family:Calibri;font-size:14px;'>" & _ "<p>Bonjour <strong>" & nomClient & "</strong>,</p>" & _ "<p>Sauf erreur, la facture <strong>" & refFact & _ "</strong> d'un montant de <strong style='color:#c0392b;'>" & _ montant & "</strong> est échue le <strong>" & echeance & "</strong>.</p>" & _ "<p>Merci de procéder au règlement. Nous restons disponibles.</p>" & _ "<p>Cordialement,<br><strong>ASPECT</strong></p>" & _ "</body></html>" .Send End With On Error GoTo 0 ' ── Marquer la ligne comme traitée ───────────────── If Err.Number = 0 Then ws.Cells(i, 6).Value = "✓ " & Format(Now(), "dd/mm/yyyy hh:mm") ws.Cells(i, 6).Font.Color = 5287936 ' Vert nbEnvois = nbEnvois + 1 Else ws.Cells(i, 6).Value = "ERREUR" ws.Cells(i, 6).Font.Color = 255 ' Rouge nbErreurs = nbErreurs + 1 End If Set mail = Nothing End If ' fin du bloc de traitement Next i ' ── Libérer et afficher le bilan ──────────────────────── Set appOL = Nothing MsgBox "✅ Terminé : " & nbEnvois & " email(s) envoyé(s)" & _ IIf(nbErreurs > 0, vbCrLf & "⚠️ " & nbErreurs & " erreur(s) — voir colonne F", ""), _ vbInformation End Sub
Sur une mission, un client avait supprimé cette colonne parce qu'elle "prenait de la place". La macro a renvoyé 80 emails à tous ses clients le lundi matin. Gardez-la. Toujours.
05Ajouter une pièce jointe PDF générée depuis Excel
C'est souvent la première question qu'on me pose après la démo de la boucle : « et pour joindre la facture en PDF ?». La réponse est oui. VBA génère le PDF depuis votre feuille modèle, l'attache à l'email, puis le supprime du disque après envoi — tout ça dans la même macro, sans intervention.
' ════════════════════════════════════════════════════════════ ' Ce code s'intègre dans la Sub EnvoyerRelancesClients() ' Les Dim ci-dessous se placent en haut du Sub, avec les autres ' ════════════════════════════════════════════════════════════ ' ── À ajouter dans la section Dim du Sub principal ───────── Dim cheminPDF As String Dim wsFacture As Worksheet ' ── À ajouter dans la boucle, AVANT .Send ────────────────── ' 1. Pointer vers la feuille modèle de facture Set wsFacture = ThisWorkbook.Sheets("Modèle Facture") ' 2. Injecter les données du client dans le modèle wsFacture.Range("B3").Value = nomClient wsFacture.Range("B4").Value = refFact wsFacture.Range("B5").Value = montant wsFacture.Range("B6").Value = echeance ' 3. Définir le chemin du PDF temporaire (dossier TEMP Windows) cheminPDF = Environ("TEMP") & "" & refFact & "_relance.pdf" ' 4. Exporter la feuille modèle en PDF wsFacture.ExportAsFixedFormat _ Type:=xlTypePDF, _ Filename:=cheminPDF, _ Quality:=xlQualityStandard, _ IncludeDocProperties:=False, _ OpenAfterPublish:=False ' 5. Dans le bloc With mail, attacher le PDF AVANT .Send With mail .To = emailDest .Subject = "Relance — Facture " & refFact & " échue le " & echeance .HTMLBody = "<html><body style='font-family:Calibri;font-size:14px;'>" & _ "<p>Bonjour <strong>" & nomClient & "</strong>,</p>" & _ "<p>Veuillez trouver en pièce jointe la facture <strong>" & _ refFact & "</strong> d'un montant de <strong style='color:#c0392b;'>" & _ montant & "</strong>, échue le <strong>" & echeance & "</strong>.</p>" & _ "<p>Merci de procéder au règlement. Nous restons disponibles.</p>" & _ "<p>Cordialement,<br><strong>ASPECT</strong></p></body></html>" .Attachments.Add cheminPDF ' ← Attacher le PDF généré .Send End With ' 6. Supprimer le fichier PDF temporaire après envoi If Dir(cheminPDF) <> "" Then Kill cheminPDF
06Cas d'usage concrets : relances, alertes, rapports
Les relances clients, c'est l'exemple classique de ce qu'on appelle parfois le publipostage email depuis Excel — mais ce n'est pas le seul cas d'usage. Voici les situations que je rencontre le plus souvent en mission, et où cette automatisation fait vraiment gagner du temps.
Ma règle perso : si vous faites la même action plus de 3 fois par mois, c'est rentable. En dessous, un simple modèle Outlook suffit — inutile de sortir VBA pour envoyer 2 emails par trimestre. Au-dessus de 3 fois par mois, le temps de développement est récupéré en quelques semaines.
07Comparatif : méthode Outlook vs CDO vs Power Automate
Question qu'on me pose souvent sur la macro Excel Outlook : « pourquoi passer par Outlook et pas directement par un serveur SMTP ou Power Automate ?». Voici ma réponse honnête — avec les avantages et les limites de chaque approche.
| Critère | Outlook + VBA | CDO (SMTP direct) | Power Automate |
|---|---|---|---|
| Facilité de mise en place | Facile | Complexe | Intermédiaire |
| Fonctionne sans Outlook installé | Non | Oui | Oui |
| Compatible Mac | Limité | Oui | Oui |
| Emails dans "Éléments envoyés" | Oui | Non | Selon config |
| Pièces jointes PDF | Natif | Oui | Oui |
| Corps HTML mis en forme | Oui | Oui | Oui |
| Coût | Inclus Office | Gratuit | Microsoft 365 requis |
| Déclenchement automatique planifié | Via Tâche Windows | Via Tâche Windows | Natif |
| Recommandé pour | PME sous Windows avec Outlook | Serveurs / sans Outlook | Environnements Microsoft 365 |
Mon avis tranché : pour 90% des PME avec Office sous Windows, Outlook + VBA est le meilleur choix. Setup en 5 minutes, emails dans les éléments envoyés de votre boîte mail, aucun abonnement supplémentaire. Power Automate est puissant mais rajoute une couche de complexité pas toujours justifiée. Je le recommande surtout quand il faut des envois vraiment automatiques, sans personne derrière l'ordinateur.
08Tableau récapitulatif complet
Ce tableau synthétise tout ce que vous devez retenir pour mettre en place votre automatisation d'emails depuis Excel.
| Élément | Détail | Niveau |
|---|---|---|
| Prérequis logiciel | Excel + Outlook (Windows), référence Outlook activée dans VBA | Simple |
| Envoi email de base | 15 lignes de code, destinataire + sujet + corps + .Send | Débutant |
| Envoi personnalisé en masse | Boucle sur le tableau, variables extraites par ligne, colonne traçabilité | Intermédiaire |
| Corps HTML mis en forme | Propriété .HTMLBody à la place de .Body | Simple |
| Pièce jointe PDF automatique | ExportAsFixedFormat → .Attachments.Add → Kill (nettoyage) | Intermédiaire |
| Traçabilité des envois | Colonne "Email envoyé le" mise à jour en temps réel dans le tableau | Simple |
| Délai de développement | 2 à 5 jours pour une solution complète sur mesure | Sur devis |
| Tarif ASPECT | À partir de 300 € pour un système d'envoi automatique complet | Freelance |
09Erreurs fréquentes en VBA Excel — et comment les éviter
J'ai compilé ici les erreurs les plus fréquentes sur l'automatisation des emails depuis Excel — les pièges que je vois sur à peu près toutes les missions où quelqu'un a essayé de faire ça seul avant de me contacter. Pas pour se moquer — moi aussi j'ai fait certaines de ces erreurs au début. Autant vous les éviter.
❌ Erreur 1 — Oublier d'activer la référence Outlook
Responsable de 80% des questions que je reçois par email. Si VBA vous sort "Type défini par l'utilisateur non défini", regardez Outils → Références avant de chercher ailleurs. La bibliothèque Outlook n'est pas cochée. Deux clics et c'est réglé.
❌ Erreur 2 — Utiliser .Send sans avoir testé avec .Display
Je l'ai fait. J'avais un bug dans ma variable "nomClient" qui retournait une valeur vide. Résultat : « Bonjour , » avec une virgule flottante, envoyé à 40 contacts. Depuis, je ne touche jamais à .Send sans avoir validé avec .Display d'abord — même sur du code que je connais par cœur.
❌ Erreur 3 — Ne pas gérer les cellules vides
Une ligne sans adresse email dans votre tableau, et la macro plante en plein milieu. Les emails suivants ne partent pas. Toujours ajouter une vérification : If ws.Cells(i, 2).Value = "" Then GoTo SuiteLigne.
❌ Erreur 4 — Oublier la traçabilité
J'en parle dans la section 4 mais ça mérite d'être répété : sans colonne de traçabilité, vous pouvez envoyer le même email deux fois au même client. Dans le cas d'une relance impayée, c'est gênant. Dans le cas d'une communication commerciale, c'est potentiellement désastreux pour votre image.
❌ Erreur 5 — Chemins de fichiers PDF en dur
Ne jamais écrire "C:\Users\Jean\Documents\..." dans votre code. Si le fichier est utilisé sur un autre poste, le chemin cassera. Utilisez Environ("TEMP") pour les temporaires ou ThisWorkbook.Path pour les fichiers relatifs au classeur.
J'encadre toujours la boucle avec On Error Resume Next et un log dans une feuille « Journal ». Si un email échoue (adresse invalide, Outlook qui bug), la macro continue avec les suivants et vous avez un rapport complet à la fin — quels emails ont marché, lesquels ont planté et pourquoi.
10FAQ — Questions fréquentes : comment envoyer un email automatique depuis Excel avec VBA ?
Ce sont les questions que je reçois le plus souvent — par email, sur Malt, ou en appel découverte. Je les réponds ici une bonne fois pour toutes.
For i = 2 To dernLigne) qui parcourt chaque ligne de votre tableau. Pour chaque ligne, les données (nom, email, montant…) sont extraites dans des variables, puis injectées dans le corps de l'email via une concaténation de chaînes. Chaque email est ainsi unique et personnalisé, même si 200 emails sont envoyés via votre messagerie en moins d'une minute. L'exemple complet est disponible dans la section 4 de cet article.
ExportAsFixedFormat génère un PDF depuis n'importe quelle feuille Excel. Ce fichier est ensuite attaché à l'email via .Attachments.Add cheminPDF. Une fois l'email envoyé, le PDF temporaire est supprimé avec Kill cheminPDF. Tout le processus est transparent pour l'utilisateur et ne laisse aucun fichier parasite.
.Send dans VBA apparaissent dans le dossier "Éléments envoyés" de messagerie, exactement comme un email envoyé manuellement. Cela garantit une traçabilité complète de tous les envois automatiques, ce qui est indispensable en environnement professionnel et notamment pour les relances clients.