Saut de ligne indésirable sur un mail généré automatiquement
Bonjour à tous,
Je crois que ce sujet n'a pas encore été traité. Je génère des mails automatiques grâce à une macro vba que j'ai créée. Le contenu de ce mail est un petit texte suivi de plusieurs tableaux (que je ne peux pas vous montrer pour des raisons d'autorisation). Le texte et les tableaux sont dans des cellules excel (organisé de façon à pouvoir les sélectionner sous forme d'une range). J’utilise dans mon programme pour générer le mail:
With olNewEmail 'Attach template
.To = liste_mail
.BCC = ""
.CC = “”
.HTMLBody = RangetoHTML(rng)
.Subject = Title
.Display
End With
Et pour y insérer une Range excel, j’ai utilise la fonction RangetoHTML suivante (qui n’est pas de moi) :
Function RangetoHTML(rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2016
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"
'Copy the range and create a new workbook to past the data in
rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With
'Publish the sheet to a htm file
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
'Read all data from the htm file into RangetoHTML
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=")
'Close TempWB
TempWB.Close savechanges:=False
'Delete the htm file we used in this function
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function
Mon problème est que ma Range n’est pas collée sur la première ligne du mail mais sur la deuxième. Le mail commence donc par un saut de ligne, ce que j’aimerais corriger. Je ne comprends pas d’où cela vient (J'ai bien sûr vérifié que je n'avais pas sélectionner une ligne de trop dans ma range). Si l’un de vous a une idée il m’aiderait grandement !
Merci d’avance de me lire.
Bonjour, et
J'utilise un autre code qui ne génère pas de fichier temporaire. C'est du "pur" html.
Insère un nouveau module avec ce code
Function tableHTML(plage As Range) As String
tableHTML = "<head><style>table, th, td {border: 1px solid black; border-collapse:collapse;}</style></head><TABLE width=" & plage.Columns.Width & "><tr>"
With plage
For Each colonne In plage.Columns
tableHTML = tableHTML & "<th width=" & colonne.Width & ">" & html(.Cells(1, colonne.Column - .Column + 1)) & "</th>"
Next colonne
If .Rows.Count > 1 Then
For i = 2 To .Rows.Count
tableHTML = tableHTML & "<tr>"
For j = 1 To .Columns.Count
tableHTML = tableHTML & "<td bgcolor=" & DecVersHexa(.Cells(i, j).Interior.Color) & "><font color=" & DecVersHexa(.Cells(i, j).Font.Color) & ">" & html(.Cells(i, j)) & "</font></td>"
Next j
tableHTML = tableHTML & "</tr>"
Next i
End If
End With
tableHTML = tableHTML & "</TABLE>"
End Function
Function DecVersHexa(ByVal valeur As Long) As String
rouge = Left(Hex(Int(valeur Mod 256)) & "00", 2)
vert = Left(Hex(Int((valeur Mod 65536) / 256)) & "00", 2)
bleu = Left(Hex(Int(valeur / 65536)) & "00", 2)
DecVersHexa = rouge & vert & bleu
End Function
Function html(cel As Range)
html = ""
With cel
For i = 1 To Len(.Value)
deb_style = ""
fin_style = ""
If .Characters(Start:=i, Length:=1).Font.Underline <> xlUnderlineStyleNone Then
deb_style = "<u>"
fin_style = "</u>"
End If
If .Characters(Start:=i, Length:=1).Font.Bold Then
deb_style = deb_style + "<b>"
fin_style = "</b>" + fin_style
End If
If .Characters(Start:=i, Length:=1).Font.Italic Then
deb_style = deb_style + "<i>"
fin_style = "</i>" + fin_style
End If
Select Case Asc(Mid(.Value, i, 1))
Case Is = 10
html = html & "<br/>"
Case Is > 127
html = html & deb_style & "&#" & Asc(Mid(.Value, i, 1)) & ";" & fin_style
Case Else
html = html & deb_style & Mid(.Value, i, 1) & fin_style
End Select
Next
End With
html = Replace(html, "</i><i>", "")
html = Replace(html, "</b><b>", "")
html = Replace(html, "</u><u>", "")
End Functionet remplace dans ta macro RangetoHTML par tableHTML
S'il reste une ligne blanche, on peut faire encore plus simple
Tu peux aussi remplacer
.HTMLBody = RangetoHTML(rng)
par
.HTMLBody = RangetoHTML(rng) & .HTMLbody
afin de conserver ta signature outlook
As-tu testé ma proposition ? est-ce qu'elle supprime le problème ?
Bonjour,
J'avais bien vu ton message, merci beaucoup de ta réponse. Je vais tester ce matin, je n'avais pas eu le temps jusqu'à présent. Je te fais un retour aussitôt
Si ce n'est pas le cas, je peux aménager et simplifier ... (je ne peux plus tester car je ne travaille plus avec outlook).
J'ai une erreur de type missmatch à la ligne "For i = 1 To Len(.Value)"... Je ne comprends pas le problème malheureusement.
Curieux !
Est-ce que tu as une erreur quand tu le fais à partir du fichier posté. C'est-à-dire quand tu lance la macro
Sub table()ou
Sub page()?
Comment dans ton fichier fais-tu appel à la fonction ?
Bonjour,
Je fais appel à ma macro "mail" qui fait appelle à la fonction tablehtml que tu m'as envoyé pour générer le mail. ce qui donne ça :
Dim Title$
Set olLook = CreateObject("Outlook.Application")
Set olNewEmail = olLook.CreateItem(0)
Title = Sheets("Template_Mail").Cells(2, 2)
With olNewEmail 'Attach template
.To = liste_mail
.BCC = ""
.CC = ""
.HTMLBody = tableHTML(rng)
.Subject = Title
.Display
End With
Quand j’exécute sub table ou sub page à partir de ton fichier, il n'y a aucun problème bizarrement. Je vais ré-essayer de comprendre aujourd'hui. Je te dis si je comprends le problème. Merci de ton aide précieuse !
Merci pour ce retour.
Comment est défini rng ?
Voici le code complet:
Sub Mail()
Dim rng As Range
Set rng = Nothing
On Error Resume Next
Set rng = Sheets("RESULTS").Range("B1:H77").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
Dim colonne_client As Integer
colonne_client = 2
While Sheets("Template_Mail").Cells(27, colonne_client + 1) <> ""
colonne_client = colonne_client + 1
Dim ligne As Integer, liste_mail As String
ligne = 28
liste_mail = ""
While Sheets("Template_Mail").Cells(ligne, colonne_client) <> ""
liste_mail = liste_mail & Sheets("Template_Mail").Cells(ligne, colonne_client) & ";"
ligne = ligne + 1
Wend
Dim Title$
Set olLook = CreateObject("Outlook.Application")
Set olNewEmail = olLook.CreateItem(0)
Title = Sheets("Template_Mail").Cells(2, 2)
With olNewEmail 'Attach template
.To = liste_mail
.BCC = ""
.CC = ""
.HTMLBody = tableHTML(rng)
.Subject = Title
.Display
End With
'strEmailText
Wend
End Sub
Function tableHTML(plage As Range) As String
tableHTML = "<head><style>table, th, td {border: 1px solid black; border-collapse:collapse;}</style></head><TABLE width=" & plage.Columns.Width & "><tr>"
With plage
For Each colonne In plage.Columns
tableHTML = tableHTML & "<th width=" & colonne.Width & ">" & html(.Cells(1, colonne.Column - .Column + 1)) & "</th>"
Next colonne
If .Rows.Count > 1 Then
For i = 2 To .Rows.Count
tableHTML = tableHTML & "<tr>"
For j = 1 To .Columns.Count
tableHTML = tableHTML & "<td bgcolor=" & DecVersHexa(.Cells(i, j).Interior.Color) & "><font color=" & DecVersHexa(.Cells(i, j).Font.Color) & ">" & html(.Cells(i, j)) & "</font></td>"
Next j
tableHTML = tableHTML & "</tr>"
Next i
End If
End With
tableHTML = tableHTML & "</TABLE>"
End Function
Function DecVersHexa(ByVal valeur As Long) As String
rouge = Left(Hex(Int(valeur Mod 256)) & "00", 2)
vert = Left(Hex(Int((valeur Mod 65536) / 256)) & "00", 2)
bleu = Left(Hex(Int(valeur / 65536)) & "00", 2)
DecVersHexa = rouge & vert & bleu
End Function
Function html(cel As Range)
html = ""
With cel
For i = 1 To Len(.Value)
deb_style = ""
fin_style = ""
If .Characters(Start:=i, Length:=1).Font.Underline <> xlUnderlineStyleNone Then
deb_style = "<u>"
fin_style = "</u>"
End If
If .Characters(Start:=i, Length:=1).Font.Bold Then
deb_style = deb_style + "<b>"
fin_style = "</b>" + fin_style
End If
If .Characters(Start:=i, Length:=1).Font.Italic Then
deb_style = deb_style + "<i>"
fin_style = "</i>" + fin_style
End If
Select Case Asc(Mid(.Value, i, 1))
Case Is = 10
html = html & "<br/>"
Case Is > 127
html = html & deb_style & "" & Asc(Mid(.Value, i, 1)) & ";" & fin_style
Case Else
html = html & deb_style & Mid(.Value, i, 1) & fin_style
End Select
Next
End With
html = Replace(html, "</i><i>", "")
html = Replace(html, "</b><b>", "")
html = Replace(html, "</u><u>", "")
End Function
Je fais donc appelle à la macro "mail" pour exécuter le code.
Un essai simplifié :
Sub test()
Dim rng As Range
Set rng = Nothing
On Error Resume Next
Set rng = Sheets("RESULTS").Range("B1:H77").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
MsgBox tableHTML(rng)
End Subfonctionne correctement !
Je pense que rng n'est pas initialisé !
Pourquoi encadres-tu Set rng avec
On Error Resume Next
On Error GoTo 0Je te conseille d'enlever ces 2 instructions, car si cela produit une erreur (ex : nom exact de la feuille), ta macro n'a pas de sens. Exemple d'erreur : le nom de la feuille est suivi d'un espace !
Oui ça a bien l'air d'être le soucis, je n'ai plus le problème ! Je vais essayer de comprendre l’erreur maintenant Merci beaucoup pour ton aide !