Microsoft 365 Intégrer une image au milieu d'un mail créé via Excel VBA

chubart

XLDnaute Nouveau
Bonjour
Malgré plusieurs recherches dans ce sujet je n'arrive pas à trouver la solution pour ce qui me concerne.
J'ai créé un mail via Excel vba et je n'arrive pas à intégrer une image située sur mon disque dur. Etant donné que cette image doit arriver au milieu de mon texte, j'ai créé 2 strbody que je reprends ensuite dans mon HTMLbody en y intercalant mon image (est-ce indispensable ?) mais, rien à faire, l'image y est mais elle est vide. Problème de chemin ?
Quelqu'un pour me montrer où est l'erreur ?
MERCI !

Voici ma macro
1729169570922.png


et voici le résultat :
1729169614197.png
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Chulard,
Un petit fichier aurait été plus utile que des photos. Ensuite pour le code vous pouvez l'insérer directement avec la balise </> à droite de l'icone GIF.
Ensuite regardez cette discussion sur XLD :
 

chubart

XLDnaute Nouveau
Bonjour
c'est tout simplement normal
tu n'ajoute pas ton image en pièce jointe le mail ne risque pas de l'afficher
avant le .display
met ceci
.Attachments.Add NomImage
et enlève moi le "cid:"
Bon, j'ai ajouté .Attachments.Add NomImage et enlevé le "cid:"
Résultat : j'ai l'image en pièce jointe mais pas dans le corps du mail. Qu'ai-je encore fait de travers ? :)
1729185184779.png
 

chubart

XLDnaute Nouveau
Bonjour Chulard,
Un petit fichier aurait été plus utile que des photos. Ensuite pour le code vous pouvez l'insérer directement avec la balise </> à droite de l'icone GIF.
Ensuite regardez cette discussion sur XLD :
Heu, désolée mais je ne comprends pas. Je suis béotienne sans doute mais quelle icône GIF ?
 

chubart

XLDnaute Nouveau
Ok je crois avoir compris :)
Voici mon code :

Code:
Sub envoimail3()

  Dim OutApp As Outlook.Application
    Dim OutMail As Outlook.MailItem
    Dim OutAccount As Outlook.Account
    Dim Chemin$, NomImage$
    Dim strbody As String
    Dim strbody2 As String
'    Chemin = "C:\Users\Chantal\Dropbox\IMHEB\image base.jpg"
'    NomImage = Mid(Chemin, InStrRev(Chemin, "\") + 1) 'nom du fichier image sans le chemin complet
    NomImage = "C:\Users\Chantal\Dropbox\IMHEB\image base.jpg"
For Ligne = 6 To 30
    If Not Range("a" & Ligne) = "" Then

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(olMailItem)
    Set OutAccount = OutApp.Session.accounts.Item(3)

    strbody = "Première partie du texte" & "<br><br>"

    strbody2 = "Deuxième partie du texte" & "<br><br>" & "Bien à vous"
    
    With OutMail
        .SendUsingAccount = OutAccount
        .To = "test@gmail.com"
        .Subject = Range("a" & Ligne) & " Confirmation d'inscription et facture"

        .HTMLBody = strbody & Chr(10) & "<img src='" & NomImage & "' & width='600' height='300'><br><br> " & strbody2 & Chr(10) & .HTMLBody 'image n'apparaît pas
        .Attachments.Add NomImage
        .Display
    End With
    On Error GoTo 0


Else: Exit For
End If

