EXCEL :: Les Tableaux Structurés :: Une classe VBA pour mieux les gérer - V1.01 - Evolutions majeures exports CSV, XML, JSON

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dans une version je passe par un shape temporaire que j'efface à la fin et dans une autre je le fais direct...
en gros sans fioritures pour l'incorporer correctement dans la classe.... ça donnerait ceci via ces deux méthodes qui ont fait leurs preuves

Sub range2_image()
Dim rgExp As Range
Set rgExp = Range("A2😀5")
rgExp.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
With ActiveSheet.ChartObjects.Add(Left:=rgExp.Left, Top:=rgExp.Top, _
Width:=rgExp.Width, Height:=rgExp.Height)
.Name = "_$$§§temp§§$$_"
.Activate
End With
ActiveChart.Paste
ActiveSheet.ChartObjects("_$$§§temp§§$$_").Chart.Export ThisWorkbook.Path & "\range20250501_image.jpg"
ActiveSheet.ChartObjects("_$$§§temp§§$$_").Delete
End Sub


Sub Range_To_Image()
Dim objChrt As Chart
Dim rngImage As Range
Dim strFile As String
Set rngImage = Range("A2😀5")
rngImage.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
strFile = ThisWorkbook.Path & "\Range_To20250501_Image_haus.jpg"
Set objChrt = ActiveSheet.ChartObjects.Add(rngImage.Left, rngImage.Top, rngImage.Width, rngImage.Height).Chart
With objChrt
.Parent.Activate
.ChartArea.Format.Line.Visible = msoFalse
.Paste
.Export strFile
.Parent.Delete
End With
End Sub
 
ok
si on reste sur ton acabit de codage

le 3eme argument c'est avec header ou pas

VB:
Sub exportToImagePNG_01()
Call INSTANCIATE_02
    Call oTS.exportToImagefile(ThisWorkbook.Path & "\TestExportToPNG.png", True, True)
End Sub

Sub exportToImageJPG_01()
Call INSTANCIATE_02
    Call oTS.exportToImagefile(ThisWorkbook.Path & "\TestExportToJPG.jpg", True, True)
End Sub

dans la classe
VB:
Sub exportToImagefile(hFileName As String, Optional hReplace As Integer = True, Optional header As Boolean = False)
   'patricktoulon
   Dim Graph As Chart
    Dim pl As Range
    If pOTools.isFileExists(hFileName) Then
        If hReplace <> -1 Then
            Err.Raise _
      ERROR_MESSAGE, _
      ERROR_SOURCE, _
      ERROR_MSG & " : Le fichier " & hFileName & " existe déjà"
        End If
    End If
    Close
    If header Then
        Set pl = pDataBody.Offset(-1).Resize(pDataBody.Rows.Count + 1)
    Else
        Set pl = pDataBody
    End If
    pl.CopyPicture 'on reste en xlpicture(meilleure qualité)
    Set Graph = ActiveSheet.ChartObjects.Add(0, 0, 0, 0).Chart
    ActiveSheet.Shapes(Graph.Parent.Name).Line.Visible = msoFalse
    With Graph.Parent
        .Width = pl.Width: .Height = pl.Height: .Left = pl.Width + 20:
        .Select
        .Activate
        Do: DoEvents
        .Chart.Paste
    Loop While .Chart.Pictures.Count = 0
    'le format depend de l'extension
    .Chart.Export hFileName, Right(hFileName, 3)
End With
Graph.Parent.Delete
End Sub

patrick 😉
 

Pièces jointes

ok
si on reste sur ton acabit de codage

le 3eme argument c'est avec header ou pas

VB:
Sub exportToImagePNG_01()
Call INSTANCIATE_02
    Call oTS.exportToImagefile(ThisWorkbook.Path & "\TestExportToPNG.png", True, True)
End Sub

Sub exportToImageJPG_01()
Call INSTANCIATE_02
    Call oTS.exportToImagefile(ThisWorkbook.Path & "\TestExportToJPG.jpg", True, True)
End Sub

dans la classe
VB:
Sub exportToImagefile(hFileName As String, Optional hReplace As Integer = True, Optional header As Boolean = False)
   'patricktoulon
   Dim Graph As Chart
    Dim pl As Range
    If pOTools.isFileExists(hFileName) Then
        If hReplace <> -1 Then
            Err.Raise _
      ERROR_MESSAGE, _
      ERROR_SOURCE, _
      ERROR_MSG & " : Le fichier " & hFileName & " existe déjà"
        End If
    End If
    Close
    If header Then
        Set pl = pDataBody.Offset(-1).Resize(pDataBody.Rows.Count + 1)
    Else
        Set pl = pDataBody
    End If
    pl.CopyPicture 'on reste en xlpicture(meilleure qualité)
    Set Graph = ActiveSheet.ChartObjects.Add(0, 0, 0, 0).Chart
    ActiveSheet.Shapes(Graph.Parent.Name).Line.Visible = msoFalse
    With Graph.Parent
        .Width = pl.Width: .Height = pl.Height: .Left = pl.Width + 20:
        .Select
        .Activate
        Do: DoEvents
        .Chart.Paste
    Loop While .Chart.Pictures.Count = 0
    'le format depend de l'extension
    .Chart.Export hFileName, Right(hFileName, 3)
