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

Staple1600

XLDnaute Barbatruc
Bonjour @Dudu2
pour l'occasion (je fait un peu le bilan)
j'ai réuni dans l'exemple ci joint 3 méthodes dans 3 modules différents que j'utilise moi même et depuis longtemps sauf le publish que je découvre en ce moment
Bonjour le fil

[EN PASSANT]
C'est que qui arrive quand le réflexe "Archives XLD" n'est pas premier ;)
Nous étions en 2019 ;)
[/EN PASSANT]
 

patricktoulon

XLDnaute Barbatruc
re
alors verdict?

@stapple1600 bonjour
on l'avu celui là et d'ailleur je crois que l'on y fait reference dans les page precedente de cette discussion
mais j'ose espérer que tu compare pas le travail que nous faisons avec celui de ron de bruin
même si c'est une sérieuse référence en la matière on va bien plus loin
le résultat provisoire que l'on obtiens avec la ressource

c'est pas avec les codes de ron de bruin que tu va les avoir 🤣
je dis ça juste en passant moi aussi 🤣

d'ailleurs pour tout te dire @Dudu2 et moi avons chacun notre solution parfaitement fonctionnelle
là j'explore le publich juste pour voir si l'on gagne de temps d'execussion
a ce jour
si je compare
createhtmltable2 à publish je suis plus rapide pour la construction de la table +CSS par code
là ou @Dudu2 gagne c'est la compil des images dans un dossierpas de beaucoup mais quand même
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
@patricktoulon, j'ai bien créé un fichier Excel, inclu tout le bazar et copié ton code dans le VBA.
J'exécute et obtiens toto.htm ici copié en .txt.
Que suis-je supposé découvrir. Je n'y comprends strictement rien. S'il y a un enseignement à en tirer je ne sais pas de quoi il s'agit. Il n'y a aucune trace d'image dans le HTML. Est-ce pour les ID= en relation avec les cellules ? Et donc qu'en fait-on ?

Ce qu'il me faut savoir c'est ce qu'on doit mettre dans la table au niveau des TD pour inclure les images, quelle syntaxe, quelles tags et comment sont calculées les valeurs de position etc...
 

Pièces jointes

  • toto.txt
    19.8 KB · Affichages: 0

patricktoulon

XLDnaute Barbatruc
@patricktoulon, j'ai bien créé un fichier Excel, inclu tout le bazar et copié ton code dans le VBA.
J'exécute et obtiens toto.htm ici copié en .txt.
Que suis-je supposé découvrir. Je n'y comprends strictement rien. S'il y a un enseignement à en tirer je ne sais pas de quoi il s'agit. Il n'y a aucune trace d'image dans le HTML. Est-ce pour les ID= en relation avec les cellules ? Et donc qu'en fait-on ?

