XL 2016 VBA - Range to HTML incluant les objets de la feuille (boutons, images, ...)

Dudu2

XLDnaute Barbatruc
Bonjour,

Je n'ai rien trouvé qui fonctionne pour convertir un Range en HTML qui inclurait tout ce qu'il y a dans le Range en question.

J'ai bien récupéré la fonction de Ron de Bruin omni-présente sur le Web qui fonctionne uniquement pour les valeurs de cellules et leurs formats, sauf pour les tableaux structurés qui ne sont pas en exclusivité dans le Range qui perdent alors leurs formats (qui n'en sont pas vraiment !).
 

Pièces jointes

  • Classeur1.xlsm
    261.1 KB · Affichages: 11

patricktoulon

XLDnaute Barbatruc
re
non la version sans webbrowser
ne pouvant pas tester par moi même le retour b64 comme chez toi chez moi je l'ai laissé de coté
ensuite vu que W10 et + va de plus mal en pis j'ai préféré tout compiler avec des librairies qui j'en suis sur(pour l'instant) ne vous feront pas défaut

je te l'accorde la version avec captureX(le webbrowser) était plus rapide c'est vrai

pour l'instant tout fonctionne sauf pour le b64 qui même avec le code du lien que tu a donné pixelise les image avec un poids plus important
apres recherche dans mes vieux truc html vba je faisait pas comme ca avant
j'utilisais open for binnary au lieu d'un object stream pour lire les bytes du fichier
peut etre est ce là le bas qui blesse le streamer serait limité
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Dudu2
non je ne l'ai pas publié
j'ai trouvé le moyen de faire un seul code html compatible outlook et FF et IE
IE voyant légèrement plus grand

je me pose la question si je laisse les anciennes fonctions html ou pas

le procédé adopté
récup des image dans le zip du fichier XL
createrange html par code
create embbed image pour outlook et web dans le même code

je fait plu sieur projet en même temps quand je cale sur 1 je poursuit l'autre comme ça je ne cale pas :D

après j'en ai plublié 2 autres de ressources (pour le zip et les image )qui ne sont toujour pas validées
alors faut prendre son temps a mon avis c'est pas la peine de se presser
 

Dudu2

XLDnaute Barbatruc
2 petites remarques:
1 - Alignement vertical de T1
Excel:
1662382003748.png

IE:
1662382129323.png


2 - Les images sont précédées d'un point sur la version IE:
1662382283683.png
 

patricktoulon

XLDnaute Barbatruc
re
oui je l'ai remarqué le margin-left du td.firstchild de fonctionne pas dans outlook
j'ai essayé de rendre le plus fidele a l'original
les point c'est bizarre c'est les balises "<li> que je me sert provisoirement
je vais regarder ça
j'ai peut être bloqué la ligne je sais pas
y en a tellement 😂😂
 

patricktoulon

XLDnaute Barbatruc
re
je viens de regarder et chez moi elle sont bien enlevées et remplacer par la condition "SI pas MSO"
regarde
exemple le 1er embbed obtenu
HTML:
<!--[if mso]>
<v:rect style="POSITION: absolute; WIDTH: 30.75pt; HEIGHT: 25.575pt; TOP: 2pt; LEFT: 8pt" xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false" ><v:fill  type="frame" src="Smiley_Face_1.png">
</v:fill></v:rect>
<![endif]-->
<!--[if !mso]><!-- -->
<IMG style="POSITION: absolute; WIDTH: 32.287pt; HEIGHT: 24.877pt; TOP: 2pt; LEFT: 8pt" src="images_table_C4_I13\Smiley_Face_1.png">
<!--<![endif]-->

renvoie moi le code du fichier html que tu obtiens
 

patricktoulon

XLDnaute Barbatruc
re
ben je vois en fait chez toi le replace ne se fait pas la je pige pas
c'est vraiment trop bizarre ton install ca n'a rien a voir avec outlook
c'est dans la fonction PutShapOnHtmlOutlook que ça se passe
tout du moins chez toi ça se passe pas ;)

edit:
ok c'est pigé chez toi les balise sont en minuscule
donc adaptation de la fonction dans ce sens

