VBA: Envoyer un email avec Excel (via Outlook) 52


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)!

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
  • le contenu de l'email
  • l'adresse email du destinataire
  • en option, le chemin complet du fichier qui doit être attaché à l'email en tant que pièce jointe

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

Sub EnvoyerEmail(ByVal Sujet As String, ByVal Destinataire As String, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String)
'par Excel-Malin.com ( https://excel-malin.com )

On Error GoTo EnvoyerEmailErreur

'définition des variables
Dim oOutlook As Outlook.Application
Dim WasOutlookOpen As Boolean
Dim oMailItem As Outlook.MailItem
Dim Body As Variant

Body = ContenuEmail

    'vérification si le Contenu du mail n'est pas vide. Si oui, email n'est pas envoyé. Si vous voulez pouvoir envoyer les email vides, mettez en commentaire les 4 lignes de code qui suivent.
    If (Body = False) Then
        MsgBox "Mail non envoyé car vide", vbOKOnly, "Message"
        Exit Sub
       End If
    
    'préparer Outlook
    PreparerOutlook oOutlook
    Set oMailItem = oOutlook.CreateItem(0)
    
    'création de l'email
    With oMailItem
        .To = Destinataire
        .Subject = Sujet
        
        'CHOIX DU FORMAT
        '----------------------
        'email formaté comme texte
            .BodyFormat = olFormatRichText
            .Body = Body
            
            'OU
            
        'email formaté comme HTML
            '.BodyFormat = olFormatHTML
            '.HTMLBody = "<html><p>" & Body & "</p></html>"
        '----------------------
        
        If PieceJointe <> "" Then .Attachments.Add PieceJointe

       .Display   '<- affiche l'email (si vous ne voulez pas l'afficher, mettez cette ligne en commentaire)
       .Save      '<- sauvegarde l'email avant l'envoi (pour ne pas le sauvegarder, mettez cette ligne en commentaire)
       .Send      '<- envoie l'email (si vous voulez seulement préparer l'email et l'envoyer manuellement, mettez cette ligne en commentaire)
    End With
    
   'nettoyage...
    If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
    If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
    
   Exit Sub

EnvoyerEmailErreur:
    If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
    If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
  
    MsgBox "Le mail n'a pas pu être envoyé...", vbCritical, "Erreur"
End Sub

Private Sub PreparerOutlook(ByRef oOutlook As Object)
'par Excel-Malin.com ( https://excel-malin.com )

'------------------------------------------------------------------------------------------------
'Ce code vérifie si Outlook est prêt à envoyer des emails... Et s'il ne l'est pas, il le prépare.
'------------------------------------------------------------------------------------------------
On Error GoTo PreparerOutlookErreur


On Error Resume Next
    'vérification si Outlook est ouvert
    Set oOutlook = GetObject(, "Outlook.Application")
    
    If (Err.Number <> 0) Then 'si Outlook n'est pas ouvert, une instance est ouverte
        Err.Clear
        Set oOutlook = CreateObject("Outlook.Application")
    Else    'si Outlook est ouvert, l'instance existante est utilisée
        Set oOutlook = GetObject("Outlook.Application")
        oOutlook.Visible = True
    End If
    Exit Sub

PreparerOutlookErreur:
    MsgBox "Une erreur est survenue lors de l'exécution de PreparerOutlook()..."
End Sub

 

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: texte ou HTML

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

        'CHOIX DU FORMAT
        '----------------------
        'email formaté comme texte
            .BodyFormat = olFormatRichText
            .Body = Body
            
            'OU
            
        'email formaté comme HTML
            '.BodyFormat = olFormatHTML
            '.HTMLBody = "<html><p>" & Body & "</p></html>"
        '----------------------

 

Pour le format texte, vous pouvez laisser le code initial inchangé (lignes 32 et 33 actives, lignes 38 et 39 en commentaire).

Pour le format HTML, faites le contraire – mettez les lignes 32 et 33 en commentaire et rendez les lignes 38 et 39 actives.

Quelle est la différence? En gros, le format HTML vous permet d'utiliser les balises & le code HTML pour formater le contenu de votre email.

Vous pouvez voir la différence entre ces deux 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.

Sub TestEnvoiEmail()
'par Excel-Malin.com ( https://excel-malin.com )

    'test envoi de l'email sans pièce jointe
        Call EnvoyerEmail("Test email 1", "contact@test.fr", "Ceci est un test...")
     
     'test envoi de l'email avec pièce jointe
        Call EnvoyerEmail("Test email 2", "contact@test.fr", "Ceci est un test avec pièce jointe...", "C:\MonDossier\MonFichier.pdf")
 
 MsgBox "Test terminé..."

End Sub

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…

 

Sub TestEnvoiEmail_Variables()
'par Excel-Malin.com ( https://excel-malin.com )

'définition des variables
Dim MonSujet As String
Dim MonDestinataire As String
Dim MonContenu As String
Dim MaPieceJointe As String

'attribution des valeurs aux variables
MonSujet = "Test d'email d'Excel avec variables"
MonDestinataire = "jean.dupont@dupont.fr"
MonContenu = "Bonjour Jean, voici un petit message de test... Avec un fichier en plus."
MaPieceJointe = "C:\Test\MonFichierExcel.xlsx"
    
    'test envoi de l'email
        Call EnvoyerEmail(MonSujet, MonDestinataire, MonContenu, MaPieceJointe)

MsgBox "Test terminé..."
End Sub

 

Exemple de code pour envoyer en email en format 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).

