'-------------------------------------
'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 = "toto2@outlook.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