Bonjour à tous
comme le sujet (envoyer une plage de cellules dans le corps du mail) revient inlassablement sur le forum
je vous livre aujourd'hui ma fonction ListObjectToTableHTML
Cette fonction ne peut recevoir comme argument qu'un objet listobject (l'object range est exclu)
cette fonction encode en html une table html représentant le tableau structuré le plus fidèlement possible
cette fonction est issue de ma fonction range toHTML mais elle est ultra simplifié
le code html résultant peu être injecté dans le bodyhtml du mailitem(0) de outlook par exemple
ou même être enregistré dans un fichier html ou txt pour une utilisation autre et/ou ultérieure
Alors certains vont s’empresser de me dire que l'on peut copier coller dans le corps du mail outlook en passant par l'inspector et les range du document(outlook)
sauf que l'on est obligé dans ce cas là de faire un display avant pour pouvoir coller
avec ma méthode l'object outlook peut rester invisible
d'autant plus que pour les destinataires n'utilisant pas outlook comme application mail
se retrouvent avec une page parfois désordonnée(a méditer)
donc ceci étant dit
le code de la fonction
un code exemple d'utilisation pour Outlook
un code exemple pour enregistrer dans un fichier HTML (exploitable par tout navigateur)
capture du résultat outlook
capture du renderer sur firefox par exemple pour un fichier html
voilà c'est une petite fonction bien utile aux vues du nombre de demandes de ce genre que l'on voit passer chaque année sur le forum j'ai pensé que ça pouvait vous être utile
Bonne utilisation
comme le sujet (envoyer une plage de cellules dans le corps du mail) revient inlassablement sur le forum
je vous livre aujourd'hui ma fonction ListObjectToTableHTML
Cette fonction ne peut recevoir comme argument qu'un objet listobject (l'object range est exclu)
cette fonction encode en html une table html représentant le tableau structuré le plus fidèlement possible
cette fonction est issue de ma fonction range toHTML mais elle est ultra simplifié
le code html résultant peu être injecté dans le bodyhtml du mailitem(0) de outlook par exemple
ou même être enregistré dans un fichier html ou txt pour une utilisation autre et/ou ultérieure
Alors certains vont s’empresser de me dire que l'on peut copier coller dans le corps du mail outlook en passant par l'inspector et les range du document(outlook)
sauf que l'on est obligé dans ce cas là de faire un display avant pour pouvoir coller
avec ma méthode l'object outlook peut rester invisible
d'autant plus que pour les destinataires n'utilisant pas outlook comme application mail
se retrouvent avec une page parfois désordonnée(a méditer)
donc ceci étant dit
le code de la fonction
VB:
'*****************************************************************************************************
' ___ _ _______ __ _ ____ _ _ _______ ___ _ _ _ ___ _ _.
' // \\ /\\ // // \\ // // // // // // \\ // // // // \\ //| //
' //___// //__\ // //__// // // //__// // // // // // // // // // | //
' // // \\ // // \\ // // // \\ // // // // // // // // // | //
'// // // // // // // //___ // \\ // \\__// //__// //___ \\__// // |//
'****************************************************************************************************
' COLLECTION RANGE TO HTML
' ****************************************
' * fonction << ListObjectToTableHTML >> *
' ****************************************
'Auteur: patricktoulon
'Version 1.0
'Date version:05/02/2024
'C'est une fonction specialement et uniquement concu pour encoder un tableau structuré en html
'Elle vous renvoie donc un code HTML representant le tableau le plus fidèlement possible
'Elle peut être utilise pour envoyer un tableau structuré dans le corps du mail avec outlook
'Ou simplement enregistrer en fichier HTML
'Elle est issue de ma fonction range to html mais ultra simplifiée
'Je l'ai concu de telle maniere quu'elle en aLlège le code HTML résultant(même si ça rallonge un peu le code VBA)
'
'Un module de test simple est join avec pour que vous puissiez tester Outlook et enregistrer en fichier html
'Utilisation de ma fonction ConvertColorToHtmL de 2016 pour la conversion du code couleur(tout format Vers code coleur html)
'***************************************************************************************************
Option Explicit
Public Function ListObjectToTableHTML(tableau As ListObject)
Dim r As Range, HtmlDoC As Object, TD, TR, LiG&, C&, TableH, Fn$, FC, CelH, Al, VaL, Bal, ALR, VaLR, V$
Fn = ThisWorkbook.Styles(1).Font.Name
FC = ThisWorkbook.Styles(1).Font.Color
Set r = tableau.Range
Set HtmlDoC = CreateObject("htmlfile")
HtmlDoC.body.INNERHTML = "<table></table>"
Set TableH = HtmlDoC.getelementsbytagname("table")(0)
With TableH.Style
.bordercollapse = "collapse"
.fontfamily = Fn
.Color = ConvertColorToHtmL(FC)
.Width = Round(r.Width) & "pt"
.Height = Round(r.Height) & "pt"
.Border = "0.5pt solid " & ConvertColorToHtmL(RGB(230, 230, 230))
End With
For LiG = 1 To r.Rows.Count
Set TR = TableH.appendchild(HtmlDoC.createelement("tr"))
For C = 1 To r.Columns.Count
V = r.Cells(LiG, C).Text
If LiG = 1 Then
If tableau.HeaderRowRange Is Nothing Then Bal = "TH" Else Bal = "TD"
Else: Bal = "TD"
End If
Set CelH = TR.appendchild(HtmlDoC.createelement(Bal))
If r.Cells(LiG, C).Font.Italic Then V = "<i>" & V & "</i>"
If r.Cells(LiG, C).Font.Bold Then V = "<b>" & V & "</b>"
CelH.INNERHTML = "<font>" & V & "</font>"
CelH.FirstChild.Style.margin = 0
With CelH.Style
.Width = Round(r.Columns(C).Width) & "pt"
.Height = Round(r.Rows(LiG).Height) & "pt"
.borderleft = "0.5pt solid " & ConvertColorToHtmL(RGB(230, 230, 255))
If r.Cells(LiG, C).Borders(xlEdgeLeft).LineStyle <> xlLineStyleNone Then
.borderleftcolor = ConvertColorToHtmL(r.Cells(LiG, C).Borders(xlEdgeLeft).Color)
End If
If r.Cells(LiG, C).Font.Name <> Fn Then .fontfamily = r.Cells(LiG, C).Font.Name
If r.Cells(LiG, C).DisplayFormat.Font.Color <> FC Then .Color = ConvertColorToHtmL(r.Cells(LiG, C).DisplayFormat.Font.Color)
Al = r.Cells(LiG, C).HorizontalAlignment 'l'alignement horizontal du texte pour la cellule
ALR = r.Rows(LiG).HorizontalAlignment 'l'alignement horizontal du texte pour la ligne complète
Al = Switch(Al = xlLeft, "left", Al = xlCenter, "center", Al = xlRight, "right")
ALR = Switch(ALR = xlLeft, "left", ALR = xlCenter, "center", ALR = xlRight, "right")
If Not IsNull(ALR) Then
TR.Style.textalign = ALR
Else
If Not IsNull(Al) Then .textalign = Al Else .textalign = "left"
End If
VaL = r.Cells(LiG, C).VerticalAlignment 'l'alignement horizontal du texte pour la cellule
VaLR = r.Cells(LiG, C).VerticalAlignment 'l'alignement horizontal du texte pour la ligne complète
VaL = Switch(VaL = xlTop, "top", VaL = xlCenter, "middle", VaL = xlBottom, "bottom")
VaLR = Switch(VaLR = xlTop, "top", VaLR = xlCenter, "middle", VaLR = xlBottom, "bottom")
If Not IsNull(VaLR) Then
TR.vAlign = VaLR
Else
If Not IsNull(VaL) Then CelH.vAlign = VaL Else CelH.vAlign = "bottom"
End If
End With
Next C
TR.Style.backgroundcolor = ConvertColorToHtmL(r.Rows(LiG).DisplayFormat.Interior.Color)
TR.Style.bordertop = "0.5pt solid " & ConvertColorToHtmL(RGB(230, 230, 255))
Next LiG
ListObjectToTableHTML = TableH.outerhtml
Set HtmlDoC = Nothing
Set TR = Nothing
Set CelH = Nothing
End Function
Public Function ConvertColorToHtmL(C) As String
'collection fonction perso
'fonction Color XL to HTMLCOLOR ---> By Patricktoulon (2016)
Dim str0 As String, strf As String
str0 = Right("000000" & Hex(C), 6): strf = Right(str0, 2) & Mid(str0, 3, 2) & Left(str0, 2)
ConvertColorToHtmL = "#" & strf & ""
End Function
un code exemple d'utilisation pour Outlook
VB:
Option Explicit
Sub TestAvecOutlook()
Dim OL As Object, OLmail, code, Corps
Set OL = CreateObject("Outlook.Application")
Set OLmail = OL.CreateItem(0) '0
code = ListObjectToTableHTML(Range("Tableau1").ListObject)
With OLmail
'.From = CStr("guillaumepothier@hotmail.com")
.To = "dudu@youmémélle.com"
.Subject = "test listobject" & Date
.BodyFormat = 2
Corps = "<div style=""font-family:calibri;font-size:11pt;"">"
Corps = Corps & "bonjour salut<br>ci-joint le tableau des ventes du mois<br>"
Corps = Corps & code
Corps = Corps & "<br><br>en vous souhaitant bonne reception<br>patrick à votre service"
Corps = Corps & "</div>"
.htmlbody = Corps
.display
'.Save
'.Send 'envoi automatique
End With
End Sub
un code exemple pour enregistrer dans un fichier HTML (exploitable par tout navigateur)
VB:
Sub TestCreateHtmlFile()
Dim fichier$, X&, code$
'fichier = Environ("userprofile") & "\Desktop\table.html"
fichier = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & "table.html"
code = ListObjectToTableHTML(Range("Tableau1").ListObject)
X = FreeFile: Open fichier For Output As #X: Print #X, code: Close #X
End Sub
capture du résultat outlook
capture du renderer sur firefox par exemple pour un fichier html
voilà c'est une petite fonction bien utile aux vues du nombre de demandes de ce genre que l'on voit passer chaque année sur le forum j'ai pensé que ça pouvait vous être utile
Bonne utilisation
- Auteur
- patricktoulon
- Version
- 1.0 - 2024