Ce qu'il me faut savoir c'est ce qu'on doit mettre dans la table au niveau des TD pour inclure les images, quelle syntaxe, quelles tags et comment sont calculées les valeurs de position etc...
@Dudu2 avec cette version publish ou les TD ont leur id
et bien tu greffe simplement ma function PutShapOnHtmlOutlook
ensuite tu greffe une de nos fonction shapetopngfile
et voilà il n'y a rien de compliqué
faut il que je livre un exemplaire ?
VB:
'****************************************************************************************************
Function PutShapOnHtmlOutlook(CdeHTML$, Rng As Range, Optional ByVal DossierImage$ = "")
'Function d'ajout des emmbeds image 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 = Replace(shap.Top - cel.Top - 1, ",", ".") & "pt"
                .Width = Replace(shap.Width * 1.04, ",", ".") & "pt"
                .Height = Replace((shap.Height) * 1.2, ",", ".") & "pt"
            End With
            TD.appendchild (VrecT)
            With ImG.Style
                .Position = "absolute"
                .Left = Int(Int(shap.Left) - cel.Left - 1) & "pt"
                .Top = Replace(shap.Top - cel.Top, ",", ".") & "pt"
                .Width = Replace(shap.Width * 1.07, ",", ".") & "pt"
                .Height = Replace((shap.Height) * 1.1, ",", ".") & "pt"
                .zIndex = 1
            End With
            A = A + 1
            ImG.src = Mid(DossierImage, InStrRev(DossierImage, "\") + 1) & "\" & "image" & A & ".png"    ' Replace(shap.Name, " ", "_") & ".png"
            Set VfilL = DcO.createElement("pre")
            VfilL.setattribute "type", "frame"
            VfilL.setattribute "bal", "v:fill"
            VfilL.setattribute "src", "image" & A & ".png"    ' 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
 

Dudu2

XLDnaute Barbatruc
Je peux affirmer que je ne comprends strictement rien à ton code de CreateHtmlPublish(). Ça m'échappe totalement. Trop complexe pour moi. Tu es bien sûr que les ID des cellules sont corrects ?

Je ferai ça demain.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
a oui j'en suis sur 😅
apres je t'averti je viens de rencontrer un autre probleme
pubish nous rend une table de 3 colonnes (de c4 a E13)tout simplement parce que derrière la photo il n'y a que des cellules vides
alors somme toute c'est pas un problème puisque d'ailleurs toi du préfère le displayGridline false

le problème il est que ta belle vue sur le canal avec ses jolies barquettes
ben elle est en malheureusement F4 c'est baloh hein !!!!

moi je te le dis avec publish on a pas fini d'en voir des vertes et des pas mures
diabolo.gif
 

patricktoulon

XLDnaute Barbatruc
et ben dis donc tu vois pas
des fois dudu tu me fait peur
alors
quand on publie une plage en l’occurrence ici C4:I13 il ne publie que C4:E13 car le reste est vide
conclusion le TD qui devrait correspondre au F4 ben il existe pas tout simplement
alors pour lui mettre un tag v:rect et un tag IMG ben walouh tu repassera

des fois tu me fait vraiment peur toi 🤣
je me dis il a des moments d’absence ou quoi ??

quand on publie avec les shapes là oui il les mets les cellules vides sauf qu'il imbrique 3 table pour les padding a gogo qu'il rajoute et c'est impossible a retravailler

comme je disais a Staple1600 bien séduisant ce publish au depart mais c'est tout
conclusion il va falloir que je bluffe le publish
et on rajoute des trucs ,et on rajoutes des trucs ...........
 

Dudu2

XLDnaute Barbatruc
N'ai pas peur, je n'y connais pas grand chose en HTML comme je l'ai dis précédemment et je n'ai pas fait les analyses de Table HTML que tu as faites.
Ma première réaction serait de dire...si TD de F4 n'existe pas, il faut en forcer la construction en mettant un espace en cellule ou quelque chose (couleur fond = couleur car) qui oblige Publish à créer le TD.
Donc avant le Publish, parcours du range et valorisation des cellules vides.
 

patricktoulon

XLDnaute Barbatruc
oui c'est exacte c'est ce que j'ai fait

alors
j'ai la sub de test nommé"testByPublish" qui appelle les passerelles (tu aimes bien ça toi hein 😅 )
elle appelle quoi:
la fonction CreateHtmlPublish(pour construire la table html avec publish
la fonction PutShapOnHtmlOutlook cette fonction crée les embbeds images dans le code
la fonction DrawingObjects_To_Png_File3 c'est la fonction d'export en png (on peut mettre la tienne)

roulement de tambour !!!!!
un résultat tellement parfait que l'on crois rêver meme taille,meme position ,meme tout
1663357455415.png


et tant qu'a faire allons y pour outlook aussi
c'est moins parfait mais c'est sérieusement très proche

1663358436833.png
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 393
Messages
2 088 006
Membres
103 697
dernier inscrit
BOUZOUALEGH