XL 2010 Macro envoi mail automatique sur Outlook avec doc dans le corps du mail

nicoevents

XLDnaute Nouveau
Bonjour à tous,

existe il la possibilité d'automatiser l'envoi d'un mail (en ayant défini au préalable une liste de destinataire dans une feuille) avec dans le corps du mail une selection de la feuille mais également en complément que cette zone de la feuille génère un PDF. Petit fichier en pj

merci beaucoup
 

Pièces jointes

  • Classeur1.xlsx
    10 KB · Affichages: 25

patricktoulon

XLDnaute Barbatruc
Bonjour
ben là je vois plus alors
j'ai lu un article en cherchant un peu qu'il y avait des soucis avec 365
avec outlook security et qu'une modif dans le registre était nécessaire pour certains
et pour être honnête chez moi 2013 au bout de 10 message d'affilé l'image de la plage se retrouve en tète de message
d'ou la raison pour la quelle je me sert de CDO ;)
 

patricktoulon

XLDnaute Barbatruc
re
bon j'ai cherché un peu
et en effet le post processing n'est plus automatique comme avant visiblement
voici donc 2 version (late binding /early binding
adapte le destinataire et la plage a envoyer dans le body
early binding (activer Obligatoirement la référence Microsoft.outlook XX library) chez moi 2013 xx= 15

version early binding

VB:
'-------------------------------------
'patricktoulon
'date: 03/06/2021
'outlook en early binding
'activer la reference "Microsoft.outlook XX library "
'-------------------------------------
Sub test()
    Dim oApp As Outlook.Application, oEmail As MailItem, colAttach As Outlook.Attachments
    Dim oAttach As Outlook.Attachment, plage As Range, NomImage$, olkPA As Outlook.PropertyAccessor
    Dim Destinataire$, CC$, Titre$
    Const PR_ATTACH_CONTENT_ID = "http://schemas.microsoft.com/mapi/proptag/0x3712001F"


    'noms des fichiers
    NomImage = ThisWorkbook.Path & "\imgTemp.gif": If Dir(NomImage) <> "" Then Kill (NomImage)    ' ne pas toucher ça
    NomPdf = ThisWorkbook.Path & "\pdfTemp.pdf": If Dir(NomPdf) <> "" Then Kill (NomPdf)   ' adapter le chemin du fichier pdf


    Set plage = Feuil1.[A1:c10]    ' plage à envoyer dans le corps du mail
    '------------------------------
    'exportation des fichiers temporaires
    'création du pdf avec la plage
    plage.ExportAsFixedFormat Type:=xlTypePDF, Filename:=NomPdf, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
    'creation de la capture de la plage en image
    imG = ExportRangeInImage(plage, NomImage)
    If imG = "" Then MsgBox "la copie de la plage en image n'a pas pu etre effectué": Exit Sub


    'élements du mail
    Titre = "test de mail outlook VBA early binding"    'titre du message

    Destinataire = "toto@hotmail.fr"    'destinataire(s) du message( si plusieurs les séparer par une virgule)

    CC = ""    ' accusé reception
    +
    'texte que tu veux avant la plage dans le mail(facultatif)
    paragraph1 = "envoyé à " & Time & vbCrLf & "Bonjour Mr le directeur " & vbCrLf & "veuillez trouver ci joint  le tableau des ventes de concombres"
    paragraph1 = paragraph1 & vbCrLf & " il resume les ventes du mois "

    'texte que tu veux apres la plage dans le mail(facultatif)
    paragraph2 = " vous souhaitant bonne réception" & vbCrLf & "restant a votre disposition pour tout renseignement"
    paragraph2 = paragraph2 & vbCrLf & " votre dévoué serviteur  <font face=algerian color=red>le Concombre masqué</font>"

    'création du code html du body apec les paragraphes et l'image de la plage
    xHTMLBody = "<BODY>" & Replace(paragraph1, vbCrLf, "<br>") & "<br><br>" & _
                "<center><img src=""cid:imgTemp.gif""></center><br><br>" & _
                Replace(paragraph2, vbCrLf, "<br>")
    xHTMLBody = xHTMLBody & "</BODY>"
    '----------------------------


    'création du mail
    Set oApp = CreateObject("Outlook.Application")
    Set oEmail = oApp.CreateItem(olMailItem)
    Set colAttach = oEmail.Attachments
    Set oAttach = colAttach.Add(NomImage)
    Set olkPA = oAttach.PropertyAccessor
    olkPA.SetProperty PR_ATTACH_CONTENT_ID, "imgTemp.gif"

    oEmail.To = Destinataire
    oEmail.Subject = Titre
    oEmail.CC = CC   ' accusé
    oEmail.Attachments.Add NomPdf    ' on attache le pdf de façon classique
    oEmail.HTMLBody = xHTMLBody
    'oEmail.Display
    oEmail.Send

    Set oEmail = Nothing
    Set colAttach = Nothing
    Set oAttach = Nothing
    Set oApp = Nothing
End Sub

Private Function ExportRangeInImage(plage As Range, CheminX As String)
'export plage en gif patricktoulon sur exceldownloads
    Dim chart1 As Object
    If Dir(CheminX) <> "" Then Kill CheminX
    With CreateObject("htmlfile").parentwindow.clipboardData.clearData("Text"): End With    'on vide le clipboard entre chaque copie pour tester vraiment le available
    plage.CopyPicture
    Set chart1 = plage.Parent.ChartObjects.Add(0, 0, 0, 0).Chart
    With chart1
        With .Parent: .Width = plage.Width: .Height = plage.Height: .Left = plage.Width + 20:
            .Parent.Shapes(.Name).Line.Visible = False
            Do: .Chart.Paste: DoEvents: Loop While .Chart.Pictures.Count = 0
            .Chart.Export CheminX, "gif"
        End With
        .Parent.Delete
    End With
    ExportRangeInImage = Dir(CheminX)
End Function

Version late binding sans références activées
VB:
'-------------------------------------
'patricktoulon
'date: 03/06/2021
'outlook en late binding
'PAS DE REFERENCE A ACTIVER
'-------------------------------------
Option Explicit
Sub test4()
    Dim oApp As Object, oEmail As Object, colAttach As Object, oAttach As Object, plage As Range, olkPA As Object
    Dim Destinataire$, CC$, Titre$, NomPdf$, NomImage$, imG$, paragraph1$, paragraph2$, xHTMLBody$
    Const PR_ATTACH_CONTENT_ID = "http://schemas.microsoft.com/mapi/proptag/0x3712001F"

    Set plage = Feuil1.[A1:c10]    ' plage à envoyer dans le corps du mail

    NomImage = ThisWorkbook.Path & "\imgTemp.gif": If Dir(NomImage) <> "" Then Kill (NomImage)    ' ne pas toucher ça
    NomPdf = ThisWorkbook.Path & "\pdfTemp.pdf": If Dir(NomPdf) <> "" Then Kill (NomPdf)   ' adapter le chemin du fichier pdf

    '------------------------------
    'exportation des fichiers temporaires
    'création du pdf avec la plage
    plage.ExportAsFixedFormat Type:=xlTypePDF, Filename:=NomPdf, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

    'creation de la capture de la plage en image
    imG = ExportRangeInImage(plage, NomImage)
    If imG = "" Then MsgBox "la copie de la plage en image n'a pas pu etre effectué": Exit Sub
    '----------------------------

    'élements du mail
    Titre = "test de mail outlook VBA shema late binding"    'titre du message

    Destinataire = "toto@hotmail.fr"    'destinataire(s) du message( si plusieurs séparer  les par une virgule)

    CC = ""    ' accusé reception

    'texte que tu veux avant la plage dans le mail(facultatif)
    paragraph1 = "envoyé à " & Time & vbCrLf & "Bonjour Mr le directeur " & vbCrLf & "veuillez trouver ci joint  le tableau des ventes de concombres"
    paragraph1 = paragraph1 & vbCrLf & " il resume les ventes du mois "

    'texte que tu veux apres la plage dans le mail(facultatif)
    paragraph2 = " vous souhaitant bonne réception" & vbCrLf & "restant a votre disposition pour tout renseignement"
    paragraph2 = paragraph2 & vbCrLf & " votre dévoué serviteur  <font face=algerian color=red>le Concombre masqué</font>"

    'création du code html du body apec les paragraphes et l'image de la plage
    xHTMLBody = "<BODY>" & Replace(paragraph1, vbCrLf, "<br>") & "<br><br>" & _
                "<center><img src=""cid:imgTemp.gif""></center><br><br>" & _
                Replace(paragraph2, vbCrLf, "<br>")
    xHTMLBody = xHTMLBody & "</BODY>"
    '----------------------------

    ''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
    '----------------------------------------------------------------------

    oEmail.HTMLBody = xHTMLBody    ' insertion du code html dans le body du mail

    oEmail.To = Destinataire
    oEmail.Subject = Titre
    oEmail.CC = CC   ' accusé
    oEmail.Attachments.Add NomPdf    ' on attache le pdf de façon classique
    'oEmail.Display
    oEmail.Send

    ' vide les variable
    Set oEmail = Nothing
    Set colAttach = Nothing
    Set oAttach = Nothing
    Set oApp = Nothing
End Sub

Private Function ExportRangeInImage(plage As Range, CheminX As String)
'export plage en gif patricktoulon sur exceldownloads
    Dim chart1 As Object
    If Dir(CheminX) <> "" Then Kill CheminX
    With CreateObject("htmlfile").parentwindow.clipboardData.clearData("Text"): End With    'on vide le clipboard entre chaque copie pour tester vraiment le available
    plage.CopyPicture
    Set chart1 = plage.Parent.ChartObjects.Add(0, 0, 0, 0).Chart
    With chart1
        With .Parent: .Width = plage.Width: .Height = plage.Height: .Left = plage.Width + 20:
            .Parent.Shapes(.Name).Line.Visible = False
            Do: .Chart.Paste: DoEvents: Loop While .Chart.Pictures.Count = 0
            .Chart.Export CheminX, "gif"
        End With
        .Parent.Delete
    End With
    ExportRangeInImage = Dir(CheminX)
End Function
Résultat dans l'app web outlook
1622711052360.png


après ça je peux plus rien pour toi ;)
 
