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 !

Rechercher des sujets similaires à "vba envoyer plages corps email"