2 pièce(s) jointe(s)
VBA, envoyer un mail depuis excel en compilant plusieurs sources (tableaux, graphiques, texte)
Bonjour à tous,
Je cherche un petit peu d'aide pour envoyer des mails depuis Excel à l'aide de VBA.
Plusieurs post parlent déjà de ce sujet et m'ont permis de reprendre la base de code ci-dessous qui fonctionne pour envoyer un seul tableau dans le corps du message, sans texte ni commentaire. (voir résultat capture ci-jointe)
Mon problème est que je n'arrive pas à créer un corps de message avec plusieurs éléments.
En sommes, je voudrais créer un mail du type :
Bonjour,
bla,blabla, ....
[graphique]
bla,bla,bla
[Tableau1]
bla,bal,bla
[tableau 2]
...
[Tableau 5]
bla,bla
Cordialement
Signature
L'ensemble des tableau et graphiques sont à copier coller depuis le Excel.
Voila le code actuel
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Sub mailling()
'ThisWorkbook.RefreshAll
Set OOutlook = CreateObject("Outlook.Application")
Set OMail = OOutlook.CreateItem(olMailItem)
With OMail
.To = Sheets("Param mails").Range("D2").Value ' Destinataire
.CC = Sheets("Param mails").Range("E2").Value ' en copie à
.Subject = "Traçabilité produit - " & Sheets("Tab mail hebdo").Range("B2").Value & " - SL" & Right(Sheets("Tab mail hebdo").Range("C2").Value, 2)
.Body = "Bonjour" & vbLf & Sheets("Tab mail hebdo").Range("A5:F5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Set OTexte = OMail.GetInspector.WordEditor
OTexte.Range.Paste
.Display
End With
End Sub |
Le premier point qui m'agace c'est que le .Body="Bonjour" & vbLf & copier-coller d'un tableau ne renvois pas bonjour puis à la ligne tableau mais seulement le tableau.
De même lorsque je fais un .Body= copier-coller du tableau suivi de .Body= "Bonjour" & vbLf & .Body, j'obtiens :
Bonjour
-1
Il y a clairement des choses qui m'échappent et j'espère ne pas faire doublon avec un post existant que je n'aurais pas trouvé mais la je patauge ...
Merci d'avance à ceux qui auront quelques lumières pour moi :D
Ajout graphique dans .HTMLbody, ma solution inspirée de vos propositions
Bonjour à tous,
Ca y est ça marche !
Bon avant de clôturer, voila ce que j'ai fait en passant pas une image, si ca peut aider un potentiel lecteur :
Code:
1 2 3 4 5 6 7 8
| 'export graphique format image
Sheets("Graphs").ChartObjects("NomDuGraph").Chart.Export Filename:="C:\Temp\NomDuGraph.png", FilterName:="png"
'ajout du graphique dans le corps du mail (à placer au bon endroit par rapport aux autres éléments du mail)
.HTMLbody = .HTMLbody + "<img src='C:\Temp\NomDuGraph.png'>"
'suppression de l'image créé enregistrée sur le PC
kill "C:\Temp\NomDuGrap.png" |
Merci encore à tous pour vos lumières !:mrgreen:
1 pièce(s) jointe(s)
Probleme avec fonction RangetoHTML
Citation:
Envoyé par
joe.levrai
Bonjour,
tu peux t'aider de la propriété HTMLBody pour utiliser une plage excel dans ton email
voici une adaptation de ta procédure, en liaison tardive (pour éviter d'avoir à cocher la référence Outlook dans ton projet)
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Sub mailling()
Dim OOutlook As Object
Set OOutlook = CreateObject("Outlook.Application")
With OOutlook.CreateItem(0)
.To = Sheets("Param mails").Range("D2").Value ' Destinataire
.CC = Sheets("Param mails").Range("E2").Value ' en copie à
.Subject = "Traçabilité produit - " & Sheets("Tab mail hebdo").Range("B2").Value & " - SL" & Right(Sheets("Tab mail hebdo").Range("C2").Value, 2)
.HTMLBody = "Bonjour" & vbCrLf & vbCrLf & RangetoHTML(Sheets("Tab mail hebdo").Range("A5:F5"))
.Display
End With
Set OOutlook = Nothing
End Sub |
Et la fonction qui converti ta plage en HTML (à placer dans un module standard)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| Function RangetoHTML(ByVal Rng As Range)
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook
TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
Rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=12
.Cells(1).PasteSpecial Paste:=-4122
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
.Columns.AutoFit
'.Rows.AutoFit
On Error GoTo 0
End With
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.ReadAll
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")
TempWB.Close savechanges:=False
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function |
Bonjour Joe.levrai
J'ai utilisé votre fonction RangetoHTML qui correspond exactement à ce que je voulais faire.
Petit problème, je ne peux l'appliquer que sur 5 onglets.. à partir du 6e, la fonction mouline et fait planter Outlook.
Auriez-vous une astuce pour résoudre ce problème ?
Merci de votre aide,