change la
VB:
'****************************************************************************************************
Function PutShapOnHtmlOutlook(CdeHTML$, RnG As Range, Optional ByVal DossierImage$ = "")
'Function d'ajout des images dans le code html d'une cellule TD html en utilisant 2 balises "PRE"
'retransformé en en code shape:VML pour outlook
'patricktoulon (2022)
    Dim DcO As New HTMLDocument, shap As Object, cel As Range, TD, VrecT, VfilL, Addr$, dossier
    Dim pres, A&, bal$, deb$, fin$, code$, ImG, Li
    DcO.body.innerhtml = CdeHTML
    For Each shap In RnG.Parent.DrawingObjects
        Set cel = shap.TopLeftCell.MergeArea
        Addr = cel.Address(0, 0)
        If Not Intersect(shap.TopLeftCell, RnG) Is Nothing Then
            Set TD = DcO.getelementbyid(Addr)
            Set TD = DcO.getelementbyid(Addr): TD.Style.Position = "relative"
            TD.Style.Position = "relative"
            Set Li = DcO.createElement("LI")
            Set ImG = DcO.createElement("IMG")
            Li.appendchild (ImG)
            Set VrecT = DcO.createElement("pre")
            VrecT.setattribute "xmlns:v", "urn:schemas-microsoft-com:vml"
            VrecT.setattribute "fill", "true"
            VrecT.setattribute "stroke", "false"
            VrecT.setattribute "bal", "v:rect"
            With VrecT.Style
                .Position = "absolute"
                .Left = Int(Int(shap.Left) - cel.Left - 1) & "pt"
                .Top = Int(shap.Top - cel.Top) & "pt"
                .Width = Replace(shap.Width, ",", ".") & "pt"
                .Height = Replace(shap.Height * 1.1, ",", ".") & "pt"
            End With
            TD.appendchild (VrecT)
            With ImG.Style
                .Position = "absolute"
                .Left = Int(Int(shap.Left) - cel.Left - 1) & "pt"
                .Top = Int(shap.Top - cel.Top) & "pt"
                .Width = Replace(shap.Width * 1.05, ",", ".") & "pt"
                .Height = Replace(shap.Height * 1.07, ",", ".") & "pt"
            End With
            ImG.src = Mid(DossierImage, InStrRev(DossierImage, "\") + 1) & "\" & Replace(shap.Name, " ", "_") & ".png"
            Set VfilL = DcO.createElement("pre")
            VfilL.setattribute "type", "frame"
            VfilL.setattribute "bal", "v:fill"
            VfilL.setattribute "src", Replace(shap.Name, " ", "_") & ".png"
            VrecT.appendchild (VfilL)
            TD.appendchild (Li)
        End If

    Next
    Set pres = DcO.getelementsbytagname("PRE")
    For A = pres.Length - 1 To 0 Step -1
        bal = pres(A).getattribute("bal")
        If InStr(pres(A).outerhtml, "<pre") > 0 Then
            pres(A).outerhtml = Replace(Replace(pres(A).outerhtml, "<pre", "<" & bal), "pre>", vbCrLf & bal & ">")
        Else
            pres(A).outerhtml = Replace(Replace(pres(A).outerhtml, "<PRE", "<" & bal), "PRE>", vbCrLf & bal & ">")
        End If
    Next
    deb = "<!--[if mso]>": fin = "<![endif]-->"
    code = DcO.body.innerhtml
    code = Replace(code, "</ v:rect>", "")
    code = Replace(code, "</ v:fill>", "")
    code = Replace(code, "<v:rect", vbCrLf & deb & vbCrLf & "<v:rect")
    code = Replace(code, "</v:rect>", "</v:rect>" & vbCrLf & fin)
    code = Replace(code, "</v:fill>", vbCrLf & "</v:fill>")
    code = Replace(code, "<?xml:namespace prefix = v />", "")
    code = Replace(code, "bal=""v:rect""", "")
    code = Replace(code, "bal=""v:fill""", "")

    If InStr(1, code, "<li>") > 1 Then
        code = Replace(code, "<li>", "<!--[if !mso]><!-- -->" & vbCrLf)
        code = Replace(code, "</li>", vbCrLf & "<!--<![endif]-->" & vbCrLf)
    Else
        code = Replace(code, "<LI>", "<!--[if !mso]><!-- -->" & vbCrLf)
        code = Replace(code, "</LI>", vbCrLf & "<!--<![endif]-->" & vbCrLf)
    End If
    PutShapOnHtmlOutlook = code
    Set DcO = Nothing
End Function
'******************************************************************************************
 

Discussions similaires

Statistiques des forums

Discussions
314 017
Messages
2 104 582
Membres
109 083
dernier inscrit
Stef06