Pourquoi ? La macro de base Emails en masse Cas d'usage FAQ ← Retour au Blog
📘 Guide complet ⚡ VBA & Automatisation 🏷️ Longue traîne #1

Comment envoyer des emails automatiques depuis Excel avec VBA — Guide pratique

J'ai découvert ce sujet sur une mission chez un cabinet de gestion : la responsable administrative passait tous les lundis matin à envoyer une trentaine d'emails de relance. À la main. Un par un. Elle connaissait les noms par cœur tellement elle les avait tapés souvent. Deux heures perdues chaque semaine, 52 par an. Quand j'ai fini la macro, elle m'a dit « c'est tout ? » — parce que ça avait pris 8 secondes. Ce guide, c'est ça : vous montrer comment envoyer des emails depuis Excel avec VBA et faire la même chose sur votre fichier.

✍️ Henrick Balon — ASPECT
📅 Publié le 15 juin 2025 · Mis à jour le 15 juin 2025
⏱️ 18 min de lecture
🎯 Niveau : Intermédiaire
Tableau Excel avec liste clients et code VBA — envoi automatique d'emails vers Outlook depuis Excel
Fig. 1 — À gauche : le tableau Excel avec les données clients et le code VBA. À droite : votre messagerie qui reçoit les emails générés automatiquement. VBA fait le pont entre les deux en quelques secondes.
⚡ Ce que vous allez apprendre
  • 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.

❌ Sans automatisation
  • 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
✅ Avec VBA + messagerie
  • 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)
Comparaison visuelle : sans VBA — emails éparpillés et chronophages ; avec VBA + Outlook — 1 clic suffit pour tout envoyer
Fig. 2 bis — La différence résumée en une image : sans VBA, les relances sont désorganisées et chronophages. Avec VBA, un seul clic envoie tous les emails personnalisés en quelques secondes.

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.

💡
Ce qu'il vous faut — et c'est vraiment peu

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"
⚠️
Attention : Mac ? Attention, ça ne marchera pas tel quel

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

1

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.

2

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.

3

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.

Les 3 étapes pour envoyer un email depuis Excel avec VBA : 1 Référencer Outlook, 2 Écrire le code VBA de base, 3 Tester avec .Display
Fig. 3 — Les 3 étapes incontournables : (1) activer la référence Outlook dans VBA, (2) écrire le code de base, (3) toujours tester avec .Display avant d'utiliser .Send.
Fenêtre Références VBAProject avec Microsoft Outlook 16.0 Object Library cochée — éditeur Visual Basic Excel
Fig. 2 — La fenêtre Outils → Références de l'éditeur VBA. Sans cette étape, le code génère une erreur "Type défini par l'utilisateur non défini". Ici, "Microsoft Outlook 16.0 Object Library" est bien cochée.

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.

Module1.bas — Macro de base
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
Toujours tester avec .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 :

Corps HTML — Email mis en forme
' ── 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

📊 Exemple de tableau de données — Feuille "Données"
Structure du tableau Excel pour l'envoi d'emails automatiques personnalisés
Colonne A Colonne B Colonne C Colonne D Colonne E Colonne F
Nom client Email 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
Schéma VBA Loop Processor : tableau Excel source à gauche, processeur VBA au centre, emails personnalisés en sortie à droite
Fig. 5 — Le principe du VBA Loop Processor : chaque ligne du tableau Excel alimente la boucle VBA qui génère un email unique et personnalisé. La vitesse d'exécution est quasi instantanée, même pour 200 lignes.

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".

Module1.bas — Envoi personnalisé en masse avec boucle
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
🔒
Ne jamais supprimer la colonne de traçabilité

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.

Module1.bas — Génération PDF + Pièce jointe
' ════════════════════════════════════════════════════════════
' 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
Génération automatique d'un PDF depuis Excel VBA attaché en pièce jointe dans Outlook — fichier FAC-2025-042.pdf
Fig. 3 — VBA génère le PDF (ici "FAC-2025-042.pdf") et l'attache automatiquement à l'email Outlook en pièce jointe. Tout le processus est invisible pour l'utilisateur — un seul clic suffit.

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.

