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.
Sommaire
- Comment envoyer un email dans Excel (Access / Word,…) avec VBA?
- Code VBA complet pour envoyer des emails dans Excel
- Exemples d'utilisation du code VBA pour envoyer les emails depuis Excel
- Remarques pratiques
- Envoyer un email avec Excel: Utilisation Avancée
- Envoyer un email avec Excel: Conclusion
- Pour aller plus loin en VBA
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.
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | 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 oMailItem As Outlook.MailItem '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 Len(ContenuEmail) = 0 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 HTML (aussi par défaut) .BodyFormat = olFormatHTML .HTMLBody = "<html><p>" & ContenuEmail & "</p></html>" 'OU 'email formaté comme simple texte sans formats '.BodyFormat = olText '.Body = ContenuEmail 'OU 'email formaté comme texte riche (= avec formats) '.BodyFormat = olFormatRichText '.Body = ContenuEmail '---------------------- 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 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") If (Err.Number > 0) Then MsgBox "Une erreur est survenue lors de l'ouverture de Outlook..." Exit Sub Else End If Else 'si Outlook est ouvert, l'instance existante est utilisée End If 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: 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 'CHOIX DU FORMAT '---------------------- 'email formaté comme HTML (aussi par défaut) .BodyFormat = olFormatHTML .HTMLBody = "<html><p>" & ContenuEmail & "</p></html>" 'OU 'email formaté comme simple texte sans formats '.BodyFormat = olText '.Body = ContenuEmail 'OU 'email formaté comme texte riche (= avec formats) '.BodyFormat = olFormatRichText '.Body = ContenuEmail '---------------------- |
- 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 actives, lignes 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.
1 2 3 4 5 6 7 8 9 10 11 12 | 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…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 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).
1 2 3 4 5 6 7 8 | 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 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…
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…
- Liste de toutes les fonctions disponibles en VBA
- Manipulation basique des fichiers en VBA
- Gestion des dates et heures en VBA
- Comment utiliser RECHERCHEV directement en VBA
- Débloquer VBA dans les fichiers en provenance d'internet
- Cours VBA gratuit en ligne – "VBA: Droit au but"
235 commentaires sur “VBA: Envoyer un email avec Excel (via Outlook)”
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
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)
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:
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
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
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
Vous pouvez le modifier bien sûr. Et vous pouvez le formater et ajouter d'autres tags HTML.
Exemple:
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
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
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
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:
Bien à vous, Martin
Top comme dab' ! Un grand merci Martin ! ;o)
Avec plaisir…
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.
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.
Ecris le nom de la macro à la main…
Bonjour,
J'ai effectivement le même problème, étant sous windows10, (Outlook 16.0 Object).
J'ai copié-collé l'entièreté de la Macro dans un module. Mais quand je veux lancer la Macro, une boite de dialogue souvre (comme si on voulait créer une nouvelle macro), et le nom de la macro n'est pas dans la liste.
Etrange :s
Avez-vous déjà rencontré ce problème ?
En tous cas, merci !
Cous, Valooo,
le "problème" est que cette procédure a besoin d'être lancée avec des paramètres.
Vous ne pouvez pas la lancer "toute seule" à partir de la liste des macros.
Le plus simple est de copier dans votre module (en plus de la procédure
EnvoyerEmail
) aussi le code qui la déclanche:
TestEnvoiEmail
,TestEnvoiEmail_Variables
ouTestEnvoiEmail_FormatHTML
. (qui se trouvent également sur cette page)Vous pouvez les rénommer comme vous voulez, aussi modifier leur contenus.
Et ensuite, vous lancez une de ces procédures-là (et pas la
EnvoyerEmail
)...J'espère que cela résoud votre problème!
Bien à vous, Martin
SUPER ! Merci beaucoup pour ce tuto 🙂 super bien fait !!
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
Bonjour,
voici un très bon article de Ron de Bruin qui explique exactement ce sujet:
https://www.rondebruin.nl/win/s1/outlook/account.htm
Bien à vous, Martin
Merci tout fonctionne
Bonjour,
je suis allé voir, mais ayant de graos problèmes avec l'anglais …
J'ai copié la ligne .SentOnBehalfOfName = """SenderName"" " dans votre code avant les autres options d'envoi : ' .Display , save ou send mais cela ne marche pas !
si je ne mets pas les crochets, j'ai un message d'erreur, si je les mets, ça ne change pas l'expéditeur et le mail n'est pas reçu.
merci beaucoup par avance pour votre aide !
cordialement
Raphaël
Désolé pour le dérangement !
j'ai trouvé la réponse plus bas par Geoffray !
merci encore pour ce tuto, il est vraiment super !
Raphaël
Content que vous ayez réussi à résoudre le problème!
Cordialement, Martin
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 !
Finalement j'ai fini pas trouver ! il fallait rajouter un ".display" supplémentaire juste après la commande "with oMailItem".
Super!
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
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)
Bonjour,
j'aimerai envoyer plusieurs pièces jointes au mail.
Merci de m'aider
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:
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 🙂
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 par exemple ici:
http://www.faqword.com/index.php/word/environnement/892-creer-une-macro-pour-enregistrer-au-format-pdf
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
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!!
Bonjour Geoffray,
merci pour le compliment!
Je suis content que vous ayez trouvé la solution! 😉
Bien à vous, Martin
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 ?
Soit tu as enlevé la ligne qui envoie, soit y a une adresse mail qui foire je pense !
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 !
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
Bonjour,
la variable
MonContenu
est unString
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
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.
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
parObject
dans les déclarations?Cordialement, MArtin
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
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.
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
Bonjour,
Bravo pour le travail effectué
J'ai le même problème de références (message d'erreur "Erreur de chargement de la DDL"
Outlook.Application et Outlook.MailItem ne fonctionnent pas, le remplacement par "Object" vaut également pour pour Outlook.MailItem?
Car la macro ne fonctionne toujours pas même en remplaçant ces 2 éléments par "Object" et aboutit sur le message d'erreur : "Le message n'a pas pu être envoyé "
Si vous avez une piste….
Par ailleurs et par curiosité, quel est la partie du code qui fait appel à la boite mail Outllok de l'émetteur du mail?
Merci d'avance
Bonjour Florian,
désolé pour la réponse tardive.
Vu le message d'erreur, il se peut que tout simplement, le fichier contenant la référence est corrompu.
Si vous voulez, vous pouvez le réimporter le fichier pour Office 2013:
Fichier: MSOUTL.olb
à copier dans le dossier: C:\Program Files (x86)\Microsoft Office\Office15
Si vous utilisez Office 2016, je peux aussi vous le fournir.
Essayez déjà ça (+ n'oubliez pas le cocher dans "Outils" –> "Références") pour voir si cela résout votre problème.
Pour le votre question sur la partie du code qui fait appel à la boîte mail:
en fait, le code utilise Outlook "en arrière". Donc il utilise l'Outlook comme il est configuré sur votre PC.
Si Outlook est déjà ouvert, il utilise cette instance-là, si Outlook n'est pas ouvert, c'est la procédure
PreparerOutlook
qui ouvre Outlook pour que le code puisse fonctionner. Dans cette procédure, vous pouvez choisir si oui ou non, cette nouvelle instance d'Outlook doit être visible ou pas:oOutlook.Visible = True 'ou False
J'espère que cela vous aide.
Si vous avez besoin de la DLL pour Excel 2016, faites moi signe.
Cordialement, Martin
Bonjour,
Merci beaucoup pour vos explications.
En fait je rencontre exactement le même problème que décrit.
Pourriez-vous me le fournir pour Office 2016 et me précisez exactement la procédure parce que j'avoue que je ne comprends pas réelement le problème..
Merci beaucoup pour votre retour..
Bonjour,
voici le fichier pour Office 2016: MSOUTL.olb pour Office 2016
Téléchargez-le, et ensuite, dans Excel: vous ouvrez le VBA editor (Alt+F11). Vous alle dans le menu "outils", ensuite "Références", ensuite "Parcourir" -> vous sélectionnez le fichier enregistré et cela devrait être tout… Maintenant, vous devriez voir "Microsoft Outlook 16.0 Object Library" dans la liste des références. Il vous suffit de le cocher et le code VBA devrait fonctionner…
Cordialement, Martin
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
Bonjour,
J'ai le meme soucis avez vous trouvé une solution ?
Cdt
Bonjour,
vous pouvez me donner un exemple de à quoi ressemble le chemin du fichier?
Un moyen qui me vient à l'esprit serait de d'abord télécharger le fichier du OneDrive vers un dossier local (sur votre ordinateur) et l'ajouter à l'émail à partir de ce dossier local. Ensuite, il est facile de le supprimer du dossier local…
Cordialement, Martin
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.
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 parMaPieceJointe = Thisworkbook.FullName
Voilà, j'espère que cela vous aide. Bàv, Martin
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
Bonjour,
une petite relance…
Merci
Jennifer
Bonjour Jennifer. Je vais essayer de regarder ça ce soir…
Martin
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
Bonjour, dans "mon contenu" ="voici le contenu" & sheets("mafeuille").range ("D10").value, j'aimerai non pas une cellule précise mais une plage de cellule, exemple A1 à B11 mais dès que j'en mets plusieurs cela ne marche pas, ça doit pas être grand chose mais ça me bloque
Bonjour Kuchik,
normalement, vous ne pouvez pas "sélectionner" le contenu de plusieurs cellules comme ça.
Vous devez créer une boucle qui va créer un string auquel elle ajoutera chaque fois le contenu de chaque cellule.
Exemple:
Si vous voulez ajouter un séparateur:
Le problème est que vous aurez les valeurs mais pas le format de votre range.
Si vous voulez avoir ces infos sous la forme d'un tableau, vous allez devoir vous-même créer un tableau en HTML, y ajouter les valeurs et les formats du tableau Excel et que vous ajouterez ensuite dans le Body de l'email. Cela risque d'être fastidieux mais cela marche…
Cordialement, Martin
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
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.
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
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
(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 …
Réglé
Bonjour,
Excel malin, ou Lor, pourriez-vous m'indiquer le code permettant de créer une boucle conditionnelle ?
Merci
Bonjour Jojo,
les boucles conditionelles sont un vaste sujet. Je vais bientôt achever un tutoriel à ce sujet.
L'important est de savoir:
– dans quoi vous voulez faire la boucle (cellules, lignes, dates,…)
– que doit se passer quand la condition est remplie (code effectue une action et ensuite? La boucle continue? Ou elle s'arrête?)
– etc.
Un exemple simple:
For i=1 To 50
If Cells(i,1).Value > 50 Then
Cells(i,2).Value = 10
Else
Cells(i,2).Value = Cells(i,1).Value * 2
End If
Next i
Cette boucle fait 50 itérations (i=1 To 50). Ici, elle teste les cellules A1 à A50. Si le contenu est >50, la cellule "B" correspondante (par ex pour A26, ce sera B26) aura la valeur "10", sinon, elle aura la valeur égale à la valeur de la cellule A correspondante fois 2…
En attendant mon tutoriel, voici déjà de la matière pour commencer:
https://www.excel-pratique.com/fr/vba/boucles.php
Bien à vous, Martin
Merci beaucoup, c'est top.
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
J'ai le même soucis avez vous la solution svp ?
Bonjour zizou,
votre souci vient du fait que dans la définition de la procédure
EnvoyerEmail
:Le "Destinataire" doit être un contenu de type
String
. Si vous utilisez un tableau (Array
), le code ne va pas fonctionner. De là l'erreur sur l'incompatibilité du type.La solution est simple: avant d'appeler la procédure
EnvoyerEmail
, transformez votreArray
en une chaîne avec les différentes adresses séparées par ";" (avec un Loop, c'est facile) et ensuite, dans l'appel deEnvoyerEmail
, utilisez ce String. Et là, le code va fonctionner.J'espère que cela répond à votre question.
Bien à vous, Martin
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?
Bonjour,
Merci pour ces explications c'est génial.
J'aimerais transférer un mail qui est dans mes brouillons mais je n'y arrive pas. Je ne trouve nulle part comment chercher un mail dans un dossier (ici brouillons) et le transférer.
Si vous pouvez m'aider, ce serait génial ! Merci d'avance !
Bonjour
Je ne suis pas sur d'avoir compris le point sur les Destinataire en Copie et Copie Cachée
J'ai dans la Sub EnvoyerEmail
Public Sub EnvoyerEmail(ByVal Sujet As String, ByVal Destinataire As String, ByVal Destinataire_en_copie As String, ByVal Destinataire_en_copie_cachée As String, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String)
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
.CC = Destinataire_en_copie
.BCC = Destinataire_en_copie_cachée
.Subject = Sujet
….
Les champs .CC et .BCC sont en rouge et une pop up erreur de compilation apparait
Sachant que pour j'ai modifier la macro applicative comme suit
Sub AppliEnvoiEmail()
'envoi de l'email sans pièce jointe – contact@test.fr est une addresse mail active
Call EnvoyerEmail("Test email 2", "contact@test.fr", "contactcopie@test.fr", "contactcopiecaché@test.fr", "Ceci est un test")
'test envoi de l'email avec pièce jointe – contact@test.fr est une addresse mail active & C:\MonDossier\MonFichier.pdf le chemin du fichier à envoyer
Call EnvoyerEmail("Test email 2", "contact@test.fr", "contactcopie@test.fr", "contactcopiecaché@test.fr", "Ceci est un test avec pièce jointe…", "C:\MonDossier\MonFichier.pdf")
MsgBox ("Test Terminé")
End Sub
Pouvez vous m'aider à regler le problème d'erreur de compilation svp ?
En vous remerciant par avance
Bien Cordialement
Valery
Bonjour Valery,
je viens de tester votre code et… tout marche parfaitement…
Je n'ai pas de lignes en rouge, ni pop-up à la compilation.
Si je lance le code, il crée le mail comme attendu (voir la capture d'écran)
Donc deux questions:
1) le code de base (sans vos modifications) fonctionne bien?
2) la Référence vers "Microsoft Outlook XX.X Object Library" est bien cochée?
Sinon, essayez de m'envoyer votre fichier par email (contact@excel-malin.com) et je vais regarder directement dans le fichier.
Bien à vous, Martin
Bonjour,
Déjà merci pour votre explication, après avoir suivi vos indications, la macro ne marche pas..
Je désespère…
Pouvez-vous svp me faire une procédure de chaque étape ? car le copier/coller ne marche pas ..
(Je suis débutante si jamais)
Merci à tous.
Pearl Stauffer
Bonjour,
Merci pour le tuto. J'ai réussi à faire mon premier envoi d'email. Tout fonctionne à merveille sauf le lendemain lorsque j'ai souhaité rouvrir mon fichier excel (enregistré au format .xlsm), la macro s'exécute mais je tombe sans cesse sur la MessageBox "Le mail n'a pas pu être envoyé…".
J'ai réessayé avec un autre classeur excel, même problème.
Je ne vois pas d'où peut provenir mon erreur. Auriez-vous un conseil, une idée ?
Merci d'avance
Finalement, j'ai trouvé…
J'avais ajouté une pièce jointe qui avait été supprimé.
Du coup, il rebouclait sur l'erreur !
Parfait!
Sinon, un petit conseil: pour trouver plus facilement la raison d'une erreur, vous pouvez aller dans la fonction (dans le VBA editor) et l'exécuter ligne par ligne – avec la touche
F5
. Ainsi, vous voyez exactement quelle ligne du code vous envoie vers le message d'erreur.Dans votre cas, vous auriez vu que c'était la ligne :
If PieceJointe <> "" Then .Attachments.Add PieceJointe
et ainsi, vous auriez une indication que le problème vient de la pièce jointe.
Bien à vous, Martin
Bonjour,
Merci beaucoup pour votre macro, elle fonctionne parfaitement. Simplement j'aimerais maintenant pouvoir envoyer ce mail de manière automatique à une date précise.
Que faut-il ajouter dans le code pour prendre en compte cette date d'envoi?
Merci !
Hugo
Bonjour,
J'ai copié / collé votre code VBA pour l'envoi d'un mail ainsi que le code vba "testenvoiemail" dans le module de mon classeur excel mais quand je test la macro j'ai un message d'erreur qui s'affiche indiquant une "erreur de compilation Sub ou function non définie" et en contrôlant le code pas à pas avec F5, cela me souligne "PreparerOutlook".
Auriez-vous une idée du pourquoi ?
Merci pour votre aide.
Pour info je suis très débutant en macro !
Désolé je viens de m'aperçevoir qu'il manquait une partie du code !!! Cela fonctionne apparemment. Merci et désolé.
Pas de problème 😉 Je suis content que cela fonctionne pour vous.
Re bonjour,
C'est à nouveau moi.
Le code fonctionne parfaitement et j'ai voulu essayer d'inclure ma signature dans le mail en testant la procédure indiquée par Geo le 22/02/2018 :
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
'———————-
Et là j'ai un soucis, car non seulement ma signature n'apparait pas mais j'ai "Faux" qui apparait dans le corps du mail.
Auriez-vous une idée du pourquoi du comment ?
De plus si je ne peux inclure ma signature, est-il possible d'inclure des sauts de ligne dans le texte du message ? Par exemple, pour le moment mon texte apparait au km.
Un grand merci pour votre aide.
Bonjour ,
J'ai parcouru tous les commentaires et bien que j'ai suivi les procedure a la lettre , je ne parviens toujours pas a éxécuté la macro vu qu'elle ne figure pas dans la liste je ne sais pas trop comment faire .
Merci d'avance pour votre aide
Bonjour Rookie,
en fait, la procédure
EnvoyerEmail
n’apparaît pas dans la liste de vos macros et c'est normal. En fait, elle a besoin de paramètres (adresse email, sujet, body etc.) pour fonctionner. Et avec le Alt+F8, on ne peut pas "donner" des arguments à une procédure. On peut lancer seulement les procédures qui n'utilisent pas d'arguments.Solution: ils vous faut une procédure en plus – un "lanceur". Dans ce tutoriel, ce sont pas exemple les procédures
TestEnvoiEmail
etTestEnvoiEmail_Variables
.Donc copiez dans votre projet les procédures
EnvoyerEmail
etTestEnvoiEmail
. Vous verrezTestEnvoiEmail
dans la liste des macros disponibles.Il vous suffira donc d'aller modifier les données qui y sont utilisés et les modifier selon vos besoins.
J'espère que cela répond à votre question et que avec ces infos supplémentaires, vous pourrez lancer le code comme prévu.
Cordialement, Martin
OUI MERCI TOUT EST OK !
C'était avec plaisir. M.
Bonsoir,
Dans un premier merci pour ce tuto de qualité par contre je ne suis pas sur de comprendre le code pour l'envoi a des destinataires multiple
Est-il possible svp d'avoir un exemple de code pour 2 destinataires et ou les destinataire sont des variables et pas des adresses en dur?
En vous remerciant par avance pour votre aide sur le sujet
Bonsoir Alexandre.
vous devez, à partir de vos variables, créer une chaîne de caractères (string) qui va contenir les différents destinataires séparés par ";".
Donc dans le code, cela peut donner ceci:
ou bien:
J'espère que cela répond à votre question.
Bien à vous, Martin
Bonjour,
merci pour cette réponse cela fonctionne parfaitement.
Content de l'entendre!
Martin
Bonjour et bonne année à vous,
Je ne prends pas souvent le temps de laisser un commentaire sur les travaux qui m'aident. C'est bien dommage parce que même un petite aide par un bout de code devrait être remercié.
Mais aujourd'hui je me suis penché sur votre site et surtout sur cette page et je trouve que c'est fait avec beaucoup de précision et de clarté.
Bonne journée, vous m'avez fait gagné pas mal de temps et vous m'avez appris des choses. Merci
Bonjour Julian, merci pour ce message. Cela fait vraiment plaisir à lire
Bonne année à vous aussi, Martin
Bonjour,
Je ne sais pas si cela a été abordé dans les commentaire mais je souhaiterais intégrer dans mon code la fonction permettant que, lorsque le destinataire du mail clique sur "Répondre", la réponse sera envoyée à une adresse que j'aurais préalablement définie, et non à l'adresse de l'expéditeur (qui sera éventuellement en cc seulement).
J'ai essayé .ReplyTo = "xxx@adresse.com" mais ça ne donne rien.
Merci d'avance !!
Bonjour,
j'ai déjà rencontré ce problème. En fait, cette possibilité est désactivée dans VBA pour des raisons de sécurité (pour éviter du spam, du phishing etc.).
Il existe une possibilité:
si vous avez droit, dans votre société, d'envoyer les emails au nom de quelqu'un d'autre, vous pouvez utiliser cette instruction
.SentOnBehalfOfName = "xxx@adresse.com"
Mais vous devez y avoir droit au niveau de Exchange server. Sinon cela ne marchera pas.
Donc c'est la seule possibilité.
Cordialement, Martin
Bonjour,
Merci pour la réponse rapide.
Je connaissais .SentOnBehalfOfName mais cela ne répond effectivement pas à mon besoin. Mon objectif est d'envoyer un fichier à remplir par un client, mais qu'il le renvoie à un autre service. Ma boite serait comme une boîte automatique "No Reply".
En tout cas je sais maintenant que ce n'est pas possible de cette façon.
Merci encore.
Merci pour ce code VBA, vous n'imaginez pas à quel point ça nous simplifie la vie !!
Bonjour Gui, merci pour ce retour.
Cela fait plaisir de savoir que mon travail est utile…
Cordialement, Martin
bonjour ,
tout d'abord je voulais vous féliciter de ce tuto vraiment explicite qui convient même à un novice de la VBA comme moi.Néanmoins j ai un souci . je m explique. j 'ai un tableau avec coordonnée de mes clients et la date à laquel je doit passer faire une interventions chez eux. je dois cependant leur envoyer un mail 1 semaine avant mon interventions. le problème que je rencontre c'est que je ne sais pas comment définir l'envoi automatique en fonction de la date de la visite ( ex : ligne 4 visite le 10/02 donc envoi du mail le 03/02 , ligne 5 visite le 20/03 donc envoi du mail le 13/03 etc…)
En plus j'aurais aimer si c'est possible qu’après l envoie du mail la colonne mail envoyé soit directement incrémenté j'imagine qu'il faut utilisé un énoncé conditionnels ?
Bonjour,
Tout d'abord merci pour votre travail !
J'ai une petite question, lorsque je run ma macro et essai d'envoyer le mail tout semble fonctionner (je vois la fenêtre d'envoi apparaître et disparaître rapidement) sauf que lorsque je vais dans la boite de destination je ne reçoit rien. Je ne les reçois que lorsque je lance outlook moi même manuellement. La boite se met alors à jour et tout est envoyé.
Y-a-t'il un moyen que faire cette mise à jour dans la macro afin que l'envoi soit instantané ?
Merci d'avance pour votre réponse,
Très bonne journée !
Bonjour Guillaume,
ce n'est pas un problème de la macro mais de la configuration de l'Outlook.
Essayez ceci:
https://support.microsoft.com/fr-fr/help/2797572/email-stays-in-the-outbox-folder-until-you-manually-initiate-a-send-re
J'espère que cela résoudra votre problème.
Cordialement, Martin
Bonjour,
très bon tuto ! Cependant, je rencontre des problèmes. J'espère que vous pouvez m'aider.
J'ai effectuer une macro afin d'exporter une plage en photo et une 2e macro qui récupère le nom des personnes et envoi le mail.
Le problème c'est que ça fonctionne une fois sur 2.
Des fois tout fonctionne correctement et d'autre fois ça me fait un message d'erreur lors de l'export image ou pendant l'envoi de mail.
Je suis bloqué, pouvez-vous m'aider ?
Merci
Bonjour,
j'utilise win10 avec outlook 2007…
J'ai une erreur quand outlook est fermé
'préparer Outlook
PreparerOutlook oOutlook
Set oMailItem = oOutlook.CreateItem(0)
moMailItem est Nothing…
Merci
Bonjour,
Merci pour cet excellent tuto.
Toutefois j'ai un petit défi.
J'envoie tous les jours des mails manuellement depuis des mails modèles outlook au format essai.oft.
Tous ces mails modèles contiennent l'objet, des adresses de destinataires pour certains, et le corps du mail complétés dont le corps du mail est long pour certains (explication à l'intérieur)
Lorsque j'ouvre le fichier, un mail s'ouvre avec les éléments du fichier.
Je dois dans chacun de ces mails complété l'adresse du destinataire, l'objet, et parfois certains éléments dans le corps du mail.
Alors est il possible d'utiliser ces mails modèles pour l'envoie ou dois je entièrement les refaire avec une sub vba pour remplir le corps du mail ?
Merci,
Bonjour Christophe,
vous pouvez utiliser un modèle en modifiant légèrement mon code:
Remplacez la ligne:
Set oMailItem = oOutlook.CreateItem(0)
par
Set oMailItem = oOutlook.CreateItemFromTemplate("C:\Chemin\De\Mon\Modele\essai.oft")
(changez le chemin vers votre modèle)
Attention, l'affichage de l'email prêt avec
.Display
a pour conséquence que la signature est ajouté à la fin.Si vous avez déjà la signature dans le modèle, vous risquez de vous retrouver avec deux signatures à la fin de votre email. Dans ce cas, vous pouvez soit enlever la signature du modèle, soit éviter l'affichage de l'email avant son envoi.
J'espère que cela répond à votre question et que le défi a été rempli 😉
Martin
PS: encore une remarque: il faudra jouer encore un peu avec le code pour éviter les messages d'erreur – par exemple si vous voulez modifier le destinataire, l'objet ou le texte du modèle, vous devez d'abord l'afficher (avec
.Display
)! Ensuite, vous pouvez modifier les valeurs. Si vous essayez d'abord de modifier, le code va crasher. Mais sinon j'ai testé cette fonctionnalité et cela fonctionne parfaitement.Merci beaucoup. Sympa et compréhensible.
Bonjour,
Je débute avec les macros…
J'ai bien compris qu'il fallait définir les 4 variables "Sujet", "Destinataire", "Contenu du mail", et "pièce jointe"… mais je ne sais pas ou les déclarer… dans la première ligne ? Sub EnvoyerEmail(ByVal Sujet As String, ByVal Destinataire As String, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String)
ou créer des lignes dans le paragraphe 'définition des variables ?
Merci de votre aide.
Philippe.
Bonjour,
Tout d'abord merci beaucoup pour le tuto, cependant je rencontre quelques difficultés avec la Pj, je souhaiterais mettre en pj du mail le fichier excel actif, j'ai tout essayé mais rien ne fait (je n'ai pas de source pour le fichier)
Avez vous quelques conseils svp?
Bonjour Clément,
Aucun pb de mon côté quand je fais appel à la fonction => Call EnvoyerEmail(MonSujet, MonDestinataire, MonDestinataireCopie, MonContenu, MaPieceJointe)
Avec :
Dim MaPieceJointe As String
MaPieceJointe = "C:\User\…\Fichier.xlsm"
Cdt
Bonjour,
Comment faire pour que la pièce jointe n'apparaisse pas dans le corps de l'e-mail?
Merci,
Sébastien
Un grand merci pour cette macro, trés bien documentée.
Merci à vous pour ce retour…
Cordialement, Martin
Bonjour,
J'utilise cette macro depuis plus d'1 an et tout fonctionnait correctement.
J'explique le fonctionnement brièvement, j'ai un fichier excel avec plusieurs onglet, la macro balaye toutes les lignes et lorsque la ligne est tagguée pour être exporter, je génère une image d'une plage et je la colle dans le mail avec un commentaire associé. Hyper pratique et visuel ;o)
Mon pb, alors que ça fonctionnait avant, j'ai un onglet sur lequel ça ne fonctionne plus… Onglet 1 OK, onglet 2 OK, Onglet 3 NOK, onglet 4 OK.
En faisant du pas à pas, je remarque que c'est la ligne ActiveSheet.ChartObjects("ExportImage").Chart.Export FichierImage
de la macro ci-dessous qui ne se passe pas bien puis me renvoie vers le msg d'erreur => "Une erreur est survenue…"
Une idée svp ? La macro fonctionne avant et après sur les autres onglets. Les onglets ont tous la même forme… J'y perds mon latin 🙁
Public Function ExporterPlageCommeImage2(PlageAExporter As Range, LignesDeGrille As Boolean, FichierImage As String)
'par: Excel-Malin.com ( https://excel-malin.com )
On Error GoTo FonctionErreur
'cacher ou afficher les lignes de grille
LignesDeGrilleOriginal = ActiveWindow.DisplayGridlines 'affichage d'origine
ActiveWindow.DisplayGridlines = LignesDeGrille 'applique l'affichage pour l'export
'Copier la PlageAExporter comme image dans le Presse-papier
PlageAExporter.CopyPicture Appearance:=xlScreen, Format:=xlPicture
'Créer un nouveau "graphique" temporaire qui servira de support – avec la taille exacte de la plage à exporter
With ActiveSheet.ChartObjects.Add(Left:=PlageAExporter.Left, Top:=PlageAExporter.Top, _
Width:=PlageAExporter.Width, Height:=PlageAExporter.Height)
.Name = "ExportImage"
.Activate
End With
'Copier l'image dans le graphique, sauvegarder le fichier et supprimer le graphique temporaire
ActiveChart.Paste
ActiveSheet.ChartObjects("ExportImage").Chart.Export FichierImage
ActiveSheet.ChartObjects("ExportImage").Delete
'remet l'affichage des grilles à l'état avant export
ActiveWindow.DisplayGridlines = LignesDeGrilleOriginal
Exit Function
FonctionErreur:
MsgBox "Une erreur est survenue…"
Merci par avance
Bonjour je comprends pas cela ne fonctionne pas ( message d'erreur argument non facultatif)
J'ai rajouté deux trois éléments :au niveau de => With oMailItem
Par avance merci
Bonjour Aurélie,
votre code ne fonctionne pas parce que dans la ligne 29 (
.Attachments.Add = activeworksheet
) il y a deux problèmes.1) il ne faut pas
=
, cela doit être.Attachments.Add activeworksheet
2) ce que vous voulez ajouter comme pièce jointe doit être un fichier. Donc dans
.Attachments.Add XXX
leXXX
doit être le chemin vers le fichier que vous voulez envoyer. Par Exemple:.Attachments.Add ThisWorkbook.FullName
mais cela fonctionnera uniquement si le fichier est enregistré.
Attention aussi aux lignes:
45) cela doit être
If PieceJointe <> "" Then .Attachments.Add PieceJointe
78) cela doit être
If (Err.Number <> 0) Then
mais c'est peut-être correct dans votre code et les deux
<>
ont disparu lors du copier/coller de votre code sur le site.Sinon, pour la pièce jointe, vous pouvez utiliser directement la variable
PieceJointe
qui fait partie des arguments duSub EnvoyerEmail
. Avant d'appeler leSub EnvoyerEmail
, vous mettez le chemin complet du fichier à envoyer dans la variablePieceJointe
et le tour est joué…Cordialement, Martin
Bonsoir,
Merci pour la qualité de la macro et du tuto.
J'ai une question concernant l'insertion de liens dans les mails vers des fichiers sur réseau.
Dans le cas d'un email formaté comme texte.
Si l'on insert le lien ci-dessous dans la variable "ContenuEmail", une partie du lien sera créée dans le mail mais tronquée au niveau de l'espace situé entre "Projet" et "Exemple".
\\ReseauBidon\Commun\Projet Exemple\Dossier Bidon\Fichier.docx
On peut s'arranger en remplaçant les espaces par des %20, ce qui donne :
\\ReseauBidon\Commun\Projet%20Exemple\Dossier%20Bidon\Fichier.docx
Dans ce cas, le lien généré dans le mail marche mais au niveau visu c'est pas propre avec ces %20 qui traînent un peu partout suivant les liens.
Existe-t-il un moyen de le réaliser sans les %20 et en mode email formaté comme texte ?
Merci !
Sofiane
Bonjour Sofiane,
merci pour votre retour.
J'ai déjà rencontré le même problème… Et malheureusement, il n'y a pas de solution.
En fait, la transformation du lien texte vers un lien "cliquable" dépend du client (MS Outlook, Thunderbird,…) ou de service (Gmail, Yahoo Mail,…) de l'utilisateur. Et tous utilisent la même méthode. Ils peuvent repérer un lien mais au premier espace, ils le considèrent comme terminé. Et en effet, ils ont peu de moyens de distinguer ce qui suit le lien – est-ce la suite du lien ou est-ce tout simplement la continuation de l'email?
Le "%20" évite ce problème. Mais comme tu le mentionnes, cela crée un autre problème: la lisibilité du lien.
La seule possibilité est soit passer en format HTML (là, la solution est très facile) ou bien utiliser les %20. Il me semble que les %20 sont le moindre mal – personnellement je préfère un lien pas propre mais qui fonctionne au lien "propre" mais qui ne marche pas.
Cordialement, Martin
Bonjour,
j'ai plusieurs boites mails dont une accessible à plusieurs personnes qui utilisent le même fichier.
Aujourd'hui, les mails se retrouvent non envoyés dans les boites mails de mes collaborateurs qui n'ont pas accès à la boite mail dédié à la gestion du fichier mais qui par mégarde lance la procédure de relance.
J'aimerais pouvoir tester l'accès à cette boite mail avant que la personne lance la procédure d'envoie de mail automatique présente dans le fichier.
J'utilise SentOnBehalfOfName pour spécifier la boite.
Merci d'avance pour votre aide
Un grand grand merci pour ce code qui fonctionne parfaitement.
Bonjour,
Merci pour ce code que j'utilise et qui fonctionne très bien.
J'ai ajouté .SentOnBehalfOfName pour envoyer le mail depuis une autre boîte aux lettres que la mienne. Et j'aimerais aller jusqu'au bout en supprimant ma signature qui s'insère automatiquement à la fin du mail, comment puis-je procéder?
Merci
Margaux
Bonjour,
merci pour ces explications qui ouvrent de nouvelles perspectives grâce à la possibilité d'envoyer des mails depuis dans mon cas excel.
En revanche, je rencontre un problème que vous n'abordez pas dans votre tutoriel : ajouter un lien hypertexte avec un chemin incluant une apostrophe (j'ai un répertoire qui s'appelle "corbeille d'échanges").
Bonne journée
Bonjour Jérôme,
voici ce qui va vous aider: https://cachefly.zendesk.com/hc/en-us/articles/215068626-How-to-format-URLs-that-have-special-characters-in-the-filename-
Quand j'aurai un peu de temps, je vais en faire une fonction VBA (qui va "assainir" les URL de tous les caractères spéciaux d'un coup)…
Bien à vous, Martin
Bonjour,
tout d'abord merci pour ce tuto d'une grande qualité.
J'ai essayer d'utiliser cette macro très prometteuse mais j'ai un soucis lorsque je la test.
J'ai le message d'erreur suivant :
"Erreur de compilation : Type défini par l'utilisateur non défini" avec la ligne Dim oOutlook As Outlook.Application en surbrillance.
J'ai simplement copier / coller le code comme précisé dans le tuto. Pouvez vous m'aider sur ce dysfonctionnement.
PS : je suis novice en VBA
Pierre
Bonjour Pierre,
merci pour votre retour.
D'après le message d'erreur, il semblerait que vous n'avez pas activé la Référence de Outlook (Microsoft Outlook X.0 Object Library). La procédure est expliquée dans la première partie du tutoriel.
En fait, vous essayez d'utiliser les objets VBA spécifiques à Outlook mais pour cela, vous devez "dire à VBA où aller les chercher".
Donc dans l'éditeur VBA, dans le menu en haut, allez sur "Outils" puis "Références" ensuite vous devez trouver dans la liste "Microsoft Outlook X.0 Object Library" où X sera probablement 15 ou 16. Vous cochez cette référence, vous sauvegardez et votre code devrait fonctionner…
Cordialement, Martin
Bonjour,
Merci pour ce code.
Il y a néanmoins deux points que je ne comprend pas :
ligne 8 : Qu'elle est l'utilité de la variable boolean WasOutlookOpen ?
ligne 68 : Pourquoi définir un On Error Goto alors qu'à la ligne 71 on définit un On Error Resume Next ?
Est ce que ce sont des reliques de code passée ou de réflexion de développement devenue obsolète ? ou est ce qu'il y a un intérêt qui me dépasse ?
Cordialement,
Thibault
Bonjour Thibault,
merci pour cette remarque!
En effet c'étaient des reliques que j'ai oublié d'effacr – mea culpa, c'est pas bien, je sais 😉
Je les ai déjà effacés du code et j'ai refait la procédure
PreparerOutlook
…Bien à vous, Martin
Bonjour,
Quand je veux remplir le texte du body, en écrivant le texte des messages d'erreurs apparaissent par millier. Où dois-je écrire le corps de mon message ?
Merci d'avance pour vos clarifications !
Bonjour Lorenzo,
le texte du "body" doit se trouver dans l'argument
ContenuEmail
que vous passez à la routineEnvoyerEmail
.La réponse dépend donc comment et à quel endroit vous créez le contenu de cet argument.
On peut facilement le voir dans l'exemple
TestEnvoiEmail_Variables
. Là, le texte du body se trouve dans la variableMonContenu
.Mais attention à la manière d'écrire le texte. Vous ne pouvez pas faire, dans votre code, les lignes et paragraphes comme par exemple dans Word.
Pour pouvoir utiliser les lignes ou paragraphes, vous devez:
– utiliser comme format
.BodyFormat = olFormatHTML
– ensuite, tout le contenu doit se trouver entre des guillemets de début et de fin (pour délimiter le contenu de la variable)
– et pour finir, vous pouvez utiliser la balise HTML
<br>
pour séparer les différentes lignes de votre contenuJ'espère que cela vous aidera. Sinon, vous pouvez m'envoyer votre fichier et j'y jetterai un coup d'oeil quand j'ai le temps.
Cordialement, Martin
Bonjour,
Votre code est absolument génial 🙂 Merci beaucoup.
J'ai une petite question concernant la modification du corps de texte. Je me sers de votre macro pour faire des relances "personnalisées" et j'ai besoin d'jaouter des retours à la ligne ainsi que des sauts de ligne.
Néanmoins pour une raison qu j'ignore cela ne fonctionne pas (le code en question est ci dessous). Si quelqu'un a une piste pour corriger le problème je suis preneur 🙂
'everything between "" is static and can be change directly here by you. Cells reference are dynamic and you have to check if they are correct for your pivot table
Text = "Hello " & Range("a1").Offset(i) & "," & vbCrLf & "You have " & Range("a1″).Offset(i, 4) & " blablabla for a global amount of " & Range("a1").Offset(i, 5) & "€" & vbCrLf & _
"If you need any support please contact us." & vbCrLf & "Best regards." & vbCrLf & _
"M DUPONTr" & vbCrLf & _
"VBA trainee"
Encore un grand merci et à très vite 🙂
Pour information le texte est bien formaté en HTML :
'email formatted as HTML
.BodyFormat = olFormatHTML
.HTMLBody = "" & Body & ""
Malheureux que je suis, vous avez déjà répondu à cette interrogation en expliquant le fonctionnement à Lorenzo.
1000 Merci
Merci pour le compliment!
Je suis content que le code vous est utile et que vous avez trouvé la réponse à votre question dans les commentaires.
Cordialement, Martin
Excellent contenu .
J'ai besoin d'effectuer un envoie de mail selon le model suivant :
Cher client
Vous trouverez ci-dessous le tableau de la situation de vos demandes :
N° demande Nature de la demande Date de déclenchement Statut
1 Relevé 26/01/2020 Côturée
2 Course 27/01/2020 en cours
3 Offre 28/01/2020 Côturée
4 Devis 29/01/2020 Côturée
5 Duplicata 30/01/2020 Côturée
Cordialement
HA
Mon besoin consiste à envoyer à chaque client sa situation séparément depuis un fichier Excel toute en gardant la possibilité de d'attacher des pièces jointes et mettre plusieurs adresses dans les champs AA ,CC ,CCI
Merci infiniment pour votre précieuse aide .
Super .. Grand merci
Bonsoir,
Petite demande complémentaire d'un "béotien"
Peut-on définir les destinataires à partir d'une valeur de cellules (Range("Dest1").Value …) afin de rendre la chose "paramétrable" ?
N'étant pas non plus expert d'HTML, je me perds dans les tutos sur le sujet, j'aurais juste besoin de la ou des balises permettant un retour à ligne .
Merci de votre aide.
Sinon comme dit avant ça fonctionne super.
Bonsoir Didier,
merci pour votre retour positif.
Concernant vos questions:
1) oui, c'est possible. Cela dépend de la manière dont vous utilisez la fonction maintenant mais en gros, il faut faire parvenir la valeur de la cellule à la fonction.
Si vous prenez le code du test de l'envoi de l'email, vous pouvez le modifier comme suit:
N'oubliez pas de changer le nom de la Feuille (j'ai mis "Feuil1" à titre d'exemple)
Cela veux dire que vous créez la variable
Dest
que vous remplissez par la valeur de la cellule en question et ensuite dans l'appel de la fonction qui envoie l'email, plutôt que mettre directement une valeur, vous utilisez le "contenu de la variable Dest".2) la balise HTML pour un retour à la ligne est <br>
Cordialement, Martin
Merci … Par tâtonnement (ce qui est souvent une assez bonne méthode), j'y étais arrivé.
Allez, je m'attaque au format HTML ..
En tout cas, ce tuto est de loin un des plus clairs que j'ai vus sur le web. Top.
Merci pour ce tuto.
A noter qu'il faut cocher la référence Microsoft Outlook xx.xx Object Library sinon la compilation ne passe pas.
Bonjour Kyle,
en effet. Et c'est bien noté au début du tutoriel.
Si cette référence n'est pas cochée, pas seulement que la compilation ne se fera pas mais le code ne fonctionnera tout simplement pas…
Cordialement, Martin
Bonjour,
Je n'arrive pas à envoyer automatiquement le mail, en mettant un commentaire devant .Display et en enlevant le commentaire devant .Send, j'ai un msg d'erreur "Le mail n'a pas pu être envoyé"
Comment faire ?
Bonjour Sandrine,
il peut y avoir différentes raisons pour cela (adresse email de destinataire incorrecte, pièce jointe qui n'est pas accessible,…). Donc là, je ne sais pas vous répondre comme ça.
Ce que vous pouvez faire c'est d'exécuter le code ligne par ligne (avec la touche F8) et voir à quelle ligne du code l'erreur a lieu. Ce sera la ligne juste avant que le code "saute" dans l'error handling pour afficher le message d'erreur…
Une fois que je saurai quelle ligne pose problème, je pourrai vous dire ce qui ne va pas.
Cordialement, Martin
Excellent, ce code m'a beaucoup aidé. Ilme reste un sujet c'est le .display qui s'affiche 1/10 de seconde je n'ai pas le temps de le visualiser. J'aimerais me servir de ce .display pour introduire une séquence de validation (msgbox yes/ no) avant envoi du mail. Comment faire.
Merci d'avance, Serge
Bonjour Serge,
utiliser en même temps
.Display
et.Send
n'a pas trop de sens. Il faudrait utiliser.Display
et mettre.Send
en commentaire. Ainsi, le mail est préparé et vous pouvez en faire ce dont vous avez besoin (vérifications etc.). Par contre il faudrait l'envoyer "manuellement" ensuite.Cordialement, MArtin
A nouveau pour une autre question.
Je voudrais pouvoir afficher un corps de mail avec des différences de police de caractère : certains mots en bold d'autres en couleur.
Comment puis-je faire?
Merci d'avance.
Serge
il faut utiliser alors le format "HTML" et utiliser les balises html pour formater le texte. Par exemple: <strong>mon texte</strong> pour le gras, <span style="color: #112233;">Mon texte en couleur</span>
Merci
Bonjour,
Alors, pour commercer je tiens à vous remercier de toute l'aide apportée par vos tutos.
Pour ma part je connais excel depuis bien longtemps et je trouve ça absolument magique. Ce qui je connais moins en revanche, c'est la VBA. Je débute totalement en la matière. Alors sachant qu'en effet tout est possible (ou presque!!), j'ai décidé de me lancer.
J'ai tenté de copier/coller le code ci dessus, mais ça ne fonctionne pas. J'ai bien tenté de modifier "quelques trucs" mais je ne suis malheureuse qu'une débutante et je ne comprends pas la moitié de ce que j'ai à faire pour que ça fonctionne.
D'abord, lorsque je veux affecter ma macro , elle n'apparait pas.. 1er problème! Ensuite, en enlevant ce qu'il y a dans les parenthèses du "sub" ((ByVal Sujet As String, ByVal Destinataire As String, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String)), Je fini par pouvoir l'éxécuter, mais là j'ai un message qui me dit "mail non envoyé car vide"… Je ne sais pas du tout comment corriger.
Est il possible d'avoir un p'tit coup de pouce???
Merci d'avance.
Bonjour Barbara,
désolé pour la réponse tardive mais j'étais occupé au-delà du maximum faisable…
Pour répondre à votre question:
1) La macro "EnvoyerEmail" exécute l'envoi de l'email avec les informations qui que l'on lui "passe" à travers les variables qui sont entre les parenthèses (
(ByVal Sujet As String, ByVal Destinataire As String, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String)
Donc si vous l'effacez, la macro va considérer que le contenu de toutes ces variables et vide et ne pourra donc en effet pas envoyer l'email (car l'adresse email est vide, le sujet est vide et le contenu est vide aussi)
2) vous avez donc besoin de lui faire parvenir ces informations. Cela peut être fait de plusieurs manières qui dépendent de l'utilisation.
J'ai mis dans ce tutoriel 2 manières de le faire: les macros
TestEnvoiEmail_Variables
etTestEnvoiEmail
Vous avez donc besoin non seulement de la macro principale mais aussi une de ces deux macros. Je vous conseillerais d'utiliser "TestEnvoiEmail_Variables". Là, vous remplacez les valeurs par ce dont vous avez besoin et ensuite, vous lancez cette macro (vous ne devez donc pas lancer la macro "EnvoyerEmail" directement. C'est la macro "TestEnvoiEmail_Variables" qui va le faire elle-même.
3) j'espère que je suis clair. Donc vous copiez les deux macros, vous faites les changements de valeurs dans "TestEnvoiEmail_Variables" et vous lancez la macro "TestEnvoiEmail_Variables"
J'espère que cela va vous dépanner.
Cordialement, Martin
Bonjour Martin,
Merci infiniment pour votre réponse. Mais très honnêtement, je suis complètement perdue.
ça me paraissait plutôt clair au départ, j'avais l'impression de comprendre mais là, plus rien. Je ne sais plus du tout quoi faire de tout cela.
Cordialement.
Barbara
Re-bonjour,
c'est sûr que ceci n'est pas idéal comme cas pour commencer avec VBA.
Si vous voulez, envoyez-moi un email avec la description de ce dont vous avez besoin exactement et je vais voir ce que je peux faire pour vous.
Il me faudrait des infos comme: d'où viennent les informations à utiliser, est-ce que c'est toujours le même email que vous devez envoyer, etc.
Cordialement, Martin
Bonjour
Comme beaucoup j'apprends grâce à vous.J'ai 3 problèmes avec ce code pour lesquels j'espère que vous pourrez m'aide
Premier point, mon Outlook ne s'ouvre pas automatiquement comme décrit dans le code donc envoi d'email seulement si il est ouvert avant ou lorsque je l'ouvre manuellement?
Deuxième point, je ne comprends pas pourquoi le contenu de mon Email ne s'affiche que si je l'écrit dans les parenthéses de TestEnvoyerEmail etb non pas dans le Body de EnvoyerEmail.Donc je m'interroge sur la nécessité de Body dans EnvoyerEmail?
Troisième point le plus important, je n'arrive pas à insérer un lien hypertexte dans le contenu de mon Email?
Merci de votre aide, je vous joins mon code
Bonjour
A force de fouiner sut tous les forums j'avance…. Jarrive dorénavant à envoyer un lien hypertexte par mail via une macro,cependant je n'arrive pas à y insérer la signature de mail avec logo présente déjà dans mon OUTLOOK? Je n'arrive pas non plus à ce que mon OUTLOOK s'ouvre pour envoyer si il est fermé à l'origine? Merci de votre aide, je suis néophyte mais tenace
Bonjour
J'avance encore….Maintenant j'arrive à ouvrir OUTLOOK si il n'est pas ouvert et donc envoyer le mail ensuite.Pour perfectionner cette commande je souhaiterais ensuite que l'application OUTLOOK se réduise dans la barre des tâches automatiquement à la suite de cette commande, une idée? J'ai encore du mal à comprendre l'intérêt, la fonction des diffèrentes parties du code comme préparer Outlook nettoyage….Merci de votre aide
Cordialement
Bonjour,
J'ai utilisé votre article comme base de développement d'une petite application. Il est très bien fait.
J'ai ajouté dans mon appli, le déplacement du mail émis dans un dossier dédié.
Cependant, il arrive qu'au moment du déplacement du mail, Outlook ne soit pas en mode connecté.
Je n'ai pas trouvé la propriété (hors exchange) à tester pour faire une boucle d'attente.
La connaissez-vous ?
Cdt, NC
Bonjour,
Je trouves le code VBA super intéressant, j'aimerais l'utiliser par contre on utilise gmail, est-ce possible ?
Deuxièmement, avez-vous un vidéo pour nous montrer ou mettre le copie/coller dans un module, vous êtes génial.
Merci
Bonjour, avez vous trouvé une solution svp ?
Bonjour,
Quelqu'un peut-il y jeter un coup d'œil à mon fichier s'il vous plaît ?
Je suis débutant en VBA, et malgré le simple copier/coller à faire, je n'y arrive pas….
https://www.cjoint.com/c/JFkl2cK5aw3
Le fichier ci-joint contient deux documents, chacun sur une feuille, selon des listes déroulantes des informations vont apparaître sur les documents. Le tout est dirigé depuis une autre feuille (Réglages).
A partir de Réglages j'ai ensuite tout automatisé. (Voir dans le document il y a toutes les consignes, c'est plus pratique)
Dans le Module1, il y a une macro pour le bouton PDF (Que je n'arrive pas à adapter non plus…) et dans le Module2, la place pour le code de l'envois de mail(je l'ai laissé vide pour éviter de perturber avec les nombreuses tentatives que j'ai essayé). Ils représentent exactement ce que je souhaite au final, mais je n'arrive pas du tout à les adapter à mon "automatisation" des données…
HELP ME !!
C'est vraiment dommage de ne pas pouvoir choisir une plage de cellule, avec la mise en forme souhaitée, comme corps du texte.
Un site en anglais, qui propose l'envoi de mail par Excel, à partir d'une plage pour le corps du message :
http://www.rondebruin.nl/win/s1/outlook/bmail2.htm
Merci pour le tuyau!
Je vais le tester.
Martin
Bonjour,
Merci pour cette procédure qui facilitera grandement la gestion de mon club cycliste.
Toutefois, lorsque je lance la procédur (à partir de "TestEnvoiEmail_Variables"), je reçois le message "Erreur de compilation Sub ou Function non définie" au niveau de "PreparerOutlook" du bloc
'préparer Outlook
PreparerOutlook oOutlook
Set oMailItem = oOutlook.CreateItem(0)
Qu'ai-je loupé ?
Merci pour votre aide.
Bonjour Christian,
êtes-vous sûr d'avoir copié également la procédure
PreparerOutlook
dans votre projet?Le code en a besoin, c'est une procédure "secondaire" – vous ne la lancez pas mais la macro que vous lancez l'utilise.
Elle se trouve dans le code VBA de base (le premier code VBA sur cette page) à partir de la ligne 64…
Cordialement, Martin
Bonjour,
Autant pour moi.
Bien à vous,
Bonjour,
Je ne trouve pas la procédure PreparerOutlook dans votre code et aucune ligne 64.
Pouvez-vous donner le code en commentaire ou vérifier la page svp ?
Je vous remercie.
Salutations.
Bonjour Antoine,
merci pour l'avertissement!
J'ai fait une mise à jour du code il y a deux jours et je n'ai copié que la fonction principale en oubliant la procédure
PreparerOutlook
.Je viens de corriger cela et le code devrait fonctionner correctement comme avant.
Cordialement, Martin
bonjour a vous;
j'essaye d'utiliser votre code mais au lancement de la macro j'ai l'erreur:
"erreur de compilation: type non défini par l'utilisateur " et pointe sur la ligne 7 de la sub "envoyer mail"
Bonjour Victor,
je dirais que vous n'avez pas ajouté la Référence à "Microsoft Outlook X.0 Object Library".
Regardez dans le tutoriel juste au-dessus du premier code VBA: "Ajouter la Référence Microsoft Outlook X.0 Object Library"
Cela devrait résoudre votre problème.
Cordialement, Martin
Bonjour,
Très bonne macro.
J'aimerai savoir comment faire pour que le texte dans "MonContenu" soit sur plusieurs lignes et non comme ci-dessous?
"Bonjour, Ci-joint la feuille des pronostics et à me renvoyer dès que possible. Cordialement, Jean-François"
D'autre part, est-il possible de mettre le fichier en pièce jointe et non pas dans le corps du mail?
Merci encore pour cette bonne macro.
Cordialement, Jean-François
Bonjour Jean-François,
pour gérer les retours à la ligne, choisissez le format HTML (explications sont dans le tuto) et ensuite utilisez la balise HTML " <br> "
Donc vous aurez quelque chose comme ceci:
Pour votre 2ème question: vous pouvez toujours ajouter un fichier avec une pièce jointe. Mais il vous faudra soit supprimer le test de la valeur de Body dans mon code car si le texte du body est vide, c'est considéré comme erreur.
Et pour la pièce jointe, vous devrez d'abord sauvegarder votre texte dans un fichier pour pouvoir le joindre à votre email (VBA: Sauvegarder un texte dans un fichier )
J'espère que cela répond à vos questions.
Cordialement, Martin
Bonjour,
Tout d'abord, un grand merci pour ce tutoriel, qui m'a énormément aidé.
J'ai opté pour un envoi de mail au format HTML. J'ai paramétré mon code pour qu'il ouvre simplement tel ou tel fichier HTML en fonction du type de contenu que je dois envoyer, et tous les fichiers HTML différents sont enregistrés en local sur mon pc.
Et donc fatalement, mon mail et mon texte sont non personnalisés, ce qui ne convient pas dès que je veux ajouter la moindre personnalisation.
Y aurait-t-il moyen de faire d'abord modifier le contenu d'un fichier HTML (sans écraser le fichier HTML d'origine) par le code VBA, et ensuite qu'il envoie le mail en fonction de ce fichier HTML modifié ?
Ou alors suis-je obligé de définir tout le contenu de l'email au niveau du code VBA et non dans un fichier HTML ?
Voici le code (volontairement simplifié) :
Un grand merci pour votre aide. Bonne journée !
Joël
Bonjour Joël,
je suis content que mon code vous a aidé.
Ce que vous demandez est relativement facilement faisable.
Moi je le ferai de cette manière:
1) dans le fichier template, soit vous savez ce que vous voulez modifier, soit vous pouvez y mettre des "placeholders" facilement repérables (par ex: #NomClient#)
2) une fois que vous avez le contenu du template dans la variable
f
, vous pouvez remplacer une partie de ce code ou un placeholder avec le texte qu'il vous faut via la fonction Replace3) vous continuez votre code avec la variable
f
mise à jour.Donc cela pourrait donner quelque chose comme:
Sachez que vous pouvez remplacer une valeur, ou 5 ou autant que vous voulez. J'ai utilisé 3 changements dans mon exemple.
De cette manière, le template n'est pas changé car vous lisez son contenu dans la mémoire et les modifications se passent au niveau de la variable dans la mémoire.
J'espère que cela répond à votre question.
Cordialement, Martin
Bonjour,
Un grand merci pour ce tuto qui va me permettre de gagner un temps fou !
J'ai deux petites questions : Est-il possible d'afficher autrement les PJ ? On dirait qu'Outlook les apporte d'une manière assez ancienne dans le corps du texte plutôt que de les placer dans la case PJ dédiée.
Bonjour Tom,
je suis content que mon code vous soit utile.
Pour votre question: si vous utilisez le format "Rich text" (
.BodyFormat = olFormatRichText
), la pièce jointe sera ajouté dans le corps de l'email.Pour qu'il soit dans la case "pièces jointes", l'email doit être formaté soit en HTML (
.BodyFormat = olFormatHTML
) soit en simple texte (.BodyFormat = olText
).Ou bien il vous suffit de supprimer la ligne
.BodyFormat = ...
(ou la mettre en commentaire) car le format par défaut est HTML et donc les fichiers sont dans la bonne case.Cordialement, Martin
Bonjour
Merci pour cette superbe procédure qui va m'etre bien utile!
ca marche mais ca m'affiche toujours le msgbox final "ce mail n'a pas pu être envoyé…"
Je ne comprends pas la synthaxe de la fin de la procédure :
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"
Bonjour Jérôme,
la syntaxe à la fin est utilisé en cas d'erreur dans la procédure.
Les deux premières lignes suppriment les objets (
oMailItem
etoOutlook
) de la mémoire de l'ordinateur.La troisième ligne affiche le message avertissant l'utilisateur qu'une erreur s'est produite.
Pour savoir exactement ce qui se passe, vous pouvez exécuter la procédure ligne par ligne (avec la touche
F8
) dans l'éditeur VBE.Vous verrez alors exactement quelle ligne de code déclenche l'erreur qui cause que l'exécution saute la suite du code et va directement vers le code à exécuter en cas d'erreur (que vous avez mentionné dans votre question).
Bien à vous, Martin
Bonjour,
Pourriez vous me préciser la ligne de code à ajouter afin que la signature soit ajoutée automatiquement svp ?
Je tiens à préciser que dans mes paramètres outlook, ma signature est ajoutée pour chaque réponse ou chaque nouveau mail.
Hors quand je crée un mail automatiquement via excel, la signature disparait !
Merci
bonjour
merci pour votre macro qui est super mais je l'ai développée sur un Excel 2016 et le fichier sera utilisé par des personnes travaillant sur des versions antérieures (en partie). Du coup sur Excel 2010 j'ai une erreur liée à la référence Microsoft Outlook 16.0 Object Library
lorsque j'active manuellement la référence (n°14) sur un PC sous excel 2010, il faut que je retire la référence manquante 16 pour cocher la 14.je sauve, je reexécute la macro: j'ai une erreur dont le debugage pointe sur la ligne olFormatHTML.
plusieurs questions: existe t-il un code pour activer la référence automatiquement sans ouvrir l 'éditeur de code? s'il faut l'activer manuellement, dans ce cas pourquoi l'erreur survient -elle au choix du format?
merci beaucoup !
Bonjour,
Je vous remercie pour ce tutoriel très complet.
Afin d'automatiser un processus d'envoi d'e-mail, je dois envoyer des mails à plusieurs destinataires avec des PJ individualisées pour chacun des destinataires + le responsable du service pour chaque mail.
Pouvez vous me communiquer une procédure à ce sujet?
Mille merci pour votre aide,
Bien à vous
Bonjour,
D'abord merci pour ce tuto qui est vraiment très clair et très détaillé moi qui n'est pas travaillé sur VBA depuis un moment.
Dans ce format proposé, est-ce qu'il est possible d'avoir un bon de commande dans le premier onglet puis mettre le bouton Envoyer, etc dans le second onglet.Sachant que je souhaite que la PJ de l'email soit le premier onglet qui soit imprimé en PDF au préalable ? Merci d'avance,
Bonjour,
Merci beaucoup pour ce tutoriel très complet. J'ai un problème avec Outlook. Le code fonctionne parfaitement mais si Outlook n'est pas ouvert avant d'exécuter la macro, les messages ne s'envoient pas, ils restent dans la boîte d'envoi. Il faut ouvrir Outlook pour que les messages soient envoyés. Avez-vous une solution pour ouvrir Outlook en arrière-plan assez longtemps pour l'envoi des messages ?
Merci d'avance de votre réponse.
Cordialement,
Bonjour,
Merci pour ce tutoriel.
Je cherche à entrer dans la variable "ContenuEmail" de la procédure "EnvoyerEMail" la valeur d'une cellule d'un tableau excel de travail contenant du texte mis en forme (mots surlignés, etc.).
L'utilisation du format olFormatRichText dansla macro ne permet que de récupérer les sauts de lignes et les paragraphes mais pas la forme originelle (soulignages etc.) dans la cellule de départ.
Je pense que cela provient du fait d'avoir définir la variable le texte d'une cellule de la manière suivante : Contenu = Range("CnLn").Value
Auriez-vous une parade ? Le but étant de pouvoir modifier le contenu de la cellule de départ et que cela "adapte" directement le corps du mail (mise en forme comprise).
Merci d'avance pour votre retour,
CDMT
Grégoire
Bonjour Grégoire,
ce que vous souhaitez est possible mais c'est un peu plus compliqué.
En gros, vous devez passer par le format HTML. Et pour avoir le contenu de votre cellule avec les formats, vous devez d'abord exporter cette cellule (ou Range) dans un fichier HTML temporaire. Vous récupérez ensuite le code HTML d'une "page" ainsi créée et vous l'injectez dans votre email.
Vous pouvez le voir dans cet article de Ron de Bruin: https://www.rondebruin.nl/win/s1/outlook/bmail2.htm (en anglais)
Je compte écrire un tutoriel en français très prochainement sur ce sujet, avec un code VBA prêt à l'emploi. Mais vu le peu de temps dont je dispose pour le moment, je ne peux pas vous donner l'estimation de date quand ce tutoriel sera prêt.
Mais si vous voulez, je peux vous prévenir quand il sera publié.
Cordialement, Martin
Bonjour c'est possible de récupérer la valeur d'une cellule par rapport à la valeur d'une cellule qui est à plusieurs colonnes sur la droite ? J'ai pensé à faire un offset(0, -2)
Par exemple mon fichier Excel:
Tache | Réalisé | Validation
Tache exemple | Oui | KO
Tache exemple 2 | Non | OK
De faire un checkup si la validation est OK avec une boucle et comme ci dessus avoir une mise en forme tableau.
Merci par avance de votre réponse !
Bonjour,
dans le offset, un chiffre négatif (-2 dans votre cas) comme colonne signifie 2 colonnes à gauche. Pour avoir 2 colonnes à droite, c'est
.Offset(0,2)
.Sinon, vous pouvez utiliser
Cells
dans la boucle. C'est aussi simple.Exemple:
J'espère que cela répond à votre question…
Martin
Du coup, je m'étais trompé c'était bien un decalage sur la gauche, je souhaiterais désormais savoir comment l'ajouter dans un tableau ?
Voici ce que j'ai :
Dim task As String, validation As String, lastLine As Integer, i As Integer, tableau() As String
ReDim tableau(lastLine)
lastLine = Sheets("Feuil5").Cells(Rows.Count, 1).End(xlUp).Row
i = 0
For ligne = 12 To lastLine
If Sheets("Feuil5").Range("F" & ligne) = "OK" Then
'Ajout de la valeur tache en decalant de deux colonnes sur la gauche de la ou se situe la valeur = OK
ReDim tableau(i)
tableau(i) = Range("F" & ligne).Offset(0, -2)
i = i + 1
End If
Next ligne
MsgBox tableau(1)
Rien ne s'affiche, je fais quelque chose de mal mais je ne trouve pas .
Merci de votre aide !
Rien ne s'affiche car le
ReDim
redimensionne le tableau tout en effaçant les valeurs!Donc dans votre code, vous vous retrouverez avec une table de la bonne taille mais vide
Vous pouvez y remédier en utilisant l'expression
Preserve
qui fait que le tableau est redimensionné en gardant les valeurs:Voilà, j'espère que cela va vous aider.
PS: n'oubliez pas que sans
Base 1
au début de votre module, les éléments du tableau commencent par 0.Donc pour afficher le premier élément, il faut
MsgBox tableau(0)
PS2: il n'est pas nécessaire de redimensionner le tableau à chaque itération.
Dans mon code, je le "dimensionne" au départ à un maximum, et ensuite, à la fin, je le redimensionne à la bonne taille grâce à
i
Bonjour,
super le code est vraiment complet.
Je souhaiterais faire en sorte de ne partager qu'un seul onglet de mon classeur par le biais de ce code et non pas le classeur entier.
Je n'arrive pas à l'intégrer, comment serait-ce faisable?
Merci
Bonjour Maxime,
oui c'est faisable.
Mais vous devez passer par un workbook intermédiaire car la pièce jointe n'est pas un onglet mais un classeur.
Donc pas à pas:
– vous devez exporter l'onglet souhaité et l'enregistrer comme un classeur
– vous envoyez cette copie temporaire comme pièce jointe
– vous supprimez la copie temporaire
Si vous voulez, vous pouvez utiliser ce code de Ron de Bruin: https://www.rondebruin.nl/win/s1/outlook/amail2.htm
Cordialement, Martin
Bonjour et merci Martin je vais faire des tests, dsl du spam je n'ai pas pensé à scroller vers le bas, et je pensais avoir une notif par mail.
Bonjour, pas de problème.
Il y a encore peu, les réponses aux commentaires étaient notifiés par email.
Mais certains commentateurs se plaignaient d'être bombardés d'emails (car ils avaient choisi l'option d'être prévenu de chaque commentaire sur l'article où ils avaient posté plutôt que d'être informés uniquement de réponses à leur messages). Du coup cela créait des malentendus et discussions dont la gestion était assez gourmande en temps. Temps qui me manquait après pour créer du contenu.
Peut-être je vais essayer de trouver encore une autre solution…
Cordialement, Martin
Bonjour,
je souhaiterais modifier ce code pour n'envoyer qu'un seul onglet au lieu du classeur entier.
Cette onglet serait différent chaque jour.
Comment est-ce possible de l'intégrer à ce code?
Merci
Comment on fait pour l'utiliser ave la version online de excel et de outlook ???
Bonjour,
malheureusement, les versions online d'Excel, de Outlook et d'autres applications ne supportent pas VBA.
Le problème est que VBA a besoin de ressources (CPU etc.) – normalement, c'est le PC de l'utilisateur qui le fournit donc il n'y a pas de problème.
Avec Excel Online, ce devraient être les serveurs de Microsoft qui devraient effectuer le travail – et cela, Microsoft ne veut pas. Pour des raisons financières et aussi de sécurité.
Une alternative seront les "Office Scripts" (une version Microsoft de JavaScript) mais cette solution n'en est qu'à ses premiers pas…
Donc pour le moment, si vous voulez automatiser Excel, vous devez disposer d'une version classique d'Excel (2007, 2013, 2016, 2019 ou 365)
Bonjour !
Tout d'abord un grand merci pour ce tuto !
SEUL HIC :
– Je n'arrive pas a envoyer le mail sans qu'il m'affiche l'aperçu …
Même lorsque je met en commentaire .display….
Je veux bien un coup de main si cela est possible.
Bien à vous et au plaisir de vous lire
Cordialement
Léo
Bonjour, je tenais à vous remercier pour ce tuto complet.
Je souhaiterais envoyer un mail automatisé à une liste de destinataires (dans l'excel, il y a une colonne nom et une avec les adresses email). Cependant j'ai un souci. Ce message d'erreur apparait :" Erreur d'exécution '1004', erreur définie par l'application ou par l'objet.
Si jamais vous voyez d'où peut provenir l'erreur je vous en serait reconnaissant .Merci d'avance
Voici le Code:
Sub envoiparmail()
Dim ObjOutlook As New Outlook.Application
Dim oBjMail
Dim Nom As String
Dim Email As String
Dim i As Integer
Set FL = Worksheets("Destinataires")
LineNB = ActiveCell.Row
Nom = FL.Cells(Ligne, 1)
Mail = FL.Cells(Ligne, 2)
heures = FL.Cells(Ligne, 3)
Body = "Bonjour " + Nom + " Selon le fichier extraction du 22/03/2021,vous avez 184 heures non imputées. Vous en souhaitant bonne réception.Cordialement. nisrine"
Subject = Nom + "-" + heures
Set ObjOutlook = New Outlook.Application
Set oBjMail = ObjOutlook.CreateItem(olMailItem)
destinataires = Array("****.*****@gmail.com", _
"****.*****@gmail.com", _
"****.*****@gmail.com")
With oBjMail
For i = 0 To UBound(destinataires)
Set dest_A = .Recipients.Add(destinataires(i))
dest_A.Type = olTo
Next i
.Subject = "Heures imputees"
.HTMLBody = Body
.display
End With
End Sub
Bonjour Noun,
à priori, l'erreur vient de la variable
Ligne
qui n'est pas défini.Par contre vous définissez la variable
LineNB
qui n'est pas utilisée ensuite.Donc j'imagine qu'il s'agit de la même chose.
Il vous suffit donc de remplacer:
LineNB = ActiveCell.Row
par
Ligne = ActiveCell.Row
Donc essayez déjà ça et voyez si cela marche ou s'il y a encore un autre souci.
Cordialement, Martin
Je vous remercie Martin! En effet, cela provenait de là.
Cordialement
Nouun
Bonjour,
Je ne suis vraiment pas une experte en VBA …
je n'arrive pas à sélectionner la référence "Microsoft Outlook X.0 Object Library" ; en effet, un message d'erreur apparaît : "Erreur de chargement de la DLL"
Pouvez-vous me redire svp ?
Merci de votre aide
bonjour
Ayant déclaré la référence a la libraire outlook, ce ne fonctionne pas (erreur de variable. Merci pour votre aide
Bonjour,
Merci beaucoup pour cet article qui me permet de faire d'envoyer des mails en HTML à plein de clients (avec une boucle ajoutée à cela).
Cependant, il persiste un problème.
Lorsque j'ouvre mon fichier HTML (fait à partir d'un site, ne sachant pas coder personnellement), il n'y a pas de soucis.
Je souhaite insérer ce fichier dans ma macro VBA à l'aide de la fonction FSo.GetFile("MonFichier").OpenAsTextStream.ReadAll qui me permet d'avoir le code directement.
Ensuite, je fais des modifications dans le texte en fonction de mes clients grâce à ma boucle.
Mais il y a un problème après lorsque j'insère le mail dans Outlook. En effet, le format des images n'est pas respecté par rapport au départ et je lettres avec accent sont remplacées par des caractères comme "é" ou encore "ô".
Ai-je fait une erreur quelque part ?
Merci par avance.
Cordialement,
Bonjour,
Merci pour cette macro qui m'a bien facilité le travail.
Je suis confrontée à une erreur que j'ai bien du mal à comprendre.
J'ai d'abord fais un test avec 3 mails différents, tout s'est bien déroulé.
J'ai alors exécuté la macro sur mon fichier client et le mail n'est passé que pour 9 adresses sur 34.
Auriez-vous une idée de la raison ? Car je ne vois rien de logique à cela.
Pour info je fais une boucle qui va chercher pour chaque ligne, le dest, la pj, objet et corps du mail sont en dur dans la macro.
Je ne comprends pas pour quoi cela ne fonctionne qu'avec certaines adresses…
Merci d'avance pour votre réponse
bonjour
pas mal
mais il faut savoir que depuis 2013 et selon les config windows il faut préciser le shemas
Const PR_ATTACH_CONTENT_ID = "http://schemas.microsoft.com/mapi/proptag/0x3712001F"' en haut de module
et dans la création de l'object
exemple:* "création du mail
'————————————————-
Set oApp = CreateObject("Outlook.Application") 'instance outlook
Set oEmail = oApp.CreateItem(olMailItem) 'instance de l'item mail dans outlook
Set colAttach = oEmail.Attachments ' ça c'est la collection des attachements
'———————————————————————-
' a répéter pour chaque image placées dans le body!!!!!!!!!!!
'on attache l'image
Set oAttach = colAttach.Add(NomImage) 'on ajoute dans la collection d'attachements l'image de la plage
Set olkPA = oAttach.PropertyAccessor 'collection des properties d'accessibilité de l'attachement
olkPA.SetProperty PR_ATTACH_CONTENT_ID, "imgTemp.gif" " application de la propriété cid a l'attachement
'———————————————————————-
sans ça il y a plusieurs variations de résultat
la pièce jointe(image) est absente et donc pas dans le body
la pièce jointe(image) est dans le body mais au debut et plus a sa place
la pièce jointe est dans les attachement mais pas dans le body
Bonjour
Merci beaucoup pour ce code très pratique
Toutefois je rencontre un soucis.
J'ai besoin d'envoyer une copie du tableau excel concerné (d'une seule feuille en fait) en pièce jointe du mail et cette copie doit être protégée (une seule cellule pouvant être modifiée par le destinataire).
J'arrive bien à protéger la feuille en question et à enregistrer cette feuille dans un classeur vierge via du vba.
Si j'ouvre cette copie manuellement, la feuille est bien protégée
Mais si j'utilise votre code pour mettre ce tableau en PJ du mail, la feuille n'est plus protégée
Pourriez-vous m'aider ?
Par avance merci
Willfried
Bonjour,
Comment déclencher les mails à certaines dates?
Il s'agit de locations meublées : envoi de mail pour déclencher le paiement du solde, pour indiquer les modalités d'arrivée, pour vérifier si le séjour se déroule bien, pour remercier le locataire et l'inviter à laisser un commentaire etc.
Bonjour Marie,
pour cela, en VBA, je vois deux possibilités:
1) simplement avec Excel, vous imbriquez le code d'envoi de l'email dans une boule qui teste la date. Par exemple toutes les heures, vous testez la date à ce moment-là. Si la condition est rempli (par exemple si la date = le 1er du mois), l'email (ou les emails) est envoyé et la boucle continue. Le seul hic de cette méthode est que Excel (et donc l'ordi sur lequel le programme tournerait) doit rester allumé…
2) VBA peut aussi être utilisée dans Outlook – et non seulement dans le courriel mais aussi au niveau de calendrier. Chaque événement dans le calendrier déclenche un "event" VBA qui peut donc exécuter un code. Vous pouvez donc, par exemple, tester le nom de l'événement du calendrier et si celui-ci est "envoi paiement du solde", vous le faites exécuter l'envoi de l'email correspondant. Avantage – pour l'utilisateur c'est assez facile (il n'a qu'à gérer le calendrier Outlook, pas besoin de connaissances techniques) et si ma mémoire est bonne, certains événements Outlook peuvent être gérés au niveau du serveur (donc pas besoin que le PC soit allumé non-stop). Mais ceci, il faudrait le vérifier… Mais au niveau de la macro, c'est plus compliqué que la méthode 1).
J'espère que cela répond à votre question.
Cordialement, Martin
Si Outlook est fermé au départ, quand j'utilise la macro en pas à pas en test une seule instance d'Outlook est ouverte mais si j'exécute la macro, Outlook est ouvert autant de fois qu'il y a de message à envoyer.
Que peut-il se passer ?
Bonjour,
et si vous essayez de enlever le démarrage d'Outlook du code?
Il suffit de mettre en commentaire la ligne 17 de la fonction
EnvoyerEmail
:PreparerOutlook oOutlook
deviendra alors'PreparerOutlook oOutlook
Est-ce que tout fonctionne comme il faut alors?
Cordialement, Martin
Il faut bien passer par la routine privée PreparerOutlook oOutlook. Je l'ai modifié pour ne l'exécuter qu'un fois en transmettant une variable :
Cela marche en automatique dans les 2 cas (Outlook déjà ouvert, Outlook fermé). Une fois exécuté, je n'ai qu'une instance d'Outlook.
Merci de votre réponse.
Bravo et merci beaucoup
Bonjour, tout d'abord je souhaitais vous adresser des félicitations pour la qualité remarquable des informations présentées sur cette page. Je suis intéressé par l'envois d'email à partir d'excel et le contenu correspond complément à ma recherche.
Cependant je rencontre certaines difficultés. Il me semble que les noms de paramètres ne sont pas identiques entre TestEnvoiEmail_Variables() et EnvoyerEmail(), ce qui fait dans mon cas personnel que "contenuEmail" est toujours vide (donc email non envoyé) car c'est MonContenu qui est définit dans TestEnvoiEmail_Variables() et pas "ContenuEmail". Cette erreur se corrige dans mon cas en indiquant les bons noms de part et d'autre.
Je n'arrive par contre pas du tout à ouvrir Outlook ou à manipuler Outlook s'il est déjà ouvert, PreparerOutlook() me renvoit systématiquement sur les messages d'erreurs. Auriez vous des conseils à me donner ?
J'ai bien rajouté la référence "Microsoft Outlook 16.0 Library" au projet, et remplacé MSOUTL.OLB par le votre comme stipulé dans les commentaires. Je suis sous WIN10, et Excel Office 365 (soit une des dernières versions disponible je suppose)
Merci d'avance pour votre retour
Bravo ! Bravo, Bravo ! et merci merci merci !
etant un passionné du code VBA, je vous remercie pour vos explications
Très clair, super pratique, facile d'utilisation pour un débutant!
Merci Vincent
bonjour
c est super bien fait merci
en revanche, j'ai un soucis. quand je fais tourner la procédure bloque à PreparerOutlook oOutlook
Bonjour, j'ai essayé votre code mais impossible d'afficher ma signature autre qu'en pièce jointe. Je début en VBA et je ne trouve pas ma faute…
voici une partie de ma macro:
.CC = Range("A" & n)
.BCC = Range("C" & n)
.Subject = Range("M1") & "N° de compte client" & " " & Range("E" & n) & "-" & Range("F" & n)
.To = Range("D" & n)
.Attachments.Add "Z:\XXXX\XXXXX"
.Attachments.Add "Z:\XXX\signature.jpg", olByValue, 0
.HTMLBody = Body & "" & "" & "" & ""
.Send
Bonjour Noa,
vous trouverez cette information dans la section "Image dans le corps du message" dans le chapitre "Utilisation avancée".
Maintenant que vous avez ajouté l'image comme pièce jointe, vous devez indiquer à quel endroit elle doit se trouver dans le body de l'email:
Par exemple:
à placer avant la ligne
.Send
de votre exemple.Bonjour,
Super bien fait et clair.
J'ai un petit problème … quand j'écris les balises html sur plusieurs lignes, j'ai une erreur …
et pour tout écrire sur une seule ligne, c'est une fameuse galèsi le texte est long … Il y a un système ? Je fais une erreur ? J'oublie un caractère de fin de ligne ?
Bonjour Patrick,
en VBA, une une instruction doit se trouver sur ne ligne. Mais il y a deux possibilités:
1) soit découper votre texte et ajouter les différentes parties à la même variable – exemple:
2) ou bien utiliser
_
qui, avec les & vous permettra d'écrire la chaîne sur plusieurs lignes – exemple:J'espère que cela répond à votre question.
Cordialement, Martin
Bonjour,
je vois que votre macro utilise à la fois la liaison tardive (avec createobject) et la liaison précoce (références à Outlook.Application), ce qui n'est pas recommandé si vous ne voulez pas avoir de fuite de mémoire.
En général on référence les bibliothèques outlook, lors de la phase de développement et ensuite on pas à la liaison tardive (Déréférencement des bibliothèques, et modification des variables en objet neutre)
Il serait peut-être intéressant de modifier la macro ?
cordialement
Bonjour,
super tutoriel !
J'ai une demande supplémentaire. Lorsque nous avons plusieurs comptes Outlook, en suivant votre méthode, il est effectivement possible d'envoyer un mail avec un compte qui n'est pas celui considéré comme "principal".
Cependant, le mail envoyé ne se trouve pas dans le compte secondaire mais dans le répertoire "Envoyé" du compte principal.
Comment faire pour que le mail envoyé se retrouve bien dans le répertoire envoyé du bon compte expéditeur ?
J'esoère avoir été assez clair 😉
Merci d'avance.
Bonjour.
Merci pour ce tuto qui est parfaitement bien expliqué.
Cependant, je me pose la question suivante :
Est-il possible (pour automatiser totalement l'envoi du mail) sans avoir à intervenir à aucun moment, d'ajouter une condition dans ce code ?
Je m'explique :
– Admettons que dans une cellule, j'affiche la date du jour (Cellule A1).
– Dans une autre cellule, il y a une date (Cellule B1).
– Dans la cellule suivante (C1), j'affiche un résultat ( =SI(A1>B1;"ALERTE MAIL";"") )
Mon idée serait que si la cellule C1 contient "ALERTE MAIL", que le mail soit envoyé automatiquement et directement sans avoir à cliquer sur un bouton.
J'imagine que si c'est possible, cette procédure automatique ne doit s'exécuter qu'une seule fois. (En D1, par exemple, il pourrait s'afficher : "MAIL ENVOYÉ")
PS : Dans mon projet, les autres cellules (C2, C3,,,, C1000) contiennent la même formule que C1.
PS 2 : Est-il possible de choisir une heure pour l'envoi de ce mail ? (La cellule E1 peut contenir par exemple : 11:00)
Par avance, merci pour votre réponse.
Joyeuses fêtes de fin d'année.
Johann
Bonjour
merci pour ce snippet.
Je voudrais savoir si ce code est réutilisable, je veux dire point de vu licence.
Est-ce possible d'utiliser ce code pour un usage professionnel ? quel est la licence associée ?
mon objectif serait pour un usage non redistribuable (juste en interne à ma mission)
Merci pour le retour, et pour le code
(ça m'évite d'avoir à retaper la mien)
Bonjour Willy,
ce code est libre. Vous pouvez l'utiliser sans problème.
Bien à vous,
Martin
Bonjour,
Merci beaucoup pour ce tuto très complet et didactique.
Cdt
Nicolas
Bonjour,
J'ai utilisé ce code dans un de mes développements c'est parfait, ca tourne parfaitement depuis 1an.
J'ai comme un doute de fonctionnement avec la nouvelle version de Outlook actuellement disponible au 2023 05 15. il semblerai que Excel ne puissent plus ouvrir Outlook, ou que un pont est changé."Nous avons détecté un probléme lors du lancmeents du nouveau Outloock. veuillez réessayer plus tard."
Bonjour, selon vous quel est le meilleur logiciel pour envoyer une newsletter à une liste de contacts sur Excel ? Merci
Bonjour,
J'ai un petit soucis de syntaxe avec votre code.
J'ai copier / collé tout le code mais j'ai des lignes (29 – 44 – 75 et 79) qui apparaissent en rouge. Quand je lance le debogueur ça me marque "erreur de syntaxe".
Je remarque que ">" est sur toutes les lignes. avez vous une idée du problème ?
j'utilise EXCEL 2016 et 2019.
Merci pour ce travail
Cordialement
Bonjour Jérémy,
merci beaucoup pour cette remarque. J'ai récemment changé de module qui format les codes VBA sur mon site.
Et visiblement, il a transformé des charactères vers leurs équivalents HTML (par exemple
<
a été transformé en "<".Donc le problème n'était pas avec le code VBA mais avec son affichage sur le site.
Je viens de corriger ce bug et maintenant, tout devrait être de nouveau en ordre.
Un grand merci de l'avoir signalé. Martin
Bonjour et merci,
En cherchant sur le net j'ai trouvé sur un site anglais la correspondance.
Pour info :
< correspond à
≤ correspond à = (supérieur ou égal)
& correspond à &
Attention : il y a bien un point virgule (;) après les lettres.
Si ça peut aider quelqu'un.
Encore merci pour ce code et les autres ça m'aide beaucoup.
Bonjour,
Merci pour le code. Depuis mon passage à la nouvelle version d'outlook, la macro continue d'ouvrir la fenêtre de mail dans l'ancien Outlook. Et donc ne s'envoie pas tant que je n'ouvre pas l'ancienne version de Outlook.
Pouvez-vous nous indiquer comment modifier la macro ?
Merci
Bonjour,
Merci pour votre commentaire et pour avoir utilisé mon code VBA. D'après ce que vous décrivez, il semble que le problème soit lié à la façon dont mon script VBA interagit avec différentes versions d'Outlook sur votre ordinateur. Lorsque le script utilise les commandes
GetObject
ouCreateObject
pour créer une instance d'Outlook, il se connecte probablement par défaut à une ancienne version d'Outlook que vous avez installée.Voici quelques pistes de solution :
Désinstaller les Anciennes Versions d'Outlook : La manière la plus simple de résoudre ce problème pourrait être de désinstaller les anciennes versions d'Outlook de votre ordinateur. Ainsi, le script se connectera directement à la seule version disponible, qui serait la plus récente.
Modifier le Registre de Windows : Cette méthode est plus complexe et consiste à modifier les paramètres du registre de votre système pour définir la dernière version d'Outlook comme celle par défaut. Cependant, cette opération comporte des risques et n'est pas recommandée pour tous les utilisateurs, car une mauvaise manipulation peut affecter le fonctionnement de votre système.
Référence Directe à une Version Spécifique d'Outlook : Une autre solution serait de modifier le script pour qu'il crée un objet d'une version spécifique d'Outlook. Cela implique de connaître précisément quelle version d'Outlook vous utilisez, mais cela pourrait poser des problèmes de compatibilité avec d'autres utilisateurs ayant des versions différentes.
Je vous conseille de commencer par la première solution, qui est la plus simple. Si le problème persiste, il faudra envisager les autres options, plus complexes. N'hésitez pas à revenir vers moi si vous avez besoin d'assistance supplémentaire.
Cordialement, Martin
Bonjour, malheureusement les mails ne fonctionnent plus avec la nouvelle version d'outlook
version 1.2024.513.200 (Production).
Version du client est 20240517003.17 .
je suis à la recherche d'une mise à jour de cette macro mail
Merci
Bonjour,
effectivement, ces macros ne fonctionnent plus avec le "nouveau Outlook".
C'est dû tout simplement au fait que le "nouveau Outlook" ne supporte plus VBA.
Microsoft semble vouloir se tourner vers les technologies "web" comme le javascript etc.
Donc malheureusement, aucune mise-à-jour de ces macros ne résoudra ce problème…
Si vous souhaitez pouvoir utiliser VBA dans Outlook, il faut continuer à utiliser "l'ancienne version" de celui-ci.
Bonjour,
Merci pour ce tuto très utile.
Cependant, je n'arrive pas à changer l'adresse de l'expéditeur. Lorsque je sélectionne la macro et que je l'exécute, l'email s'envoie depuis mon adresse mail(email2) et non depuis celle que j'ai indiquée(email1).
J'ai pourtant recopié le code tel que vous l'avez rédigé ici.
Le problème vient-il de mon code où bien y a t il des paramètres à modifier au niveau de la boite mail de la personne expéditeur pour que le fichier soit autorisé à envoyer des emails en son nom ?
Voici mon code, si jamais vous pouviez m'aider à trouver d'où vient le problème, je vous en serais très reconnaissante. Etant en alternance, il faudrait que le mail puisse être envoyé depuis une autre adresse quand je quitterai l'entreprise. Merci d'avance !
Sub EmailRappelImpressionGNAO()
'test envoi de l'email sans pièce jointe
Call EnvoyerEmail("Rappel", "email2", "Imprimer le formulaire ", "email1")
End Sub
Sub EnvoyerEmail(ByVal Sujet As String, ByVal Destinataire As String, ByVal ContenuEmail As String, AdresseExpediteur As String)
On Error GoTo EnvoyerEmailErreur
'définition des variables
Dim oOutlook As Outlook.Application
Dim oMailItem As Outlook.MailItem
'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 Len(ContenuEmail) = 0 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 HTML (aussi par défaut)
.BodyFormat = olFormatHTML
.HTMLBody = "" & ContenuEmail & ""
'———————-
If AdresseExpediteur "" Then
Dim CompteOutlook As Outlook.Account
For Each CompteOutlook In oOutlook.Session.Accounts
If CompteOutlook.SmtpAddress = AdresseExpediteur Then ' <– modifiez l'adresse
.SendUsingAccount = CompteOutlook
Exit For
End If
Next CompteOutlook
Else
End If
.Save '<- sauvegarde l'email avant l'envoi (pour ne pas le sauvegarder, mettez cette ligne en commentaire)
.Send ' 0) Then 'si Outlook n'est pas ouvert, une instance est ouverte
Err.Clear
Set oOutlook = CreateObject("Outlook.Application")
If (Err.Number > 0) Then
MsgBox "Une erreur est survenue lors de l'ouverture de Outlook…"
Exit Sub
Else
End If
Else 'si Outlook est ouvert, l'instance existante est utilisée
End If
End Sub