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
j'ai fais une petite erreur en deplacant les dossier
et je viens de decouvrir que tu peux faire sans CID
maintenant d'ailleurs le :
"http://schemas.microsoft.com/mapi/proptag/0x3712001F" n'est plus dispo
en fait tu ajoute tes piece jointe normalement
avec mon modele
VB:
 OLmail.Attachments.Add elem.getattribute("local"), olByValue, 0, elem.src
comme je n'ai mis que le nom des images dans le src le 4 eme argument recois le nom qui est utilisé

demo
demo.gif
 

Pièces jointes

  • testoutlook for DUDU.xlsm
    24.1 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
bon voila le resultat final avec ma methode userformetwebbrowser
demo.gif


voila le fichier html avec son dossier d'image obtenue
tu constatera que dans les tag img j'ajoute des attributs (c'est pour les passer dans outlook sans devoir aller chercher midi 14 heures

si ça c'est pas du code propre
 

Pièces jointes

  • resultat.zip
    448.2 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc

patricktoulon

XLDnaute Barbatruc
et oui il faut attendre l’approbation
je peux copier les shapes les controls de formulaire les graphiques mais pas les activx visiblement
tu a testé le dernier html que je t'ai envoyé ?
je vais faire maintenant le module outlook qui va traiter le code html que je fait avec mon userform converter les chemin des images et CID sont codé dans des attribut dans le code (je sais pas si tu a vu) ;)

et j'ai toujours ma fonction de convertion par code qui fonctionne très bien aussi a la quelle je pourrais ajouter les modules outlook et export png
 

patricktoulon

XLDnaute Barbatruc
c'est juste un récupérateur d'image png dans les tempcréées dynamiquement quand tu copi ave copywithobject et que tu paste dans un webbrowser

si tu a les image tu n'a donc plus besoins des code imbuvable avec les v et shapetype et autre dans le code html
et rien ne empêchera de retransformer tes image en base 64 si tu y tiens

qu'est ce qui est confus?

ce que je propose finalement
  1. oublie mais alors oublie le" publier en html"
  2. récupérer ta table proprement ' la manière que tu veux (j'en ai 2 a ta dispo)
  3. récupérer toute les shapes en tant que fichier image( tu a l'outils fonctionnel pour ça maintenant)
  4. les placer dans le document avec le tag"IMG"
  5. pour le src c'est comme tu veux soit tu y met le link soit le code base64

au regard de ce que fait le publier en terme de résultat (je parle de ce code imbuvable)
pour arriver a positionner les éléments il construit des sous sous sous balise barder de CSS
la table est accessible avec la souris que sur 2 ou 3 cellules
ca reviendrait a dire que la sauver en image et mettre simplement la capture dans un html reviendrait a la même chose

je peux te monter comment on construit une table html sur la base d'une plage si tu veux
bien que mon astuce webbrowser fonctionne très bien (c'est pour les fainéants 😂 )
 

Dudu2

XLDnaute Barbatruc
oublie mais alors oublie le" publier en html"
Si ce n'était Outlook, cela ne poserait aucun problème car je suppose que tous les afficheurs de HTML (sauf Outlook et probablement Word) savent gérer le Base64 Inline (tous les Browsers Web, Thunderbird et probablement la quasi-totalité des autres clients Mail).

Mais bon, Outlook étant communément utilisé, il faut se résoudre à trouver une autre solution et j'attends de pouvoir tester / utiliser la tienne.

Et je te fais confiance sur la création à la mano d'une table HTML et ses Tags mais si tu as une solution WebBrowser directe, à la limite je préfère.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
je te montre LA BASE du comment on construit une table html
sans sans couleur et tout le toutim
c'est juste pour te montrer comment on construit la structure d'une table html EN DOM( modèle objet de document
et en plus ma méthode accepte les fusions de cellules
c'est un morceau de mon module

j'ai mis des commentaires à GOGO
contrairement a mon habitude je n'ai pas compresser le code je l'ai bien indenté et détaillé
tu va voir c'est d'une simplicité
VB:
Option Explicit
colle  ça dans un module
Sub test()
    Dim code, i&, fichier
    code = CreateTableBase([A1:E3])
    fichier = Environ("userprofile") & "\Desktop\ tablehtmldebase.html"
    i = FreeFile
    Open fichier For Output As #i
    Print #i, code
    Close #i
End Sub
Function CreateTableBase(RnG As Range)
' fonction de base de creation de table html sur la base d'une plage de cellule (accepte les fusions )
' patricktoulon
    Dim lig&, col&, Cel As Range, AddR$, Doc As Object, Table, TR, TD
    Set Doc = CreateObject("htmlfile")    ' creation d'un dochtml virtuel(en memoire )(late binding donc sans reference )

    Set Table = Doc.createelement("table")    'creation de l'element html table

    Doc.body.appendchild (Table)    ' on la met dans le body du document virtuel

    With Table.Style
        'le CSS de la table ici
        .Width = Int(RnG.Width) + 1 & "pt"    'largeur
        .Height = Int(RnG.Height) + 1 & "pt"    'hauteur
        .bordercollapse = "collapse"    'les cellule html seront cote à cote sans espacement
    End With

    For lig = 1 To RnG.Rows.Count   'boucle sur les lignes de la plage(RnG)

        Set TR = Doc.createelement("TR")    'creation d'une ligne dans la table HTML

        Table.appendchild (TR)    ' on la met dans l'element "Table"

        For col = 1 To RnG.Columns.Count   ' boucle sur les colonnes de la plage (RnG)

            Set Cel = RnG.Cells(lig, col).MergeArea: AddR = Cel.Address(0, 0)    'on determine l'aera de la cellule(lig,col) et son address

            If Doc.getelementbyId(AddR) Is Nothing Then    ' si L 'element portant l'id(addresse de la cellule.mergearea((ou fusion))) on  la crée

                Set TD = Doc.createelement("TD")    'creation de la cellule HTML dans la la ligne HTML de la table HTML

                TR.appendchild (TD)    'on met la cellule la  ligne (balise TR précedemment créée)

                With TD
                    'les attributs ici on peut mettre ce qu'on veux
                    
                    'exemple  .setattribute IndexColonne,cel.column
                    
                    .ID = AddR    ' on lui donne un id correspondant a l'adress de son homologue dans la feuille
                    
                    .innerhtml = CStr(Cel.Cells(1).Value) ' on lui met le texte de son homologue dans la feuille
                    
                    .rowspan = Cel.Rows.Count 'fusion de ligne(ne fait rien si il n'y a pas de fusion de ligne)
                    
                    .colspan = Cel.Columns.Count ' fusion de colonne ( ne fait rien si il n'y a pas de fusion de colonne)
                    
                    With .Style
                        'le style de la cellule ici
                        .Width = Int(Cel.Width) & "pt" 'la largeur de la cellule
                        .Height = Int(Cel.Height) & "pt" 'la hauteur de la cellule
                        .Border = "1px solid black"    'pour la demo je met toutes les bordure en noir
                    End With


                End With
            End If
        Next
    Next
    CreateTableBase = Doc.body.innerhtml
End Function
après bien sur il faut ajouter les couleusr et tout les style les alignement de texte etc...
mais là tu est sur de gérer la structure
si tu comprends ce code je te donnerais au fur et a mesure la suite ;)
je n'ai pas donné la méthode webbrowser car il faut penser que tout le monde ne l'a pas forcément
il faut y penser à ça si tu veux faire une source ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 555
Messages
2 089 550
Membres
104 208
dernier inscrit
laura29180