💸
Relances clients impayés
Email personnalisé par client avec numéro de facture, montant et date d'échéance. PDF de la facture en pièce jointe.
📦
Alertes de stock bas
Notification automatique au responsable achat quand une référence passe sous le seuil minimal défini dans le tableau.
📊
Envoi de rapports mensuels
Le rapport Excel est exporté en PDF et envoyé automatiquement à la liste de managers chaque 1er du mois (via une macro déclenchée manuellement ou par tâche planifiée).
Notifications de validation
Un responsable valide une ligne dans Excel, la macro envoie une confirmation au demandeur avec les détails de la validation.
🎂
Emails d'anniversaire clients
Chaque matin, la macro vérifie si des clients ont leur anniversaire aujourd'hui et envoie un email personnalisé automatiquement.
📋
Fiches de paie individuelles
Génération d'un PDF par employé depuis un modèle Excel, envoyé à chaque adresse email individuelle en un seul clic.
Alerte de stock bas générée automatiquement depuis Excel VBA — notification LOW STOCK avec bouton Send Alert dans le tableau
Fig. 6 — Exemple d'alerte de stock bas générée depuis Excel : dès qu'une référence passe sous le seuil, VBA déclenche l'email d'alerte au responsable achat. Aucune surveillance manuelle nécessaire.
🎯
Comment savoir si ça vaut le coup d'automatiser ?

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.

📊 Tableau comparatif — Méthodes d'envoi d'emails depuis Excel
Comparaison des trois méthodes d'envoi d'emails depuis Excel : Outlook VBA, CDO SMTP et Power Automate
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

Infographie du tableau de l'automatisation des emails Excel VBA : préparer Excel, VBA Engine, code VBA, output Outlook avec PDF en pièce jointe
Fig. 7 — Vue d'ensemble du processus complet : (1) préparer le tableau Excel avec les données clients, (2) le moteur VBA traite chaque ligne, (3) le code VBA pilote Outlook, (4) les emails partent avec le PDF en pièce jointe.

Ce tableau synthétise tout ce que vous devez retenir pour mettre en place votre automatisation d'emails depuis Excel.

📋 Récapitulatif — Automatisation emails Excel VBA 2025
Tableau récapitulatif de l'automatisation des emails depuis Excel avec VBA : prérequis, fonctionnalités, délais et tarifs
É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.

🛡️
Ce que je fais systématiquement sur les missions ASPECT

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.

Oui. La méthode CDO (Collaboration Data Objects) permet d'envoyer des emails directement via un serveur SMTP, sans qu'Outlook soit installé. Cela fonctionne avec Gmail, OVH, ou tout serveur SMTP configuré. Le code est plus complexe (il faut renseigner le serveur SMTP, le port, les identifiants), mais c'est la solution idéale pour des postes sans Outlook ou pour des déploiements sur serveur.
Non. VBA peut démarrer Outlook automatiquement en arrière-plan s'il n'est pas déjà ouvert. Si votre client de messagerie est déjà ouvert, VBA utilise l'instance existante. Dans tous les cas, Outlook doit être installé et un profil email actif doit exister sur le poste. Les emails envoyés apparaissent bien dans le dossier Éléments envoyés de votre messagerie.
Il faut créer une boucle VBA (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.
Oui, c'est l'une des fonctionnalités les plus puissantes de cette combinaison VBA + Outlook. La méthode 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.
Oui, par défaut. Les emails envoyés via .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.
Oui, via le Planificateur de tâches Windows. Vous créez une tâche planifiée qui ouvre Excel, exécute la macro et ferme Excel — tous les jours à 8h par exemple. Cela nécessite un poste qui reste allumé. Pour des déclenchements vraiment autonomes sans poste fixe, Power Automate (Microsoft 365) est plus adapté : il peut déclencher un flux depuis n'importe où, même sans poste allumé.
Un système complet d'envoi automatique d'emails depuis Excel — incluant la boucle personnalisée, le corps HTML, les pièces jointes PDF, la traçabilité et une session de formation — est généralement livré pour 300 € à 600 € selon la complexité. La consultation découverte (30 min) est toujours gratuite et permet d'obtenir un devis précis sans engagement. Contactez ASPECT →
🗓️ Article publié le — Dernière mise à jour : ✅ Code VBA testé sur Excel 2016, 2019 & Microsoft 365
ASPECT Automation — Réservez votre consultation gratuite de 30 minutes pour automatiser vos fichiers Excel

Vous voulez que je le fasse pour vous ?

Si vous avez lu jusqu'ici et que vous vous dites « c'est bien beau mais j'ai pas le temps de coder ça » — c'est exactement pour ça qu'ASPECT existe. Appelez-moi 30 minutes, on regarde votre fichier ensemble, et je vous dis ce qui est faisable et en combien de temps.