Dernière édition:

nicoevents

XLDnaute Nouveau
Re
il me met : Variable non défini pour : olMailItem

avec la version late Binding. Je 'ai pas testé l'autre car j'ai pas compris "activer Obligatoirement la référence Microsoft.outlook XX library) chez moi 2013 xx= 15"

j'avoue je percute plus grand chose : mon niveau 'a laché.

Merci PAtrick en tout cas
 

gothc

XLDnaute Occasionnel
bonjour Patrick bonjour le forum
j'ai un problème avec mon Outlook après l'exécution de ta macro j'ai mon Outlook qui reste bloquer en fermeture
je suis obligé de fermer Outlook dans le gestionnaire de tache voir fichier joint
je sais pas si tu connais le problème
j'ai une macro qui laisse ouvert Outlook après l'envoi la aucun problème je ferme le programme Outlook manuellement après l'exécution .
 

Pièces jointes

  • patrick.jpg
    patrick.jpg
    178.3 KB · Affichages: 13
C

Compte Supprimé 979

Guest
bonjour Patrick bonjour le forum
j'ai un problème avec mon Outlook après l'exécution de ta macro j'ai mon Outlook qui reste bloquer en fermeture
je suis obligé de fermer Outlook dans le gestionnaire de tache voir fichier joint
je sais pas si tu connais le problème
j'ai une macro qui laisse ouvert Outlook après l'envoi la aucun problème je ferme le programme Outlook manuellement après l'exécution .
Bonjour gothc

Quel code, celui en "late" ou en "Early" bindig ?

@+
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @gothc ,@BrunoM45
peut être par ce que j'ai (un peu/ beaucoup /énormément) oublié de faire un ".quit' de l'object oapp
🤪 ;)

par contre j'aimerais bien savoir si ça fonctionne chez vous et quelle version vous utilisez pour orienter mes recherches pour @nicoevents bien que je pense qu'il a un peu /beaucoup/énormément baissé les bras ;)
en fin de sub
VB:
  'oEmail.Display
    oEmail.Send
oApp.Quit
    ' vide les variable
    Set oEmail = Nothing
    Set colAttach = Nothing
    Set oAttach = Nothing
    Set oApp = Nothing
 
Dernière édition:

Discussions similaires

Réponses
16
Affichages
538
Réponses
2
Affichages
267
Réponses
15
Affichages
2 K

Statistiques des forums

Discussions
312 310
Messages
2 087 119
Membres
103 478
dernier inscrit
Frederic Lagger