Sub TestEnvoiEmail_FormatHTML()
'par Excel-Malin.com ( https://excel-malin.com )

    'test envoi de l'email sans pièce jointe
        Call EnvoyerEmail("Test email HTML 1", "contact@test.fr", "Ceci est un <strong>test</strong><br>avec les formats <span style=""color: #f55; font-weight: bold;"">HTML</span>...")

MsgBox "Test terminé..."
End Sub

 

Remarques

  • 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…
  • 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.

135 0




Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.

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

  • Guillaume VAILLANT

    Bonjour,

    J'aimerai envoyer dans mon message non pas une string simplement comme dans l'exemple mais un copier/coller de plusieurs cellules (Range("A1:B6) par exemple).

    Merci de m'indiquer comment faire svp.

    Cdt

    Guillaume

    • Guillaume VAILLANT

      Bonjour,

      Petite relance svp. Est-ce possible ou pas de réaliser cette opération svp ?

      PS : Beau travail en tout cas, marche du 1er coup ;o)

      • excel-malin.com Auteur du billet

        Bonjour Guillaume,
        je n'étais pas dispo plus tôt…

        Pour votre question:
        un simple copier/coller n'est pas possible. Je vois deux possibilités:
        1) créer une image à partir de la plage souhaité (voir le code ici) et ensuite l'ajouter comme pièce jointe (voir le code sur cette page)
        2) créer un tableau HTML avec les valeurs qui se trouvent dans la plage (désavantage, le formatage ne sera pas copié). Pour cela, le code rassemblerait à quelque chose comme ceci:


        HTMLtableau = "<table>"
        Plage = "A1:B6"
        nbColonnes = Range(Plage).Columns.Count
        nbLignes = Range(Plage).Rows.Count
        
        For Ligne = 1 To nbLignes
            HTMLtableau = HTMLtableau & "<tr>"
                For Colonne = 1 To nbColonnes       
                    HTMLtableau = HTMLtableau & "<td>" & Range(Plage).Cells(Ligne, Colonne).Value & "</td>"
                Next Colonne
            HTMLtableau = HTMLtableau & "</tr>"
        Next Ligne
        
        HTMLtableau = HTMLtableau & "</table>"
        

        Vous ajoutez le résultat à l'endroit voulu dans le body et voilà…
        Après, il y a moyen de jouer avec les styles etc. pour formater le tableau.

        J'espère que cela vous aide!
        Bàv, Martin

        • Guillaume VAILLANT

          Bonjour et merci beaucoup pour cette réponse.

          La 1ère solution ne convient pas car je veux copier/coller plusieurs groupes de cellules les unes en dessous des autres afin de constituer un mail récapitulatif et visuel (pas de PJ).

          Pour la seconde effectivement on perd le formatage et ça devient quasi-illisible.

          Pas possible de faire un mix des 2 ? Pas possible de copier les images dans le body du mail ?

          Cdt

          Guillaume

          • excel-malin.com Auteur du billet

            J'ai un peu cherché et j'ai une bonne nouvelle – c'est possible!
            Donc:
            1) vous créez l'image JPG de la plage via le code dans mon précédent commentaire
            2) vous ajoutez cette image comme pièce jointe à l'email (avec le code sur cette page)
            3) il faut maintenant placer cette image dans le body HTML du mail. Pour cela, il suffit d'ajouter ce code avant le .Send


            .HTMLBody = .HTMLBody & "
            Mon image:

            "

            Vous pouvez le modifier bien sûr. Et vous pouvez le formater et ajouter d'autres tags HTML.
            Exemple:

             .HTMLBody = .HTMLBody & ""

            pour spécifier ses dimensions.

            Attention donc au paramètre SRC –> il a le format cid: (ça, c'est par défaut pour dire que l'image se trouve dans des pièces jointes) & NomDuFichier.jpg

            Avec ce code-ci, vous pouvez même facilement ajouter plusieurs images au différents endroits dans un seul email. Ce qui devrait résoudre votre problème.

            Bàv, Martin

          • Guillaume VAILLANT

            Bonjour et merci pour tout !

            N'ayant pas besoin des images en PJ, j'ai préféré utiliser la commande suivante pour incorporation de l'image dans le mail :

            MonChemin = "C:\…\Temp\MonImageExcel.jpg"
            HTMLtableau = ""

            Bon j'ai encore du boulot pour que le mail puisse partir en automatique avec les données que je souhaite mais la base est là.

            Cdt

            Guillaume

          • Guillaume VAILLANT

            Bonjour,

            J'ai vraiment bien avancé mais me reste 2 dernières petites questions 🙂

            J'essaye de changer la police en vain. Par défaut, j'ai une police Time New Roman en 12 que j'aimerai diminuer.

            J'ai tenté de modifier le code original comme ceci :
            MonStyle = "10pt"
            'email formaté comme HTML
            .BodyFormat = olFormatHTML
            .HTMLBody = "" & "" & Body & "" & ""

            Ou encore ici :

            MonContenu = "" & "Bonjour, blablabla" & ""

            Mais rien ne change, toujours Time New Roman en 12.

            L'autre question est relative à la création du mail. Est-ce possible de mettre des personnes en copie ? Actuellement on ne peut avec le code que mettre des personnes POUR.

            Merci par avance pour votre aide.

            Cdt

            Guillaume

          • excel-malin.com Auteur du billet

            Bonsoir,
            pour la copie, c'est facile:
            tout comme .To pour le destinataire, vous pouvez utiliser .CC pour les copies et & .BCC pour les copies "invisibles":
            .To = "destinataire.principal@hotmail.com"
            .CC = "abc@def.fr"
            .BCC = "xyz@def.fr"


            Pour la taille de texte, j'essayerai de placer un HTML tag DIV tout au début du Body (avec fermeture tout à la fin). Dans ce tag, vous pouvez ajouter le style.
            Par exemple:

            .HTMLBody = "<div style="font-size: 60%;">" & Body & "</div>"

            Bien à vous, Martin

  • Guillaume VAILLANT

    Aie ça passe pas bien… Je ne sais mettre comme vous le code en visual.

    En gros j'ai mis les balises FONT=MonStyle (avec MonStyle = "10pt") mais ça ne fonctionne pas.

  • Cous

    Bonjour,

    Le tuto est très bien fait. Je ne sais pas comment je me débrouille, mais une fois le code copié dans un module, je ne sais pas comment l’exécuter. J'ai créer un bouton de formulaire et cliquer sur affecter une macro, mais celle ci n'apparait pas dans la liste.

    Pourant je la vois bien dans VB. Mon fichier Excel est bien en .xlsm.

    Merci de votre aide.

  • Nherve

    Bonjour,

    Tout est très bien expliqué et va me faire gagner beaucoup de temps dans mon travail.
    J'ai cependant un petit problème. J'ai deux adresses mail dans outlook.
    Comment définir l'adresse qui servira a l'envoie?

    Cordialement

  • geo

    Bonjour,

    Merci beaucoup pour cet article, la macro fonctionne parfaitement et j'ai pu créer une boucle d'envoi.
    J'ai un petit soucis cependant : je n'arrive pas à afficher ma signature avant l'envoi du mail.
    En cherchant j'ai trouvé le super site de ron de bruin qui parle de ce sujet, mais je ne comprends pas comment l'adapter au code que vous nous proposez.

    Pouvez vous m'indiquer comment l'insérer ?

    Merci de votre aide !

    • geo

      Finalement j'ai fini pas trouver ! il fallait rajouter un ".display" supplémentaire juste après la commande "with oMailItem".

      • Guillaume VAILLANT

        Bonjour Geo,

        Peux-tu m'en dire sur ta solution de rajouter un .Display stp ?
        J'ai une signature enregistrée par défaut mais elle ne se met pas.

        FAut-il préciser un nom et/ou un chemin pour aller la chercher ?

        Merci par avance

        Guillaume

        • geo

          Bonjour Guillaume,

          Pour être plus concret tu trouveras ci-dessous l'extrait du code donné dans cet article que j'ai modifié pour afficher la signature.
          Il faut rajouter un ".display" au début de cette séquence et modifier la partie HTLM par ".HTMLBody = Body & "" & .HTMLBody"

          Le code :
          'création de l'email
          With oMailItem
          .Display
          .To = Destinataire
          .Subject = Sujet

          'CHOIX DU FORMAT
          '———————-
          'email formaté comme texte
          '.BodyFormat = olFormatRichText
          '.Body = Body

          'OU

          'email formaté comme HTML
          '.BodyFormat = olFormatHTML
          .HTMLBody = Body & "" & .HTMLBody
          '———————-

          If PieceJointe "" Then .Attachments.Add PieceJointe

          .Display '<- affiche l'email (si vous ne voulez pas l'afficher, mettez cette ligne en commentaire)

    • excel-malin.com Auteur du billet

      Ce serait mieux de faire une procédure "spécifique" plutôt que de modifier cette fonction générale.

      En fait, dans le code, il suffit de répéter:
      .Attachments.Add "C:\monfichier1.pdf" autant de fois que nécessaire.
      Donc vous pourriez avoir:

       With oMailItem
              .To = "jean.dupont@france.fr"
              .Subject = "Mon sujet"
              
                  .BodyFormat = olFormatRichText
                  .Body = Body
                  .Attachments.Add "C:\monfichier1.pdf"
                  .Attachments.Add "C:\monfichier2.pdf"
                  .Attachments.Add "C:\monfichier3.pdf"
                  .Attachments.Add "C:\monfichier4.pdf"
      
             .Send     
          End With
  • Soukayna

    Bonjour Malin,

    Félicitation pour la qualité du travail, c'est bien expliqué 🙂
    ma question est la suivante : j'ai créé une macro qui génère un un fichier Word a partir d'un userform Outlook. Je souhaite envoyer un mail personnalisé avec pièce jointe mon fichier Word (si moyen de le changer en PDF) généré.

    Merci par avance de votre retour 🙂

    • excel-malin.com Auteur du billet

      Bonjour Soukayna,
      1) pour ce qui concerne le fichier PDF – normalement, dans Office, il est possible de sauvegarder un fichier en tant que PDF. Cela doit se trouver au niveau de ".SaveAs". Vous pouvez regarder ici:
      http://www.outlookcode.com/article.aspx?id=34

      2) pour joindre le fichier, vous pouvez utiliser le code qui se trouve plus haut. Il vous suffit de connaître le chemin complet (dossier + nom) du fichier à envoyer et l'ajouter comme pièce jointe grâce au code .Attachments.Add où vous pouvez utiliser le chmin du fichier comme variable:

      PieceJointe = "C:\MonDossier\MonFichier.pdf"
      oMailItem.Attachments.Add PieceJointe

      ou bien comme un texte directement encodé
      oMailItem.Attachments.Add "C:\MonDossier\MonFichier.pdf"

      cela dépend de vos besoins…

      J'espère que cela répond à votre question…
      Bien à vous,
      Martin

  • Geoffray

    Bonjour,

    Merci pour ce Tuto vraiment Top. Tout marche tip-top enfin presque.
    Le gros souci c'est que l'adresse du destinataire n'arrive pas au bon format dans outlook et du coup, il ne reconnait pas l'adresse et me plante l'envoi. enfin rien n'arrive.

    Une idée?

    Merci d'avance.

    ——————————–

    Ah pardon, le problème ne vient pas de l'adresse du destinataire mais de l'expéditeur
    j'ai deux compte sur mon poste (un local et une adresse .fr) malgré que l'adresse.fr soit par défaut c'est le local qui arrive.
    J'ai spécifié avec un .SentOnBehalfOfName mais ça n'a pas l'air d'être top top…

    ——————————–

    Bon pardon du dérangement, j'ai trouver!

    Si besoin : il faut modifier dans outlook et paramétre du compte "les fichiers de données "par défaut et mettre le bon compte!

    Merci pour le reste au top!!

  • P_Fabre

    Bonjour merci pour ce super tuto 😉

    J'ai tout qui fonctionne sauf une chose x)

    Les mails restent dans la boite d'envoie au lieux d’être envoyé :/

    Comment je résous ce soucis ?

  • AntoinErnould

    Bonjour, je souhaite créer un mail contenant dans le body à la fois du texte, des tableaux (que le code copierai d'un fichier excel au mail) ainsi que des nombres entiers (qui seront extraits eux aussi du fichier excel), cependant le "MonContenu" est en format String.
    Auriez vous des conseils pour que le body génère à la fois du texte, des tableaux entre certains passages de texte ? Je vous remercie d'avance !

    • AntoinErnould

      Je viens de trouver plus haut pour le tableau, j'avais loupé le commentaire, par contre je suis toujours preneur pour la valeur numérique

      • excel-malin.com Auteur du billet

        Bonjour,
        la variable MonContenu est un String pour la simple raison que le body est simplement une chaîne de caractères. Même le code HTML, est une chaîne de caractères, indépendement de son contenu.

        Outlook ne fait pas la difference entre caractères ou nombres. Donc finalement, le contenu n'a pas d'importance vu que'à la fin, pour outlook, tout est un texte (même un tableau en thml n'est qu'en faite une ligne du texte).

        Si le problème que vous rencontrez est le fait la variable ContenuEmail dans la function principale est un string et cela "bloque" si vous voulez faire passer un chiffre, il suffit de transformer ce nombre en texte avant de le faire passer à la function.

        Pour cela, il suffit d'utiliser la function CStr():
        MonNombre = 21
        MonContenu = CStr(MonNombre)
        Call EnvoyerEmail("Test email 1", "contact@test.fr", MonContenu)

        j'espère que cela répond à votre question…
        Cordialement, Martin

  • Matthieu PEYRON

    Bonjour,

    Votre macro marche très bien avec Windows 7 et Microsoft Outlook 15.0 ObjectLibrary.
    Le problème que je rencontre est avec Windows 10 et Microsoft Outlook 16.0 ObjectLibrary.
    En effet , VBA plante à la déclaration des variables (Outlook.application ne semble pas lui plaire).

    Avez vous déjà fait face à ce problème? Si oui , avez vous une solution?

    Merci d'avance.

    • excel-malin.com Auteur du billet

      Bonjour Matthieu,
      pour moi, cela fonctionne sans problèmes sous Win10 avec Office 2016 (et donc library 16.0)…

      Et si vous remplaciez Outlook.Application par Object dans les déclarations?

      Cordialement, MArtin

      • Lydie

        Bonjour,
        J'ai le même souci : Outlook.Application et Outlook.MailItem ne fonctionnent pas.
        J'ai Windows 8.1 pro et installé Microsoft Outlook 15.0 ObjectLibrary.
        J'ai tenté de remplacer par Object mais le mail ne s'envoie pas.
        Avez-vous une autre solution à me proposer ?
        Merci
        Lydie

        • Lydie

          désolée mauvaise manip de ma part, ça fonctionne très bien ! Merci
          Je vais me pencher sur le code pour adapter à plusieurs destinataires en cci et et à un texte variable.

          • excel-malin.com Auteur du billet

            Pas de soucis 😉 Je suis content que cela marche pour vous.

            Pour ce qui est des "cc" et "cci", regardez +/- au milieu des commentaires. J'avais répondu à quelqu'un avec du code nécessaire.
            Quand j'aurai plus de temps, je l'ajouterai dans le texte principal.
            Bien à vous, Martin

  • Anne

    Bonjour
    Belles Macros
    La fonction .Attachments.Add PieceJointe envoi la piece jointe comme un lien si le fichier est sur un espace de type OneDrive ou de partage type Yammer
    Quelle fonction utilisé pour joindre le fichier "en tant que copie" ?
    Cdt

  • khou

    Bonjour et merci pour ce tuto qui marche très bien.
    Je me demande comment je peux ajouter la fonctionnalité d'impression de fichier et de sa conversion en fichier pdf en même temps que son envoi (dans la même macro). Ainsi, je me demande comment envoyer le fichier courant et non pas celui du'on a mis en dur.

    Avez-vous une solution pour ça aussi ?

    Merci et bonne journée.

    • excel-malin.com Auteur du billet

      Bonjour khou,
      je vous conseillerai ne pas vouloir tout inclure dans une seule macro (! cela ne veut pas dire "dans le même fichier") pour des raisons suivantes:
      1) pas trop complexifier votre code
      2) si une erreur arrive dans une partie du code (par. exemple la partie impression ne trouve pas d'imprimante), tout le code sera bloqué.
      3) si vous séparez le code en différentes fonctionnalités, le code devient beaucoup plus "réutilisable".

      Donc dans votre cas, je mettrai dans une Fonction ou procédure le code pour l'envoi par email, dans une autre pour l'impression et dans une autre la conversion en pdf.
      Après, il vous suffit de créer une procédure qui appelle successivement ces trois fonctions avec, par exemple, le chemin complet du fichier comme argument…

      Exemple à quoi pourrait ressembler la procédure finale:
      Sub ProcedurePrincipale()
      Dim MonFichier As String
      MonFichier = "C:\Temp\MonFichier.xlsx"
      Call ImprimerFichier(MonFichier)
      Call ConvertirEnPDF(MonFichier)
      Call EnvoyerEmail(MonFichier)
      MsgBox "Procédure terminée..."
      End Sub

      Pour le fichier courant en pièce jointe –>
      Il vous suffit de remplacer:
      MaPieceJointe = "C:\Test\MonFichierExcel.xlsx" dans l'exemple par
      MaPieceJointe = Thisworkbook.FullName

      Voilà, j'espère que cela vous aide. Bàv, Martin

  • Jennifer Desrochers

    Bonjour,

    Je dois créer une macro pour créer des reçu.

    Jusqu'à maintenant tout fonctionne très bien, sauf qu'on m'a demandé de modifier ma macro pour que le tout s'envoie par courriel à la comptable.

    Depuis rien ne fonctionne. J'ai copié le code VBA ci-haut et ajouté la référence à Outlook.

    Ce que je voudrais vraiment faire c'est d'envoyer le courriel avec l'objet prédéfini "Reçu numéro [faire référence à une cellule]" et joindre le fichier directement en format PDF. Je voudrais aussi insérer un court message qui ferait référence à certaine cellule.

    J'ai placé ton code avant ma première ligne de code et j'ai toujours une erreur de compilation. De plus, où dois-je insérer l'adresse courriel de mon destinataire?

    Sub Test()

    ' Test Macro
    ' Suite à l'impression, modifie le numéro du reçu, efface les données et enregistre le classeur.

    *****Ton code est ici*****

    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
    IgnorePrintAreas:=False
    ActiveSheet.Unprotect " "
    Dim num As Integer
    Range("I2").Select
    num = Range("I2").Value
    num = num + 1
    Range("I2").Value = num
    Range("B9:E9").Select
    ActiveCell.FormulaR1C1 = ""
    Range("B12:D12").Select
    ActiveCell.FormulaR1C1 = ""
    Range("H12").Select
    ActiveCell.FormulaR1C1 = ""
    Range("C14:H14").Select
    ActiveCell.FormulaR1C1 = ""
    Range("E16:H16").Select
    ActiveCell.FormulaR1C1 = ""
    Range("C18").Select
    ActiveCell.FormulaR1C1 = ""
    Range("I18").Select
    ActiveCell.FormulaR1C1 = ""
    Range("E20:I20").Select
    ActiveCell.FormulaR1C1 = ""
    ActiveSheet.Protect " ", True, True, True
    ActiveWorkbook.Save

    End Sub

    Merci, ça fait un bail que j'ai pas fait de macro.
    Jennifer

      • excel-malin.com Auteur du billet

        Bonjour Jennifer,
        vous pouvez commencer par copier/coller la procédure principale (Sub EnvoyerEmail) dans votre projet – en dehors de votre code.

        Ensuite, vous ajouter le code qui suit à la fin de votre macro (avant le End Sub)

        'définition des variables
        Dim MonSujet As String
        Dim MonDestinataire As String
        Dim MonContenu As String
        Dim MaPieceJointe As String

        'attribution des valeurs aux variables
        MonSujet = "Reçu numéro [" & Sheets("MaFeuille").Range("C10").Value & "]"
        MonDestinataire = "comptabilite@monentreprise.fr"
        MonContenu = "Voici le contenu " & Sheets("MaFeuille").Range("D10").Value
        MaPieceJointe = "C:\MonDossier\MonFichierPDF.pdf"

        'test envoi de l'email
        Call EnvoyerEmail(MonSujet, MonDestinataire, MonContenu, MaPieceJointe)

        Vous devez évidemment modifier les références aux cellules (j'ai mis des exemples) dans le titre et le contenu ainsi que l'adresse email et l'emplacement du fichier PDF qui doit être joint à votre email.

        J'espère que cela vous aide. Désolé pour le retard mais pour le moment, les questions des visiteurs sont très nombreuses et ce n'est pas facile de répondre à tout le monde…
        Bien à vous, Martin

  • Christophe

    Bonjour,

    Je souhaiterais automatiser des mails que je dois faire quotidiennement, en effet, de par mon travail nous envoyons en moyenne 30 à 40 mails par jours que nous devons remplir à la main, je m'explique.

    Le mail est préparé en modèle Outlook et il ne nous reste plus qu'a aller chercher certaines informations pour personnaliser ce mail, nous devons rajouter les emails destinataires, les email du responsable projet, la date de notre intervention et enfin l'adresse du projet.

    J'aimerais automatiser les démarches de renseignements de ces informations sachant qu'elles peuvent être toutes regroupées dans un fichier excel. Ce fichier est composé de X lignes avec les informations utiles de chaque projet, 1 projet par ligne.

    L'idéal serait d'avoir un bouton qui génère le mail avec les informations déjà remplies en fonction de la cellule sur laquelle nous nous trouvons au moment d'appuyer sur ce bouton.

    Dernière chose, il faut que le mail ne parte pas automatiquement car nous avons des pièces jointes à ajouter (qui changent quotidiennement) et certaines fois nous devons changé quelque peu le corps du texte.

    J'espère avoir su me faire comprendre et si quelqu'un serait m'aider je lui en serais réellement très reconnaissant, les taches redondante de ce style font perdre du temps et sont, pardonné moi du terme, très "barbante"

    Je mets en site web, une image pour montrer ce que j'aimerais faire.

    Vous remerciant par avance, déjà pour avoir pris le temps de me lire, et encore plus si vous avez une solution pour moi.

    Amicalement

    Christophe

  • Variable

    Bonjour,

    Merci pour votre tutoriel.

    Je souhaite utiliser des variables comme dans votre exemple sauf que mes valeurs MonSujet Mon destinataire MonContenu MaPieceJointe sont présente dans un tableau excel de mon fichier.

    Est-ce possible d'aller chercher ces informations ?

    Merci d'avance pour votre retour.

    • excel-malin.com Auteur du billet

      Bonjour,
      oui, c'est tout à fait possible.
      Vous devez remplacer les variables avec le contenu "fixe" comme:
      MonSujet = "Test d'email d'Excel avec variables"
      MonDestinataire = "jean.dupont@dupont.fr"
      MonContenu = "Bonjour Jean, voici un petit message de test... Avec un fichier en plus."
      MaPieceJointe = "C:\Test\MonFichierExcel.xlsx"

      pas les valeurs dans votre fichier (à modifier selon votre fichier):

      MonSujet = ThisWorkbook.Sheets("MaFeuille1").Range("C3").Value
      MonDestinataire = ThisWorkbook.Sheets("MaFeuille1").Range("D3").Value
      MonContenu = ThisWorkbook.Sheets("MaFeuille1").Range("E3").Value
      MaPieceJointe = ThisWorkbook.Sheets("MaFeuille2").Range("A1").Value

      Voilà, j'espère que cela répond à votre question…
      Bien à vous, Martin

  • Lor

    Bonjour,

    Merci pour votre tutoriel qui est vraiment très clair.

    J'ai un tableau Excel avec différentes informations dont une colonne date et une colonne avec les adresses email.
    Je voudrais envoyer des mails respectant une condition : si la date est inférieure ou égale à la date du jour ou si la date est inférieure à la date du jour + 2 jours ouvrés.

    Je n'arrive pas à faire une boucle conditionnelle. Comment scanner toutes les lignes et envoyer des mails au ligne respectant la conditions ?

    Pouvez-vous m'aider ?

    Cordialement,
    Lor

    • Lor

      (re) Bonjour,

      En travaillant sur mon classeur, j'ai choisi de procéder comme suit :
      Sur toutes les lignes respectant la condition, j'inscris dans une colonne supplémentaire et vide la date du jour.
      Ce qui me permettra de savoir quand j'ai relancé le client.

      Ensuite, j'envoie le mail à tous les clients avec la date du jour que je viens d'inscrire.

      Je n'arrive pas à inscrire la date …

  • Ethan

    Bonjour,

    J'aurais besoin d'aide svp pour mettre plusieurs personnes en copie (Cc). Cela marche si je tape .Cc= "123@abc.fr;456@abc.fr".
    Mais dans mon cas, je vais chercher une liste de mail dynamique que je rentre dans un tableau. Mais cela ne fonctionne pas.

    Dans EnvoyerEmail, j'ai fais ces modifications (ajout de DestinataireEnCopie et .Cc) :
    Sub EnvoyerEmail(ByVal Sujet As String, ByVal Destinataire As String, ByVal DestinataireEnCopie As String, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String)

    .Cc = DestinataireEnCopie

    Dans le code d'envoie du mail j'ai :

    Dim tabl_distrib() As String
    a = 0
    ReDim Preserve tabl_distrib(a)

    For j = 1 To lastrow_listdistrib
    If ThisWorkbook.Sheets("tmp_listdistrib").Cells(j, 1) = version0 Then
    For K = 2 To ThisWorkbook.Sheets("tmp_listdistrib").Cells(j, Columns.Count).End(xlToLeft).Column
    If ThisWorkbook.Sheets("tmp_listdistrib").Cells(j, K) email_demandeur Then
    tabl_distrib(UBound(tabl_distrib)) = ThisWorkbook.Sheets("tmp_listdistrib").Cells(j, K)
    ReDim Preserve tabl_distrib(UBound(tabl_distrib) + 1)
    End If
    Next K
    Exit For
    End If
    Next j

    If UBound(tabl_distrib) 0 Then
    ReDim Preserve tabl_distrib(UBound(tabl_distrib) – 1)
    End If
    ….
    DestinataireEnCopie = tabl_distrib

    Call EnvoyerEmail(Sujet, Destinataire, DestinataireEnCopie, Contenu)

    J'ai l'erreur incompatibilité de type lorsque j'arrive sur Call. J'ai l'impression la liste des mails en tableau ne passe pas.

    Merci d'avance pour votre aide

  • Lylian Mabicka

    Bonjour,
    J'aimerai envoyer automatiquement un mail avc un fichier join chaque jour à une periode de la journée bien défini. Ex: envoie d'un fichier X tous les 5 jours de la semaine à 8h00, automatiquement. Pouvez vous m'aider svp?