End With
Graph.Parent.Delete
End Sub

patrick 😉
Ouaa tu as dégainé plus vite que moi..... Lucky Luc 😉
dans le principe je comptais partir dans cette direction.....
je reprends tout ça demain... c'est 1er mai aujourd'hui lol 🙂 merci
Une V1.04 est dans la boîte.
Elle sera complétée par une V1.05 pour l'export PDF et autres manières d'exporter au format image... ainsi ça sera complet
On peut encore aller plus loin dans cette classe... certes... à voir....
Certainement y ajouter la conversion tableau en plage de données car c'est aussi assez fréquent et aussi la création d'un tableau TS à partir d'une plage (le cas inverse) en y insérant le choix du style de tableau.... avec différentes mises en possibles.....
 
Dernière édition:
ok
si on reste sur ton acabit de codage

le 3eme argument c'est avec header ou pas

VB:
Sub exportToImagePNG_01()
Call INSTANCIATE_02
    Call oTS.exportToImagefile(ThisWorkbook.Path & "\TestExportToPNG.png", True, True)
End Sub

Sub exportToImageJPG_01()
Call INSTANCIATE_02
    Call oTS.exportToImagefile(ThisWorkbook.Path & "\TestExportToJPG.jpg", True, True)
End Sub

dans la classe
VB:
Sub exportToImagefile(hFileName As String, Optional hReplace As Integer = True, Optional header As Boolean = False)
   'patricktoulon
   Dim Graph As Chart
    Dim pl As Range
    If pOTools.isFileExists(hFileName) Then
        If hReplace <> -1 Then
            Err.Raise _
      ERROR_MESSAGE, _
      ERROR_SOURCE, _
      ERROR_MSG & " : Le fichier " & hFileName & " existe déjà"
        End If
    End If
    Close
    If header Then
        Set pl = pDataBody.Offset(-1).Resize(pDataBody.Rows.Count + 1)
    Else
        Set pl = pDataBody
    End If
    pl.CopyPicture 'on reste en xlpicture(meilleure qualité)
    Set Graph = ActiveSheet.ChartObjects.Add(0, 0, 0, 0).Chart
    ActiveSheet.Shapes(Graph.Parent.Name).Line.Visible = msoFalse
    With Graph.Parent
        .Width = pl.Width: .Height = pl.Height: .Left = pl.Width + 20:
        .Select
        .Activate
        Do: DoEvents
        .Chart.Paste
    Loop While .Chart.Pictures.Count = 0
    'le format depend de l'extension
    .Chart.Export hFileName, Right(hFileName, 3)
End With
Graph.Parent.Delete
End Sub

patrick 😉
Bonjour/Bonsoir Patrick
.Chart.Export hFileName, Right(hFileName, 3) ==> voir mon code dans la nouvelle version 1.05
Je le gère autrement quelque-soit la longeur de l'extension... si tu demandes un JPEG par exemple.... ou autre extension à la C... je la récupère toujours 😉 🙂
 
Bonsoir @oguruma
ceci ira pour tout si tu veux
VB:
.Chart.Export hFileName, Mid(hFileName, InStrRev(hFileName, ".")+1)
allez je vais regarder cette V 1.05
Dans la 1.05 à propos de la pile, là aussi que j'ai ressorti des cartons cette classe mise à l'épreuve chez un client (le même) pour tracer les appels de procédures en cas d'erreurs... bon ça fonctionnait avec un peu de rigueur dans le code dans la gestion des entrées et sorties de procédures.
 
