Microsoft 365 Envoi pièce jointe html avec Outlook en VBA

bennp

XLDnaute Occasionnel
Bonjour, j'ai ce code mais je n'arrive pas à insérer la pièce jointe, elle se met dans le corps du texte.

j'y arrivait en étant en olFormatHTML mais je n'arrivait pas à faire les sauts de ligne avec "vbCrLf"

Maintenant, je peux faire des sauts de ligne mais la pièce jointe n'est plus intégrée...

Quelqu'un a une idée svp ?

Merci d'avance
VB:
Sub Mail_facture_non_reglee()


'définition des variables
Dim MonSujet As String
Dim MonDestinataire As String
Dim MonContenu As String
Dim MaPieceJointe As String
Dim AdresseExpediteur As String

'attribution des valeurs aux variables
MonSujet = "objet"
MonDestinataire = Worksheets("SUIVI FACTURES").Range("P4")
MonContenu = "Bonjour," & vbCrLf & Range("AX2") & Range("S3") & Range("AX3")
MaPieceJointe = Worksheets("SUIVI FACTURES").Range("P5")
AdresseExpediteur = "email@email.com.com"

    
    'test envoi de l'email
        Call EnvoyerEmail(MonSujet, MonDestinataire, MonContenu, MaPieceJointe, AdresseExpediteur)

MsgBox "Test terminé..."
End Sub

Code:
Private Sub PreparerOutlook(ByRef oOutlook As Object)
'par Excel-Malin.com ( https://excel-malin.com )

'------------------------------------------------------------------------------------------------
'Ce code vérifie si Outlook est prêt à envoyer des emails... Et s'il ne l'est pas, il le prépare.
'------------------------------------------------------------------------------------------------

On Error Resume Next
    'vérification si Outlook est ouvert
    Set oOutlook = GetObject(, "Outlook.Application")
    
    If (Err.Number > 0) Then 'si Outlook n'est pas ouvert, une instance est ouverte
        Err.Clear
        Set oOutlook = CreateObject("Outlook.Application")
        
        If (Err.Number > 0) Then
            MsgBox "Une erreur est survenue lors de l'ouverture de Outlook..."
            Exit Sub
        Else
        End If
        
    Else    'si Outlook est ouvert, l'instance existante est utilisée
    End If

End Sub
Code:
Sub EnvoyerEmail(ByVal Sujet As String, ByVal Destinataire As String, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String, Optional ByVal AdresseExpediteur As String)
'par Excel-Malin.com ( https://excel-malin.com )

On Error GoTo EnvoyerEmailErreur

'définition des variables
Dim oOutlook As Outlook.Application
Dim oMailItem As Outlook.MailItem

    'vérification si le Contenu du mail n'est pas vide. Si oui, email n'est pas envoyé. Si vous voulez pouvoir envoyer les email vides, mettez en commentaire les 4 lignes de code qui suivent.
    If Len(ContenuEmail) = 0 Then
        MsgBox "Mail non envoyé car vide", vbOKOnly, "Message"
        Exit Sub
    End If
    
    'préparer Outlook
    PreparerOutlook oOutlook
    Set oMailItem = oOutlook.CreateItem(0)
    
    'création de l'email
    With oMailItem
        .To = Destinataire
        .Subject = Sujet
        
        'CHOIX DU FORMAT
        '----------------------
        'email formaté comme HTML (aussi par défaut)
            '.BodyFormat = olFormatHTML
            '.HTMLBody = "<html><p>" & ContenuEmail & "</p></html>"
            
        'OU
            
        'email formaté comme simple texte sans formats
            '.BodyFormat = olText
            '.Body = ContenuEmail
            
        'OU
                
        'email formaté comme texte riche (= avec formats)
            .BodyFormat = olFormatRichText
            .Body = ContenuEmail
        '----------------------
        
        If PieceJointe <> "" Then .Attachments.Add PieceJointe
        
            'sélection de l'addresse de l'expéditeur
            If AdresseExpediteur <> "" Then
                Dim CompteOutlook As Account
                
                For Each CompteOutlook In oOutlook.Session.Accounts
                    If CompteOutlook.SmtpAddress = AdresseExpediteur Then
                        .SendUsingAccount = CompteOutlook
                        Exit For
                    End If
                Next CompteOutlook
            Else
            End If
        
       .Display   '<- affiche l'email (si vous ne voulez pas l'afficher, mettez cette ligne en commentaire)
       .Save      '<- sauvegarde l'email avant l'envoi (pour ne pas le sauvegarder, mettez cette ligne en commentaire)
       '.Send      '<- envoie l'email (si vous voulez seulement préparer l'email et l'envoyer manuellement, mettez cette ligne en commentaire)
    End With
    
   'nettoyage...
    If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
    If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
    
   Exit Sub

EnvoyerEmailErreur:
    If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
    If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
 
    MsgBox "Le mail n'a pas pu être envoyé...", vbCritical, "Erreur"
End Sub
Code:
 Function OutlookOuvert() As Boolean
   Dim oOL As Object
   On Error Resume Next
   Set oOL = GetObject(, "Outlook.Application")
   On Error GoTo 0
   OutlookOuvert = Not (oOL Is Nothing)
   Set oOL = Nothing
 End Function
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Les sauts de lignes VbCrLf en HTML n'existent pas.
Un saut de ligne peut se faire par "<br>" pour un passage à la ligne dans un paragraphe.
La balise "<br>" n'a pas besoin de sa soeur "</br>" pour la fermeture.
"<p>" (nouveau paragraphe) a besoin de "</p>" pour fermer le paragraphe.

Je vois que votre macro utilise à la fois la liaison tardive (avec createobject) et la liaison précoce (références à Outlook.Application), ce qui n'est pas recommandé si vous ne voulez pas avoir de fuite de mémoire.
En général on référence les bibliothèques outlook, lors de la phase de développement et ensuite on pas à la liaison tardive (Déréférencement des bibliothèques, et modification des variables en objet neutre)

Mais vous pouvez peut-être voir tout ça avec le créateur malin de la macro.

cordialement
 

bennp

XLDnaute Occasionnel
Une autre question concernant ce mail, je voudrais intégrer une image en plus dans le corps du message mais je n'y arrive pas, j'ai testé ""img src=D:\test.png" mais ça ne fonctionne pas.
De plus je voudrais éviter d'aller chercher l'image sur le disque dur mais plutôt récupérer l'image qui a déjà été chargée sur une de mes feuilles Excel, Image1 par exemple.

Tu aurais une idée à ce sujet ?

Merci
 

kiki29

XLDnaute Barbatruc
Salut, via CDO sans oublier RdB .
Pourquoi utiliser le code CDO au lieu de l'automatisation Outlook ou SendMail dans VBA.
1 : Peu importe le programme de messagerie que vous utilisez (il utilise uniquement le serveur SMTP).
2 : Peu importe la version d'Office que vous utilisez (97…2016)
3 : Vous pouvez envoyer une plage/feuille dans le corps du courrier (certains programmes de messagerie ne peuvent pas le faire)
4: Vous pouvez envoyer n'importe quel fichier que vous aimez (fichiers Word, PDF, PowerPoint, TXT,….)
5 : Aucun avertissement de sécurité, vraiment génial si vous envoyez beaucoup de courrier en boucle.
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 892
Membres
101 831
dernier inscrit
gillec