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

danielco

XLDnaute Accro
Bonjour,

Essaie comme ça en entrant le chemin et le nom à donner au fichier pdf dans la variable NOM

VB:
Sub Mail()
  Dim NOM As String, Plage As Range
  NOM = "c:\tess\blabla.pdf"
  Feuil1.Select
  Set Plage = Range("F5:G18")
  ActiveWorkbook.EnvelopeVisible = True
    Plage.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
      "NOM", Quality:=xlQualityStandard, _
      IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
      False
  With Plage
    With .Parent.MailEnvelope.Item
      .To = "XXX"
      .attachments.Add NOM
      .Send
    End With
  End With
End Sub

Daniel
 

danielco

XLDnaute Accro
Oups. Pour les destinataires :

Code:
Sub Mail()
  Dim NOM As String, Plage As Range, C As Range
  NOM = "c:\tess\blabla.pdf"
  Feuil1.Select
  Set Plage = Range("F5:G18")
  ActiveWorkbook.EnvelopeVisible = True
    Plage.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
      "NOM", Quality:=xlQualityStandard, _
      IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
      False
  With Plage
    With .Parent.MailEnvelope.Item
      For Each C In Range("A4", Cells(Rows.Count, 1).End(xlUp))
        .Recipients.Add C.Value
      Next C
      .attachments.Add NOM
     ' .display
      .Send
    End With
  End With
End Sub

Daniel
 

patricktoulon

XLDnaute Barbatruc
Bonjour
sinon a l'ancienne on passe par créateobject("outlook.application")
ca marche tres bien aussi et compatible toute version ;)
VB:
Sub sendMail()
    Dim NomImage$, NomPdf, xOutApp As Object, xOutMail As Object, xHTMLBody As String, plage As Range, paragraph1$, paragraph2, Titre$
    'nom des fichiers necessaires
    NomImage = ThisWorkbook.Path & "\imgTemp.gif"    ' ne pas toucher ça
    NomPdf = ThisWorkbook.Path & "\pdfTemp.pdf"    ' adapter le nom du fichier
    If Dir(NomPdf) <> "" Then Kill (NomPdf)

    'titre du message
    Titre = "test de mail outlookVBA"
    'texte que tu veux avant l'image
    paragraph1 = "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 l'image
    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>"

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

    '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 = False Then MsgBox "la copie de la plage en image n'a pas pu etre effectué": Exit Sub



    ' creation du mail outlook
    Set xOutApp = CreateObject("outlook.application")
    Set xOutMail = xOutApp.CreateItem(olMailItem)
    'création du body en html
    xHTMLBody = Replace(paragraph1, vbCrLf, "<br>") & "<br><br>" & _
    "<center><img src='cid:imgTemp.gif'></center><br><br>" & _
    Replace(paragraph2, vbCrLf, "<br>")

    'instrumentation
    With xOutMail
        .Subject = Titre    'titre du message
        .HTMLBody = xHTMLBody    'corps du mail avec insertion de la plage en image entre les deux paragraph
        .Attachments.Add NomImage, olByValue    ' on attache l'image de la plage
        .Attachments.Add NomPdf, olByValue    ' on attache le pdf
        .To = "Toto@gmail.com"    'destinataire
        .Cc = " "   ' accusé
        .Display    ' soit on affiche l'application outlook
        '.send      ' soit on envoie direct
    End With
    'on peut supprimer le pdf temporaire et l'image temporaire de la plage
    If Dir(NomImage) <> "" Then Kill NomImage
    If Dir(NomPdf) <> "" Then Kill NomPdf

End Sub
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:
            Do: .Chart.Paste: DoEvents: Loop While .Chart.Pictures.Count = 0
            .Chart.Export CheminX, "gif"
        End With
    End With
    chart1.Parent.Delete
    ExportRangeInImage = Dir(CheminX)
End Function
apercu avec ".display"
1622455404070.png
 

patricktoulon