Next Ligne
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
pense a travailler en late binding on a tous des versions d'excel différente de 2007 à 2024
et les versions d'outlook ne sont pas les mêmes
on créé donc les objects en late binding bna se charge de prendre la bonne référence
VB:
Sub envoimail3()
    Dim OutApp As Object, OutMail As Object, OutAccount As Object, Chemin$, NomImage$, strbody$, strbody2$

    'l 'un ou l'autre de chemin
    'Chemin = "C:\Users\Chantal\Dropbox\IMHEB\image base.jpg"
    'ou
    Chemin = "C:\Users\Chantal\Dropbox\IMHEB\image base.jpg"
    
    'l'image nas le body c'est juste le nom de l'image car dans le mail on l'address par son nom
    'pas le path de ton disque dur ou dropbox
    NomImage = Mid(Chemin, InStrRev(Chemin, "\") + 1) 'nom du fichier image sans le chemin complet

    'on ne crée qu'une seule instance de l'application outlook
    Set OutApp = CreateObject("Outlook.Application")


    For Ligne = 6 To 30
        If Not Range("a" & Ligne) = "" Then

            Set OutMail = OutApp.CreateItem(olMailItem) 'création de l'instance(ligne) du mail
            
            Set OutAccount = OutApp.Session.accounts.Item(3)

            strbody = "Première partie du texte" & "<br><br>" 'blablabla

            strbody2 = "Deuxième partie du texte" & "<br><br>" & "Bien à vous" 'blablabla

            With OutMail
                .SendUsingAccount = OutAccount
                .To = "test@gmail.com"
                .Subject = Range("a" & Ligne) & " Confirmation d'inscription et facture"
                .HTMLBody = strbody & Chr(10) & "<img src='" & NomImage & "' & width='600' height='300'><br><br> " & strbody2 & Chr(10) & .HTMLBody 'image n'apparaît pas
                .Attachments.Add Chemin 'c'est le chemin complet de l'image pour l'attachement
                .Display
            End With
            On Error GoTo 0
            Else: Exit For
        End If
    Next Ligne
End Sub
patrick ;)
 

chubart

XLDnaute Nouveau
re
pense a travailler en late binding on a tous des versions d'excel différente de 2007 à 2024
et les versions d'outlook ne sont pas les mêmes
on créé donc les objects en late binding bna se charge de prendre la bonne référence
VB:
Sub envoimail3()
    Dim OutApp As Object, OutMail As Object, OutAccount As Object, Chemin$, NomImage$, strbody$, strbody2$

    'l 'un ou l'autre de chemin
    'Chemin = "C:\Users\Chantal\Dropbox\IMHEB\image base.jpg"
    'ou
    Chemin = "C:\Users\Chantal\Dropbox\IMHEB\image base.jpg"
  
    'l'image nas le body c'est juste le nom de l'image car dans le mail on l'address par son nom
    'pas le path de ton disque dur ou dropbox
    NomImage = Mid(Chemin, InStrRev(Chemin, "\") + 1) 'nom du fichier image sans le chemin complet

    'on ne crée qu'une seule instance de l'application outlook
    Set OutApp = CreateObject("Outlook.Application")


    For Ligne = 6 To 30
        If Not Range("a" & Ligne) = "" Then

            Set OutMail = OutApp.CreateItem(olMailItem) 'création de l'instance(ligne) du mail
          
            Set OutAccount = OutApp.Session.accounts.Item(3)

            strbody = "Première partie du texte" & "<br><br>" 'blablabla

            strbody2 = "Deuxième partie du texte" & "<br><br>" & "Bien à vous" 'blablabla

            With OutMail
                .SendUsingAccount = OutAccount
                .To = "test@gmail.com"
                .Subject = Range("a" & Ligne) & " Confirmation d'inscription et facture"
                .HTMLBody = strbody & Chr(10) & "<img src='" & NomImage & "' & width='600' height='300'><br><br> " & strbody2 & Chr(10) & .HTMLBody 'image n'apparaît pas
                .Attachments.Add Chemin 'c'est le chemin complet de l'image pour l'attachement
                .Display
            End With
            On Error GoTo 0
            Else: Exit For
        End If
    Next Ligne
End Sub
patrick ;)
HA HA HA HA Bon sang mais c'est bien sûr, en Late binding !!! Comment n'y avais-je pas pensé plus tôt ? HA HA HA. Au fait, ça veut dire quoi late binding ? 🤣
Blague à part, je viens de trouver la source du problème : tout était ok sauf le nom de mon fichier image qui comportait un espace ! J'ai changé ça et tout roule.
En tout cas merci à toi Patrick et à Sylvanu pour m'avoir aidée. Je n'y serais pas arrivée sans vous pour ce qui est des appels à l'image. Merci encore.
Chantal
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @chubart
ravi pour toi
early binding
VB:
Dim OutApp As Outlook.Application
    Dim OutMail As Outlook.MailItem
cela implique l'obligation d'avoir les référence a ces objects activées
par exemple ici chez moi c'est la ( version 15)
le probleme si j'active cette référence
et que demain je teste le fichier sur un autre pc avec une version plus récente ou ancienne de office ben la ref c'est pas la même (par exemple chez toi c'est probablement la (16)
1729337841516.png



maintenant si je travaille en late binding(déclaration tardive)
Code:
dim outapp AS object
Dim OutMail As object
set outapp=createobject("outlook.application")
Set OutMail = OutApp.CreateItem(0)

le code va me créer les object avec les références disponibles sur la bécanne sur la quelle il s’exécute
tout simplement

voilou ;)
 

Discussions similaires

Statistiques des forums

Discussions
315 126
Messages
2 116 493
Membres
112 763
dernier inscrit
issam2020