VBA - Envoyer plusieurs plages de cellules dans le corps d'un email
Bonjour au forum,
Je suis intéressé par ce code trouvé sur le site developpez mais je n'arrive pas à l'adapter à mon cas :
J'aimerais pouvoir insérer 3 plages de cellules (oRange1, oRange2, oRange3), et non juste une seule.
Les emails seront envoyés via Outlook.
Sauriez-vous comment adapter ?
Option Explicit
'-----------------------------------------------------------------------
'
' Lit le contenu d'un fichier texte et retourne son
' contenu
'
'-----------------------------------------------------------------------
Public Function ReadFile(sFileName) As String
Dim fso As Object, fFile As Object
Dim sTemp As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set fFile = fso.OpenTextFile(sFileName, 1, False)
sTemp = fFile.ReadAll
fFile.Close
Set fFile = Nothing
ReadFile = sTemp
End Function
'-----------------------------------------------------------------------'
' Cette routine va créer une instance de Outlook (si
' pas encore démarré) et va ensuite ouvrir une
' fenêtre de type mail. Le corps du message sera
' initialisé avec le contenu d'un fichier de type
' HTML. Ce fichier aura été préalablement
' créé par la routine SendRangeByMail
'
' Nécessite l'ajout d'une référence vers "Microsoft
' Outlook Object Library"
'
'-----------------------------------------------------------------------
Sub PrepareOutlookMail(ByVal sFileName As String)
Dim appOutlook As Outlook.Application
Dim oMail As Outlook.MailItem
Set appOutlook = CreateObject("Outlook.Application")
' Si Outlook n'était pas ouvert, l'instruction
' ci-dessus aura eu pour conséquence de
' démarrer Outlook.
'Ce type de démarrage par automation fait
'apparaître une fenêtre de sécurité qui demande
'à l'utilisateur de permettre au programme de
'continuer.
'
'Le message est "A program is trying to send an
'email. Do you want to allow..."
'
'Dans le cas où l'utilisateur aurait cliqué sur No,
'l'objet appOutlook est égal à Nothing. Il est
'donc impossible de continuer.
If Not (appOutlook Is Nothing) Then
Set oMail = appOutlook.CreateItem(olMailItem)
oMail.HTMLBody = ReadFile(sFileName)
oMail.Display
Set oMail = Nothing
Set appOutlook = Nothing
End If
End Sub
'-----------------------------------------------------------------------
'
' La routine SendRangeByMail va proposer à
' l'utilisateur de sélectionner une plage de cellules
' en Excel et va ensuite envoyer cette plage par
' mail, dans le corps du mail.
'
'-----------------------------------------------------------------------
Sub SendRangeByMail()
Dim oRange1 As Range
With Application
On Error Resume Next
' Demande à l'utilisateur de sélectionner la
' plage de cellule
Set oRange1 = Sheets("Tableau de bord").Range("Stock")
'Set oRange2 = Sheets("Tableau de bord").Range("Alerte")
'Set oRange3 = Sheets("Tableau de bord").Range("Tendance")
' oRange1 Is Nothing lorsque l'utilisateur ne fait
' aucun choix
If oRange1 Is Nothing Then Exit Sub
'If oRange2 Is Nothing Then Exit Sub
'If oRange3 Is Nothing Then Exit Sub
On Error GoTo 0
' Exporte la plage vers un fichier de type HTML;
' ceci afin de respecter la mise en page de la
' plage
.ActiveWorkbook.PublishObjects.Add(4, "C:\Temp\XLRange1.htm", oRange1.Parent.Name, oRange1.Address, 0, "", "").Publish True
'.ActiveWorkbook.PublishObjects.Add(4, "C:\Temp\XLRange2.htm", oRange2.Parent.Name, oRange2.Address, 0, "", "").Publish True
'.ActiveWorkbook.PublishObjects.Add(4, "C:\Temp\XLRange3.htm", oRange3.Parent.Name, oRange3.Address, 0, "", "").Publish True
' Appelle la routine qui va se charger de créer
' un mail
Call PrepareOutlookMail("C:\Temp\XLRange1.htm")
' Le fichier HTML n'est plus nécessaire
Kill "C:\Temp\XLRange1.htm"
End With ' With Application
End Sub
Merci d'avance,
J'ai essayé d'adapter selon mes besoins, ça fonctionne, mais je ne suis pas sûr que ce soit la meiileure façon de faire... :
Option Explicit
'-----------------------------------------------------------------------
'
' Lit le contenu d'un fichier texte et retourne son
' contenu
'
'-----------------------------------------------------------------------
Public Function ReadFile1(sFileName1) As String
Dim fso As Object, fFile1 As Object
Dim sTemp1 As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set fFile1 = fso.OpenTextFile(sFileName1, 1, False)
sTemp1 = fFile1.ReadAll
fFile1.Close
Set fFile1 = Nothing
ReadFile1 = sTemp1
End Function
Public Function ReadFile2(sFileName2) As String
Dim fso As Object, fFile2 As Object
Dim sTemp2 As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set fFile2 = fso.OpenTextFile(sFileName2, 1, False)
sTemp2 = fFile2.ReadAll
fFile2.Close
Set fFile2 = Nothing
ReadFile2 = sTemp2
End Function
Public Function ReadFile3(sFileName3) As String
Dim fso As Object, fFile3 As Object
Dim sTemp3 As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set fFile3 = fso.OpenTextFile(sFileName3, 1, False)
sTemp3 = fFile3.ReadAll
fFile3.Close
Set fFile3 = Nothing
ReadFile3 = sTemp3
End Function
'-----------------------------------------------------------------------'
' Cette routine va créer une instance de Outlook (si
' pas encore démarré) et va ensuite ouvrir une
' fenêtre de type mail. Le corps du message sera
' initialisé avec le contenu d'un fichier de type
' HTML. Ce fichier aura été préalablement
' créé par la routine SendRangeByMail
'
' Nécessite l'ajout d'une référence vers "Microsoft
' Outlook Object Library"
'
'-----------------------------------------------------------------------
Sub PrepareOutlookMail(ByVal sFileName1 As String, sFileName2 As String, sFileName3 As String)
Dim appOutlook As Outlook.Application
Dim oMail As Outlook.MailItem
Set appOutlook = CreateObject("Outlook.Application")
' Si Outlook n'était pas ouvert, l'instruction
' ci-dessus aura eu pour conséquence de
' démarrer Outlook.
'Ce type de démarrage par automation fait
'apparaître une fenêtre de sécurité qui demande
'à l'utilisateur de permettre au programme de
'continuer.
'
'Le message est "A program is trying to send an
'email. Do you want to allow..."
'
'Dans le cas où l'utilisateur aurait cliqué sur No,
'l'objet appOutlook est égal à Nothing. Il est
'donc impossible de continuer.
If Not (appOutlook Is Nothing) Then
Set oMail = appOutlook.CreateItem(olMailItem)
oMail.HTMLBody = "<BODY><FONT face=Arial color=#000080 size=2></FONT>" & _
"Bonjour, <br><br> Veuillez trouver ci-joint un récapitulatif de blablabla au " _
& Date & " à " & Time & " (blablabla) : <br><br> " & ReadFile1(sFileName1) & "<br><br> " & ReadFile2(sFileName2) & " <br><br> " & ReadFile3(sFileName3) & " <br><br> Cordialement</BODY>"
oMail.Display
Set oMail = Nothing
Set appOutlook = Nothing
End If
End Sub
'-----------------------------------------------------------------------
'
' La routine SendRangeByMail va proposer à
' l'utilisateur de sélectionner une plage de cellules
' en Excel et va ensuite envoyer cette plage par
' mail, dans le corps du mail.
'
'-----------------------------------------------------------------------
Sub SendRangeByMail()
Dim oRange1 As Range
Dim oRange2 As Range
Dim oRange3 As Range
With Application
On Error Resume Next
' Demande à l'utilisateur de sélectionner la
' plage de cellule
Set oRange1 = Sheets("Tableau de bord").Range("Stock")
Set oRange2 = Sheets("Tableau de bord").Range("Alerte")
Set oRange3 = Sheets("Tableau de bord").Range("Tendance")
' oRange1 Is Nothing lorsque l'utilisateur ne fait
' aucun choix
If oRange1 Is Nothing Then Exit Sub
If oRange2 Is Nothing Then Exit Sub
If oRange3 Is Nothing Then Exit Sub
On Error GoTo 0
' Exporte la plage vers un fichier de type HTML;
' ceci afin de respecter la mise en page de la
' plage
.ActiveWorkbook.PublishObjects.Add(4, "C:\Temp\XLRange1.htm", oRange1.Parent.Name, oRange1.Address, 0, "", "").Publish True
.ActiveWorkbook.PublishObjects.Add(4, "C:\Temp\XLRange2.htm", oRange2.Parent.Name, oRange2.Address, 0, "", "").Publish True
.ActiveWorkbook.PublishObjects.Add(4, "C:\Temp\XLRange3.htm", oRange3.Parent.Name, oRange3.Address, 0, "", "").Publish True
' Appelle la routine qui va se charger de créer
' un mail
Call PrepareOutlookMail("C:\Temp\XLRange1.htm", "C:\Temp\XLRange2.htm", "C:\Temp\XLRange3.htm")
' Le fichier HTML n'est plus nécessaire
Kill "C:\Temp\XLRange1.htm"
Kill "C:\Temp\XLRange2.htm"
Kill "C:\Temp\XLRange3.htm"
End With ' With Application
End Sub
Bonjour Nrev74
Pour moi la sub "SendRangeByMail" ne sert à rien
Vous pouvez regarder le code dans le classeur mis en téléchargement
https://www.excel-pratique.com/fr/telechargements/utilitaires/pdf-email-vba-excel-no508
A+
Bonjour BrunoM45,
Merci pour votre réponse.
Votre fichier est une mine d'or pour moi, merci beaucoup !
Je vais étudier cela et voir si j'arrive à l'adapter à ma problématique de 3 plages de cellules au lieu d'une.
Merci encore !