XLDnaute Barbatruc
re
j'avais fait quelque erreurs
le voila remanié avec un peu plus d'ergonomie
reste plus qu'a modifier les variables
testé sur 2007 2013 2016
VB:
Sub sendMail()
    Dim NomImage$, NomPdf, xOutApp As Object, xOutMail As Object, xHTMLBody As String, plage As Range
    Dim Destinataire$, CC$, Titre$, paragraph1$, paragraph2$
    'nom des fichiers necessaires
    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"    'titre du message

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

    CC = ""    ' accusé reception

    'texte que tu veux avantla plage dans le mail
    paragraph1 = "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
    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>"

    '-----------------------------
    ' creation du mail outlook
    Set xOutApp = CreateObject("outlook.application")
    Set xOutMail = xOutApp.CreateItem(olMailItem)
    'création du code en html avec les éléments
    xHTMLBody = Replace(paragraph1, vbCrLf, "<br>") & "<br><br>" & _
                "<center><img src='imgTemp.gif'></center><br><br>" & _
                Replace(paragraph2, vbCrLf, "<br>")

    'application dans outlook
    With xOutMail
        .Subject = Titre    'titre du message
        .HTMLBody = xHTMLBody    'corps du mail avec insertion de la plage en image entre les deux paragraph
        .Attachments.Add NomPdf    ' on attache le pdf
        .Attachments.Add NomImage    ', olByValue, 0   ' on attache l'image de la plage
        .To = Destinataire    'destinataire
        .CC = CC   ' accusé
        .display    ' soit on affiche l'application outlook
        '.send      ' soit on envoie direct
    End With
    'on peut supprimer le pdf temporaire et l'image temporaire de la plage
    ' If Dir(NomImage) <> "" Then Kill NomImage' à débloquer si mode ".send"
    'If Dir(NomPdf) <> "" Then Kill NomPdf' à débloquer si mode ".send"

End Sub
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:
            Do: .Chart.Paste: DoEvents: Loop While .Chart.Pictures.Count = 0
            .Chart.Export CheminX, "gif"
        End With
    End With
    chart1.Parent.Delete
    ExportRangeInImage = Dir(CheminX)
End Function
mille excuses pour les erreurs ;)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour
il faut m'en donner un peu plus sur ton contexte car en l'état il n'y a aucune raison de provoquer une erreur 1004 sur l'ajout d'un graph
donne moi tout ton code voir un fichier anonymisé ferait l'affaire
a mon avis tu t'es planté sur ton adaptation ;)
 

patricktoulon

XLDnaute Barbatruc
re
change le mot de passe si tu en a un en fin de sub
VB:
Sub sendMail()
    Dim NomImage$, NomPdf, xOutApp As Object, xOutMail As Object, xHTMLBody As String, plage As Range
    Dim Destinataire$, CC$, Titre$, paragraph1$, paragraph2$
    'nom des fichiers necessaires
    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
    plage.Parent.Unprotect
    '------------------------------
    '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"    'titre du message

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

    CC = ""    ' accusé reception

    'texte que tu veux avantla plage dans le mail
    paragraph1 = "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
    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>"

    '-----------------------------
    ' creation du mail outlook
    Set xOutApp = CreateObject("outlook.application")
    Set xOutMail = xOutApp.CreateItem(olMailItem)
    'création du code en html avec les éléments
    xHTMLBody = Replace(paragraph1, vbCrLf, "<br>") & "<br><br>" & _
                "<center><img src='imgTemp.gif'></center><br><br>" & _
                Replace(paragraph2, vbCrLf, "<br>")

    'application dans outlook
    With xOutMail
        .Subject = Titre    'titre du message
        .HTMLBody = xHTMLBody    'corps du mail avec insertion de la plage en image entre les deux paragraph
        .Attachments.Add NomPdf    ' on attache le pdf
        .Attachments.Add NomImage    ', olByValue, 0   ' on attache l'image de la plage
        .To = Destinataire    'destinataire
        .CC = CC   ' accusé
        .display    ' soit on affiche l'application outlook
        '.send      ' soit on envoie direct
    End With
    'on peut supprimer le pdf temporaire et l'image temporaire de la plage
    ' If Dir(NomImage) <> "" Then Kill NomImage' à débloquer si mode ".send"
    'If Dir(NomPdf) <> "" Then Kill NomPdf' à débloquer si mode ".send"
    plage.Parent.Protect "toto"' met ton bon mot de passe ici  a la place de "toto"!!!!!!!!!!!!!!
End Sub
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:
            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
 

Discussions similaires

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

Statistiques des forums

Discussions
312 307
Messages
2 087 097
Membres
103 468
dernier inscrit
TRINITY