VBA/Outlook : coller texte formaté dans corps du mail (url, couleur, etc)
Bonjour la communauté !
Après recherches sur le forum et sur les moteurs de recherche, je n'arrive pas à trouver la solution à mon problème VBA... alors je poste ici en espérant recevoir vos avis experts et votre aide précieuse !
Contexte : j'ai besoin d'un outil pour envoyer des emails en masse (à nos fournisseurs) pouvant contenir des liens (par exemple pour s'inscrire à une conférence).
Status : j'ai un code très basique mais fonctionnel qui envoie en To: et Cc: à une liste définie, avec titre d'email personnalisé (nom du fournisseur) + corps du mail personnalisé (prénom du contact, nom de l'entreprise) pour chaque email. Le corps du message ("body") est pour le moment stocké dans une TextBox classique.
Problème : les formats ne sont pas conservés, seul le texte brut de la TextBox est copié/collé mais les formats sont perdus (liens, couleurs, police, etc).
Résultat souhaité : avoir un outil facile d'utilisation (y compris par des collègues non "VBA-friendly") + des emails formatés (liens, couleurs, etc).
A éviter : idéalement le texte du mail est facilement modifiable, sans devoir entrer dans le développeur et toucher au code (cf. collègues non aguerris).
Code actuel :
Sub SendMassEmail()
'
' SendMassEmail Macro
Dim i As Integer
Dim name, email, body, subject, copy, company As String
Dim OutApp As Object
Dim OutMail As Object
body = ActiveSheet.TextBoxes("TextBox 1").Text
'First line of data
i = 3
'Loop down name column starting at row 3 column 1
Do While Cells(i, 1).Value <> ""
company = Cells(i, 1).Value
name = Split(Cells(i, 2).Value, " ")(0) 'extract first name
email = Cells(i, 3).Value
copy = Cells(i, 4).Value
subject = Cells(i, 5).Value
'replace place holders
body = Replace(body, "C1", company)
body = Replace(body, "C2", name)
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.to = email
.cc = copy
.subject = subject
.body = body
.Send
End With
'reset body text
body = ActiveSheet.TextBoxes("TextBox 1").Text
i = i + 1
Loop
Set OutMail = Nothing
Set OutApp = Nothing
MsgBox "Email(s) Sent!"
'
End Sub• Visuel idéal (template) :
• Visuel actuel avec ce code :
• Lessons learned :
... Les TextBox d'Excel ne permettent pas l'ajout de liens dans le texte, une TextBox étant considéré comme une "forme" (Shape) le lien s'appliquera à l'objet et non au texte... Ma solution actuelle ne pourra donc à priori pas déboucher sur le résultat souhaité.
• Pistes que j'essaye d'explorer - et autant de questions :
... Un document Word inséré dans le fichier Excel et modifiable depuis Excel ("embedded") ; j'ai vu que lorsque l'on rentre sur le document Word intégré, il est possible d'y enregistrer des macros...
>> Est-il possible d'avoir une ligne de code pour (a) entrer dans le doc Word intégré, (b) sélectionner tout le texte du Word, (c) coller dans le corps du mail (en utilisant la fonction .GetInspector().WordEditor.Range.Paste) ?
>> Si non, existe-t-il une alternative similaire ? Où l'on pourrait copier/coller un template d'email (contenant les formats, liens etc) ?
Important : la fonctionnalité du corps de mail personnalisé doit rester (C1 = nom de l'entreprise, C2 = prénom du contact)
Un grand MERCI par avance !!
Bonjour,
pour envoyer un mail avec un contenu formaté, il faut utiliser .htmlbody (au lieu de .body) et les balises HTML pour faire la mise en forme.
Pour éviter de devoir faire le codage des balises HTML, tu pourrais imaginer de faire ton modèle en word (avec tes placeholders), sauver le fichier au format html.
Ensuite dans ta macro d'envoi, ouvrir le modèle, lire son contenu dans une variable, remplacer les placeholders par les valeurs qui conviennent et charger cette variable dans .htmlbody.
une proposition à adapter :
document word
template html (fichier word sauvé au format web page, html)
classeur excel avec la macro
Bonjour h2so4,
Solution simple, brillante et qui fonctionne comme un charme, MERCI !!!
C'est exactement ce qu'il me fallait, testé et approuvé.
Je te souhaite une très belle semaine.