Hello,
A noter que pour l'export d'image de tableaux structurés, le format jpeg n'est pas l'idéal si le fond du T.S est constitué de couleurs unies (pas d'image ou de dégradés).
1 - Si on zoome l'image enregistrée en Jpeg on voit qu'il y a de la dégradation sur les contours .
Le format idéal pour ce type de capture est le PNG :
1 - Pas de dégradation
2 - Le fichier enregistré est plus petit que pour un jpeg :
exemple pour le T.S de démo du classeur de démo JPEG : 72 Ko PNG: 16 Ko
Et pour les exports en CSV, HTML, RTF, XML quand on fait un copy sur une plage de feuille, ces formats sont présents dans le presse-papier.
Dans la démo de mon complément XlDnaLibJP , il y a une macro qui sauvegarde une plage de données dans ces types de fichiers en utilisant le
presse-papier. A noter que les fichiers générés sont plus complets que ceux de ta classe VBA (ex polices pour le HTML) , mais l'inconvénient c'est qu'il y a quelques données parasites en début ou en fin de certains fichiers qu'il faut éliminer pour avoir une lecture correcte du fichier.
Ami calmant, J.P
 
Hello,
A noter que pour l'export d'image de tableaux structurés, le format jpeg n'est pas l'idéal si le fond du T.S est constitué de couleurs unies (pas d'image ou de dégradés).
1 - Si on zoome l'image enregistrée en Jpeg on voit qu'il y a de la dégradation sur les contours .
Le format idéal pour ce type de capture est le PNG :
1 - Pas de dégradation
2 - Le fichier enregistré est plus petit que pour un jpeg :
exemple pour le T.S de démo du classeur de démo JPEG : 72 Ko PNG: 16 Ko
Et pour les exports en CSV, HTML, RTF, XML quand on fait un copy sur une plage de feuille, ces formats sont présents dans le presse-papier.
Dans la démo de mon complément XlDnaLibJP , il y a une macro qui sauvegarde une plage de données dans ces types de fichiers en utilisant le
presse-papier. A noter que les fichiers générés sont plus complets que ceux de ta classe VBA (ex polices pour le HTML) , mais l'inconvénient c'est qu'il y a quelques données parasites en début ou en fin de certains fichiers qu'il faut éliminer pour avoir une lecture correcte du fichier.
Ami calmant, J.P
Pour clarifier les choses... à l'époque où je l'ai écrite l'idée n'était pas de faire du Beau style "les Beaux Arts" mais de présenter un tableau ou un graph en image dans un flash info... ce qui comptait le plus c'était les chiffres concernant les traitements et voir si leur courbe respectait bien la cadence nuit... car il fallait être au top à la mise en prod du projet sans pénaliser l'ouverture des agences... c'était une diffusion à titre fonctionnelle où les KPI prenaient le dessus sur la beauté du graphique et des couleurs... donc je ne m'y suis pas trop attardé surtout sur un poste de chefferie de projet où j'avais d'autres priorités à gérer. Mais dans un autre contexte dans le but de produire une belle image pour l'implémenter sur un site web par exemple je te rejoins... mais ça n'était pas dans le cahier des charges de l'époque.. donc je n'ai pas creusé plus, l'image sortie suffisait pour alimenter une web conf... car c'était aussi le but.... 🙂 merci... je retiens l'idée
 
Pour clarifier les choses... à l'époque où je l'ai écrite l'idée n'était pas de faire du Beau style "les Beaux Arts" mais de présenter un tableau ou un graph en image dans un flash info... ce qui comptait le plus c'était les chiffres concernant les traitements et voir si leur courbe respectait bien la cadence nuit... car il fallait être au top à la mise en prod du projet sans pénaliser l'ouverture des agences... c'était une diffusion à titre fonctionnelle où les KPI prenaient le dessus sur la beauté du graphique et des couleurs... donc je ne m'y suis pas trop attardé surtout sur un poste de chefferie de projet où j'avais d'autres priorités à gérer. Mais dans un autre contexte dans le but de produire une belle image pour l'implémenter sur un site web par exemple je te rejoins... mais ça n'était pas dans le cahier des charges de l'époque.. donc je n'ai pas creusé plus, l'image sortie suffisait pour alimenter une web conf... car c'était aussi le but.... 🙂 merci... je retiens l'idée
Je viens de regarder... bon c'est assez propriétaire... et pas certain que ça rentre dans les clous chez un client quand tu reçois un poste bridé avec interdictions de toutes implémentations externes... dotNet, DNA, etc. etc...
surtout dans des milieux hyper sécurisés comme dans le domaine bancaire... pour ne pas en dire plus sur le sujet...
c'est bien pour du développement personnel ou si le dotNet est autorisé quand tu interviens dans un projet client
je milite pour la simplicité quand cela possible..... et non pour les montages externes propriétaires...
du reste dotNet était assez mal vu à une époque pour les trous de sécurité ....

1746266687912.png


déjà ça
1746266731855.png
tu oublies quand tu es dans un milieu sécurisé avec un poste bridé avec les risques de te faire sortir de mission - et j'en ai vu.... ça ne rigole pas dans ce milieux 😉 😉 🙂 toutes tes actions sur le poste qu'on te file sont tracées 🙁 y compris les mails externes
 
Je viens de regarder... bon c'est assez propriétaire... et pas certain que ça rentre dans les clous chez un client quand tu reçois un poste bridé avec interdictions de toutes implémentations externes... dotNet, DNA, etc. etc...
Tout à fait d'accord avec toi mon complément c'est plutôt pour une utilisation personnelle où l'on maîtrise les autorisations pour son PC.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour