Vous aussi vous trouvez qu'il est assez pénible de faire des captures d'écran de vos tableaux et vos graphiques en Excel? Que cela prend du temps? Alors continuez à lire car je vais vous expliquer comment facilement automatiser cette tâche et exporter Excel comme image.
Le code qui suit a encore un grand avantage: il est possible d'exporter une image qui, normalement, dépasserait la taille de l'écran! Ce qui n'est pas possible avec un simple capture d'écran – à moins de commencer à jouer avec le Zoom de la Feuille ce qui peut avoir un impact négatif sur la lisibilité.
Le code que je vous propose est donc beaucoup plus pratique qu'une capture d'écran classique!
Sommaire
VBA: exporter une partie de fichier Excel vers un fichier image
Il est tout à fait possible d'exporter un fichier Excel (.xls ou .xlsx etc.) ou une partie de celui-ci en tant qu'image (.jpg, .png, .bmp). Ceci peut considérablement économiser le temps (vous ne devez pas passer par un logiciel de capture d'écran) et surtout apporter de la précision: vous ne devez pas "essayer de couper la sélection au mieux". Le code suivant va exporter EXACTEMENT la partie du fichier Excel dont vous avez besoin. Au millimètre près!
Format de l'image – type de fichier
Avec le code qui suit, vous pouvez exporter un tableau Excel vers différentes types d'image. Mais lequel choisir? Voici un petit aperçu des formats es plus utilisés:
- JPG / JPEG – Joint Photographic Experts Group: il s'agit d'une image compressée qui permet de garantir une qualité d'image suffisante tout en gardant une taille réduite du fichier.
- PNG – Portable Network Graphics: Ceci est aussi l'image comprimée mais contrairement à JPG, il s'agit d'un format ouvert (Open Source).
- BMP – Windows bitmap : ceci est une image non comprimée. Vous ne perdez donc rien en qualité, par contre les fichiers BMP sont beaucoup plus volumineux que leur équivalent en JPG ou PNG.
Le code VBA qui suit peut être utilisé pour les 3 types de fichiers. En fait c'est simple: la méthode d'export utilisée est déterminée par le nom du fichier. Il ne faut pas la spécifier en particulier. Dans la suite de ce tutoriel, j'ai décidé d'utiliser les fichiers .JPG
car c'est le format le plus répandu. Si vous voulez utiliser un autre, il vous suffit de changer le suffixe dans le nom du fichier (donc à la place de C:\temp\MonImageExcel.jpg
, vous utiliserez C:\temp\MonImageExcel.bmp
).
Comment fonctionne le code VBA?
Et voici comment tout cela fonctionne du point de vue de l'utilisateur: Tout d'abord, on doit sélectionner une plage des cellules que l'on veut "exporter". La "plage" sélectionnée est copié à l'intérieur d'un graphique temporaire. Ce graphique est exporté en tant qu'image et ensuite, il est supprimé du fichier Excel. Tout cela se déroule à l'arrière plan et l'utilisateur ne remarquera rien.
Deux variantes de fonction VBA pour exporter vers un fichier .JPG
- La première variante (Variante A) a un seul paramètre (de type
Range
): la plage de cellules à exporter. Le choix de l'emplacement et du nom du fichier image se fait via le dialogue Excel "Sauvegarder sous…" - La deuxième variante (variante B), plus complexe mais également plus flexible, utilise toutes les informations nécessaires comme paramètres: la plage à exporter (argument de type
Range
), l'affichage (ou pas) des lignes de grilles (argument de typeBoolean
) et l'emplacement et le nom du fichier exporté (argument de typeString
).
Le code VBA de la fonction "ExporterPlageCommeImage" – variante A
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Public Function ExporterPlageCommeImage(PlageAExporter As Range) 'par: Excel-Malin.com ( https://excel-malin.com ) On Error GoTo FonctionErreur 'cacher ou afficher les lignes de grille ActiveWindow.DisplayGridlines = False ' or True 'Copier la PlageAExporter comme image dans le Presse-papier PlageAExporter.CopyPicture Appearance:=xlScreen, Format:=xlPicture 'Créer un nouveau "graphique" temporaire qui servira de support - avec la taille exacte de la plage à exporter With ActiveSheet.ChartObjects.Add(Left:=PlageAExporter.Left, Top:=PlageAExporter.Top, _ Width:=PlageAExporter.Width, Height:=PlageAExporter.Height) .Name = "ExportImage" .Activate End With 'Copier l'image dans le graphique, ouvrir le dialog de "Sauvegarder sous", sauvegarde le fichier et supprime le graphique temporaire ActiveChart.Paste FichierImage = Application.GetSaveAsFilename(InitialFileName:="*.jpg", FileFilter:="Image file (*.jpg), *.jpg") If FichierImage = False Then Exit Function ActiveSheet.ChartObjects("ExportImage").Chart.Export FichierImage ActiveSheet.ChartObjects("ExportImage").Delete Exit Function FonctionErreur: MsgBox "Une erreur est survenue..." End Function |
Le code VBA de la fonction "ExporterPlageCommeImage" – variante B
Et voici la version qui vous permet d'utiliser les informations nécessaires en tant que arguments.
Remarque pratique: Notez que l'on stocke dans la mémoire (variable LignesDeGrilleOriginal
) l'état actuel d'affichage de grilles avant l'export. Une fois l'export effectué, on remets l'affichage dans l'état de départ. Ceci est important car le but n'est pas de modifier les réglages de l'utilisateur. La meilleure pratique est de "restituer" l'Excel à son utilisateur sans aucun changement qu'il n'a pas demandé…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Public Function ExporterPlageCommeImage2(PlageAExporter As Range, LignesDeGrille As Boolean, FichierImage As String) 'par: Excel-Malin.com ( https://excel-malin.com ) On Error GoTo FonctionErreur 'cacher ou afficher les lignes de grille LignesDeGrilleOriginal = ActiveWindow.DisplayGridlines 'affichage d'origine ActiveWindow.DisplayGridlines = LignesDeGrille 'applique l'affichage pour l'export 'Copier la PlageAExporter comme image dans le Presse-papier PlageAExporter.CopyPicture Appearance:=xlScreen, Format:=xlPicture 'Créer un nouveau "graphique" temporaire qui servira de support - avec la taille exacte de la plage à exporter With ActiveSheet.ChartObjects.Add(Left:=PlageAExporter.Left, Top:=PlageAExporter.Top, _ Width:=PlageAExporter.Width, Height:=PlageAExporter.Height) .Name = "ExportImage" .Activate End With 'Copier l'image dans le graphique, sauvegarder le fichier et supprimer le graphique temporaire ActiveChart.Paste ActiveSheet.ChartObjects("ExportImage").Chart.Export FichierImage ActiveSheet.ChartObjects("ExportImage").Delete 'remet l'affichage des grilles à l'état avant export ActiveWindow.DisplayGridlines = LignesDeGrilleOriginal Exit Function FonctionErreur: MsgBox "Une erreur est survenue..." End Function |
L'exemple d'utilisation de la fonction d'export vers fichier JPG (variante B)
Dans le code VBA qui suit, nous allons exporter la plage A1:Z100
de la Feuille "test" vers un fichier image MonImageExcel.jpg
dans le dossier C:\temp\
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub ExempleExportImage() 'par: Excel-Malin.com ( https://excel-malin.com ) Application.ScreenUpdating = False On Error GoTo ExportErreur Dim Plage As Range Dim FichierImage As String Dim AfficherGrilles As Boolean Set Plage = Workbooks("test.xlsx").Sheets("test").Range("A1:Z100").Cells FichierImage = "C:\Temp\MonImageExcel.jpg" AfficherGrilles = True Workbooks("test.xlsx").Activate ExportFichier = ExporterPlageCommeImage2(Plage, AfficherGrilles, FichierImage) Application.ScreenUpdating = True Exit Sub ExportErreur: MsgBox "Une erreur est survenue..." Application.ScreenUpdating = True End Sub |
Conclusion…
Voici donc une simple astuce qui devrait pouvoir vous économiser du temps et de rendre votre travail plus efficace. Surtout si vous devez inclure, de manière régulière (rapports etc.) l'information à partir d'Excel vers un site internet ou encore une présentation PowerPoint. N'hésitez pas à partager vos remarques et/ou suggestions dans les commentaires…
Pour aller plus loin en VBA
Voici quelques articles qui pourraient également vous être utiles pour rendre votre travail avec Excel et VBA plus efficace…
- Liste de toutes les fonctions VBA
- Déterminer la résolution de l'écran
- Utiliser RECHERCHEV (ou une autre fonction Excel) directement en VBA – tutoriel
- Envoyer un email avec VBA (à partir d'Excel)
- Tutoriel sur la gestion des fichiers en VBA
- Codes sources VBA prêts à l'emploi
46 commentaires sur “VBA: Exporter Excel comme image (.jpg, .png, .bmp)”
Je suis étonné de ne voir que rarement (jamais ?) parler de outil Photo. Certes il est bien caché (accesible à ma connaissance seulement par la personnalisation du ruban) mais il permet cette capture d'image directemment.
Ici, il s'agit de la solution VBA qui a l'avantage d'être utilisable à l'intérieur des macros (et donc tout à fait automatisé).
Pouvez-vous me dire, quelle est le nom exact de la fonctionnalité "Photo" que vous mentionnez? J'ai cherché dans la liste des fonctionnalités de Excel 2010 et Excel 2013 et je ne l'ai pas trouvé…
Merci pour le tuyau.
Merci beaucoup!
J'ai créé un petit jeu de la vie sur excel. Je voulais exporter certaines création en GIF et cette technique est parfaite pour enregistrer rapidement toutes les itérations dans l'ordre!
Il ne me manque plus qu'à trouver un software permettant de compiler des images jpg en gif :)/
De rien.
Je suis content de savoir que mon travaille puisse aider…
Sinon, pour la conversion jpg –> gif, vous ne devez même pas installer de logiciels: nombreux convertisseurs existent en ligne.
Par exemple: http://image.online-convert.com/convert-to-gif
Bien à vous, Martin
Bonjour,
Merci pour votre super travail. Cela aide vraiment.
Par contre, j'ai un souci :
La macro transforme le tableau en image même dans le fichier. je pensais qu'elle transformait cela en mémoire.
Merci pour votre aide
Une petite Précision:
A l'intérieur de mon tableau, il y a une cellule sur laquelle je fais une boucle pour changer la valeur et donc les éléments de mon tableau changement ) chaque passe de la boucle.
Et comme mon tableau se transforme en image (à la fin de macro) je ne peux pas faire remarcher la macro à moins de fermer le fichier sans l'enregistrer et de le rouvrir ( sinon tableau en image et la cellule sur laquelle je boucle est inaccessible).
Merci
Il y 'avait une petite erreur dans l'adaptation que j'ai faite.Merci, c'est corrigé et ça fonctionne nickel.
Bonjour,
content que vous ayez trouvé la solution. Et que mon code VBA a pu vous aider 😉
Bien à vous, Martin
Oui c'est vraiment très utile.
Aujourd'hui j'ai un autre problème:
.HTMLBody = .HTMLBody & "Disponibles à la location:" _
& "" _
& "Bonne lecture, CdG" _
Dans mon code je fais une boucle pour choisir le bon fichier jpg. Je voudrais donc boucler sur ma colonne E où j'ai toto.jpg à la ligne1, toto2.jpg etc . FichierDisponible ( dans le code ci-dessus) étant une variable
FichierDisponible = mainWB.Sheets("Mail").Range("E" & i).Value.
Je ne sais pas comment taduire ça dans le code HTML.
Merci pour votre aide
En fait, vous voulez inclure dans le code HTML les noms de fichiers ou les images?
Si les noms de fichiers, cela pourrait être comme suit:
Sub exemple1()
ListeImages = ""
For i = 1 To 10
ListeImages = ListeImages & mainWB.Sheets("Mail").Range("E" & i).Value & "<br>"
Next i
.HTMLBody = .HTMLBody & "Disponibles à la location:<br>" _
& ListeImages _
& "<br>Bonne lecture, CdG"
End Sub
Si vous voulez afficher les images, il faut utilizer le tag "<img>". Par exemple comme ça:
Sub exemple2()
ListeImages = ""
For i = 1 To 10
ListeImages = ListeImages & "<img src=""C:\MesImages\" & mainWB.Sheets("Mail").Range("E" & i).Value & """><br>"
Next i
.HTMLBody = .HTMLBody & "Disponibles à la location:<br>" _
& ListeImages _
& "<br>Bonne lecture, CdG"
End Sub
En réalité, je veux adapter le code ci-dessous pour qu'il boucle sur les colonnes et choisir l'image. Dans ce code, le nom des images sont constants. Mon objectif c'est de boucler sur mes colonnes E ( Disponibles) et colonnes F (Taux).
.Subject = Subject
.Attachments.Add "U:\Disponibles.jpg", olByValue, 0
.Attachments.Add "U:\Taux.jpg", olByValue, 0
.HTMLBody = .HTMLBody & "Disponibles à la location:" _
& "" _
& "Bonne lecture, CdG" _
& "Taux d'utilisation:" _
& "" _
& "Bonne lecture, CdG"
Merci d'avance
J'ai l'impression que me copier coller de mon code n'affiche pas tout ??
En effet, on dirait que les tags html ne passent pas 🙁
J'ai pensé à ça :
.Attachments.Add "U:\" & mainWB.Sheets("Mail").Range("E" & i).Value, olByValue, 0
.Attachments.Add "U:\" & mainWB.Sheets("Mail").Range("F" & i).Value, olByValue, 0
.Attachments.Add "U:\" & mainWB.Sheets("Mail").Range("G" & i).Value, olByValue, 0
je n'ai pas encore testé car je ne sais pas reprendre ça dans le HTML
.HTMLBody = .HTMLBody & "Disponibles à la location:" _
& "" _ (cette ligne correspond au nom du fichier jpg contenu dans la colonne E voir les premieres lignes du code .Attachement
& "Bonne lecture, CdG" _
& "Départs & Retours:" _
& "" _ (cette ligne correspond au nom du fichier jpg contenu dans la colonne F voir les premieres lignes du code .Attachement
& "Bonne lecture, CdG" _
& "Taux d'utilisation:" _
& "" _ (cette ligne correspond au nom du fichier jpg contenu dans la colonne G voir les premieres lignes du code .Attachement
& "Bonne lecture, CdG"
Voici ce qu'il vous faut:
http://excel-macro.tutorialhorizon.com/excel-vba-send-mail-with-embedded-image-in-message-body-from-ms-outlook-using-excel/
Dans le .HTMLBody, il faut faire référence à l'image par son nom avec le paramètre "cid" dans le tag "img". Dans le lien, vous le verez très bien… (vers la fin du code VBA)
Théoriquement je vois ce que vous voulez dire mais j'avoue que j'ai du mal à mettre en pratique:
Du coup, ci-après ma macro complète:
Sub Envoi()
Dim mainWB As Workbook
Dim SendID
Dim CCID
Dim Subject
Dim Body
Dim olMail As MailItem
Dim FichierDisponible As Variant
Set otlApp = CreateObject("Outlook.Application")
Set olMail = otlApp.CreateItem(olMailItem)
Set Doc = olMail.GetInspector.WordEditor
'Dim colAttach As Outlook.Attachments
Dim oAttach As Outlook.Attachment
Set mainWB = ActiveWorkbook
For i = 2 To ThisWorkbook.Worksheets("Mail").Range("A" & Rows.Count).End(xlUp).Row
FichierDisponible = mainWB.Sheets("Mail").Range("E" & i).Value
FichierDepartsRetours = mainWB.Sheets("Mail").Range("F" & i).Value
FichierTaux = mainWB.Sheets("Mail").Range("G" & i).Value
SendID = mainWB.Sheets("Mail").Range("B" & i).Value
CCID = mainWB.Sheets("Mail").Range("C" & i).Value
Subject = mainWB.Sheets("Mail").Range("D" & i).Value
Body = mainWB.Sheets("Mail").Range("B4").Value
With olMail
.To = SendID
If CCID "" Then
.CC = CCID
End If
.Subject = Subject
'add the image in hidden manner, position at 0 will make it hidden
.Attachments.Add "U:\" & FichierDisponible, olByValue, 0
.Attachments.Add "U:\" & FichierDepartsRetours, olByValue, 0
.Attachments.Add "U:\" & FichierTaux, olByValue, 0
.HTMLBody = .HTMLBody & "Disponibles à la location:" _
& "" _
ici le fichier Disponibles est renté en dur, je veux récupérer la valeur de ma variable FichierDisponible.
& "" _
ici le fichier DepartsRetours est rentée en dur, je veux récupérer la valeur de ma variable FichierDepartsRetours
& "" _
ici le fichier FichierTaux est rentée en dur, je veux récupérer la valeur de de ma variable FichierTaux
& "Bonne lecture, CdG"
.Display
.Send
End With
Next i
end sub
merci
les tags HtmL passent pas
je vais essayer une méthode
HTMLBody = .HTMLBody & "Embedded Image:" _
& "" _
& "Best Regards, Sumit"
Non ca ne fonctionne pas . Mais J'ai juste repris le code de la page que vous m'avez suggérez et j'ai changé (img src='cid:city.jpg' ) le nom de l'image par ma variable.
Merci
Et si vous essayez le code que je vous ai préparé dans un fichier txt à part?
N'oubliez pas de cocher "Microsoft Outlook 1x.0 Object Library" dans les Références
Cela marche?
Bonjour,
Non cela ne fonctionne. Je guettais votre aide depuis mais j'imagine que vous devez être très pris. 😉
C'est déjà coché. En fait la macro fonction bien pour envoyer des mails avec les mêmes images dans le corps du mail mais moi mon souhait c'est de choisir l'image en fonction de la boucle.
Bonjour,
je trouve votre variante B bien intéressante, mais débutant en VBA je bute sur une erreur. A l'exécution de la macro cela bug sur
ExporterPlageCommeImage2
et j'avoue ne pas comprendre car je n'ai changé que le nom de fichier, la feuille et la zone.
Merci par avance
François
Bonjour François,
vous avez bien copié les deux parties du code dans votre Classeur?
Il faut que vous mettiez les codes n°2 et n°3 sur cette page en même temps.
Le n°2 (fonction
ExporterPlageCommeImage2
) fait l'export en soi, la partie n°3 (procédureExempleExportImage
) lance la fonction en lui transmettant les arguments nécessaires à son exécution (ici la plage, si oui/non pour la grille et le nom de fichier).Si vous n'avez copié que le code n°3, il va essayer de lancer la fonction
ExporterPlageCommeImage2
mais ne réussira pas car il ne va pas la trouver…Bàv,
Martin
Bonjour et mille mercis
il est vrai qu'avec le code complet cela fonctionne mieux
j'ai encore une large marge de progression
bien cordialement
Avec plaisir…
Il y a toujours une marge de progression 🙂
Mais vous êtes sur la bonne voie!
Bonjour,
Venant de tomber sur votre Macro, je vous remercie !!
Je cherche cependant une optimisation si elle existe :
En sachant que le nom sera automatique, l'utilisateur n'a rien à écrire, est-il possible d'enregistrer sans afficher la boite de dialogue ?
Cordialement.
Bonjour Pinel,
pour cela, il vous suffit d'utiliser la "variante B" de la fonction dans l'article =
ExporterPlageCommeImage2
Dans ce code-là, le nom du fichier est un argument que vous (programmeur) fournissez de la manière qui vous convient. L'utilisateur ne doit pas intervenir.
Vous pouvez voir un exemple – c'est le dernier code VBA sur la page. Il vous suffit de définir la plage à exporter, le nom du fichier et ensuite appeler la fonction
ExporterPlageCommeImage2
.J'espère que cela répond à votre question.
Bien à vous, Martin
Effectivement … Désolé je n'avais pas bien lu la variante B :D.
Merci beaucoup, des heures de traitement sauvées !!
Pas de soucis!
Je suis content que mon travail ait pu vous aider…
Bonjour,
Top merci, il manque juste une fonction qui permet d'augmenter la qualité de l'image. Par exemple un zoom x 3 pour permettre de lire correctement le JPG en plein page.
Bonjour Nono,
merci pour votre retour.
Je viens de tester et j'ai trouvé une solution à votre problème 😉
Voici:
Pour la fonction
ExporterPlageCommeImage2
, changez:en
Les "300" correspondent à un Zoom de 300%. Adaptez-le selon vos besoins.
Ceci est une solution "vite faite bien faite". Quand j'aurai un peu de temps, je vais modifier le code de la fonction en y ajoutant le zoom comme argument optionnel. Et je ferai en sorte d'adapter, après l'export, l'écran au zoom initial (dans le code plus haut je remets le zoom à 100% mais peut-être l'utilisateur avait un zoom différent avant de lancer l'export). Comme cela, l'écran après l'export sera exactement le même qu'avant l'export.
J'espère que cela vous aide.
Cordialement, Martin
Bonjour,
Un grand merci, impressionnant j'ai posté ce matin et j'ai déjà une réponse.
Au top 🙂 je met le site dans les favoris.
Encore merci @excel-malin.com
Bonjour,
Je me permet de refaire une demande, est-il possible dans ce même code de pouvoir sauvegarder le fichier déjà crée avant.
J'aimerai garder une archive des vieux fichier.
encore merci 🙂
bien cordialement,
Re-bonjour,
oui oui, c'est possible… (Presque) Tout est possible en VBA 😉
Voici le nouveau code de la fonction
ExporterPlageCommeImage2
>>> si le fichier existe, il fera la sauvegarde avec le même nom en ajoutant "_nouveau" au nom du fichier (vous pouvez le modifier selon vos besoins)
Cordialement, Martin
Bonjour,
Tout d'abord merci pour ce code
je me permets un petit question.
Est il possible d'enregistre l'image avec la valeur qui serait dan une cellule ( "A5") en lieu et place de nom établi dans la macro (MonImageExcel.JPG)
Par avance merci de notre aide.
Bonjour,
ce que vous demandez est tout à fait possible.
Dans le code remplacez la ligne 12
FichierImage = "C:\Temp\MonImageExcel.jpg"
par
FichierImage = Sheets("XXXX").Range("A5").Value
où vous devez mettre le nom de la feuille à la place de XXXX .
j'espère que cela répond à votre question. Cordialement, Martin
Bonjour
Bravo pour vos macros et merci. Par contre, dès que l'on a des graphes qui comportent des nuances de couleurs les graphes ne sont pas jolis à la sortiecontrairement à des impression écran qui eux gardent fidèlement les nuances de couleur. Comment peut on contourner ce problème sans avoir à retoucher l'ensemble des graphes et mettre des couleurs uniformes?
merci d'avance
Bonjour Dominique,
ceci est dû à la compression lors de la création du fichier JPEG.
Ce que vous pouvez essayer est de changer le
.jpg
dans le nom du fichier image par.png
. C'est aussi une image comprimée mais l'algorithme de compression est différent donc les couleurs pourraient être épargnées.Et si résultat n'est toujours pas optimal, essayez le format Bitmap (remplacer
.jpg
par.bmp
). Là, le résultat devrait être mailleur car l'image n'est pas comprimée et donc les couleurs ne sont pas "comprimées et approximatives"). Ce format garde tout comme vous le voyez sur l'écran.Le prix à payer est la taille de fichiers substentiellement plus grande (pour avoir une idée, je viens de faire le test en exportant un graphique dans les 3 formats: format JPG = 32 Ko, PNG = 20 Ko, BMP = 991 Ko…)
Donc à vous de voir si la taille pose ou pas un problème.
J'espère que ceci résoudra votre problème.
Cordialement, Martin
Merci Martin pour ce rapide retour (superbe prénom, ma fille vient d'accoucher d'un petit Martin, il y a 15j).
J'ai essayé mais même en bmp les parties nuancées et les tiretés ne sortent pas bien, je ne comprends pas trop (je peux vous envoyer un ex si vous me donner votre mail)
Cordialement
re-bonjour,
c'est étonnant… Si vous voulez, vous pouvez m'envoyer un exemple sur contact@excel-malin.com
Bien à vous, Martin
Bonjour
Merci pour cet article
je suis débutant en VBA et donc, je risque d'avoir fait un erreur de débutant.
Cette fonction m'interesse beaucoup car je souhaiterais exporter en image un tableau avec sa mise en page qui correspond a une fiche nutritionelle.
J'ai essayer votre code, plutot la version A qui permet de selectionner l'endoit ou l'on enregistre l'image. Je ne dois pas avoir adapté correctement le code car j'ai un bug.
J'ai compilé le code n°1 et le code n°3 de la façon suivante :
Public Function ExporterPlageCommeImage(PlageAExporter As Range)
'par: Excel-Malin.com ( https://excel-malin.com )
On Error GoTo FonctionErreur
'cacher ou afficher les lignes de grille
ActiveWindow.DisplayGridlines = False
'Copier la PlageAExporter comme image dans le Presse-papier
PlageAExporter.CopyPicture Appearance:=xlScreen, Format:=xlPicture
'Créer un nouveau "graphique" temporaire qui servira de support – avec la taille exacte de la plage à exporter
With ActiveSheet.ChartObjects.Add(Left:=PlageAExporter.Left, Top:=PlageAExporter.Top, _
Width:=PlageAExporter.Width, Height:=PlageAExporter.Height)
.Name = "ExportImage"
.Activate
End With
'Copier l'image dans le graphique, ouvrir le dialog de "Sauvegarder sous", sauvegarde le fichier et supprime le graphique temporaire
ActiveChart.Paste
FichierImage = Application.GetSaveAsFilename(InitialFileName:="NutFactSheetUSA.png", FileFilter:="Image file (*.png), *.png")
If FichierImage = False Then Exit Function
ActiveSheet.ChartObjects("ExportImage").Chart.Export FichierImage
ActiveSheet.ChartObjects("ExportImage").Delete
Exit Function
FonctionErreur:
MsgBox "Une erreur est survenue…"
End Function
Sub ExportImage()
Application.ScreenUpdating = False
On Error GoTo ExportErreur
Dim Plage As Range
Dim FichierImage As String
Dim AfficherGrilles As Boolean
Set Plage = Workbooks("nutritional value2 liste dynamic 2.xlsm").Sheets("Nutritional facts USA").Range("J2:P29").Cells
FichierImage = "C:\Users\BBN\Dropbox\Mon PC (BEREPION)\Desktop"
AfficherGrilles = True
Workbooks("nutritional value2 liste dynamic 2.xlsm").Activate
ExportFichier = ExporterPlageCommeImage(Plage, AfficherGrilles, FichierImage)
Application.ScreenUpdating = True
Exit Sub
ExportErreur:
MsgBox "Une erreur est survenue…"
Application.ScreenUpdating = True
End Sub
J'ai le message d'erreur suivant :
Erreur de compilation:
Nombre d'aguments incorrect ou affectation de propriété incorrecte
et auand je clique sur OK ça me surligne en jaune "Sub ExportImage()" et ça selectionne "ExporterPlageCommeImage"
Je suppose que l'erreur est ici mais je ne vois pas comme la solutionner.
Je vous remercie para vance pour votre aide
Bastien
Bonjour Bastien,
le problème est que vous utilisez le code n°3 (exemple) pour appeler la fonction N°1, or, il est prévu pour la fonction n°2. Et comme les deux fonctions n'ont pas le même nombre de paramètres, l'appel échoue.
Là, c'est le problème n°1, relativement simple à régler.
Le problème n°2 consiste dans le fait que vous séparez le "fichier image" en deux parties: chemin séparément & puis vous utilisez le "sélecteur de fichier", cela ne va pas marcher non plus.
Donc en gros, si vous voulez que l'image soit exportée toujours comme le même fichier, il faut faire ceci:
Normalement cela devrait faire ce que vous souhaitez.
Cordialement, Martin
Bonjour,
J'ai un soucis dans la fonction : ExporterPlageCommeImage2
La ligne 21 : ActiveSheet.ChartObjects("ExportImage").Chart.Export FichierImage
ne s'exécute pas correctement, il va directement à la ligne 28 : FonctionErreur:
MsgBox "Une erreur est survenue…"
Et en effet, je ne constate pas le fichier .jpg enregistré dans le repertoire défini.
Y a t il un soucis ?
Cordialement
Bonjour Frédérick,
sur cette ligne-là, qui exporte l'objet vers le fichier, la seule chose qui pourrait poser problème est le nom et l'emplacement du fichier.
Pouvez-vous vérifier si le chemin vers le fichier est correct et si vous avez droit d'écrire dans le répertoire de destination? Et aussi si le nom du fichier est bien un format "image" (.bmp, .jpg, etc.)
Cordialement, Martin
Bonjour Martin,
Je me sers encore de vos tutos pour alimenter un petit programme que je fais.
je souhaite afficher dans un userform le contenu d'une feuille excel avec la présentation. Pour cela, j'ai voulu utiliser votre tuto pour generer une image qu'ensuite j'upload dans mon userform.
malheuresement, l'image est pas net et je ne peux pas passer en png car je ne pourrai pas l'uploader dans le userform. je l'ai testé sans le userform et l'image est quand meme flou. mon deuxieme probleme est que je cherche à adapter mon userform à la taille de l'image mais je bloque avec l'utilisation des scrollbars. auriez vous une solution ? Merci
Bonjour
1° Pour info le codes tel que proposé pour le PNG n'est pas valable
en effet quand on relit le fichier résultant en binaire on se rend compte que l'on a le BOM du jpg
2°d'autant plus que le png doit avoir un calque (mask) transparent même si l'image n'a pas de partie transparente
d’ailleurs si vous copiez une shape ronde ou autre vous allez vous rendre compte que tout ce qui est a l’extérieur de la shapes sera blanc dans l'image
3° avec les versions actuelles de excel on se rend compte aussi que la latence entre le moment ou on copypicture et le moment ou les datas sont dispos dans le clipboard a clairement augmenté donc un paste tout de suite après peut engendrer une image blanche il faut donc parfois selon les machines gérer une attente
je vous propose donc ma version qui vous permettra d'enregistrer une plage ou shape ou tout autre object dans une feuille excel en png avec transparence et semie transparence
voici le code :avec quelques exemple d'utilisation
[Code-VBA]
'*****************************************************************************************************
' ___ _ _______ __ _ ____ _ _ _______ ___ _ _ _ ___ _ _.
' // \\ /\\ // // \\ // // // // // // \\ // // // // \\ //| //
' //___// //__\ // //__// // // //__// // // // // // // // // // | //
' // // \\ // // \\ // // // \\ // // // // // // // // // | //
'// // // // // // // //___ // \\ // \\__// //__// //___ \\__// // |//
'****************************************************************************************************
' COLLECTION IMAGE ET SHAPES
'exporter un object en PNG(range,shapes et tout autre object present sur la feuille)
'version avec graphique 1.3(PNG)
'date version 03/05/2016
'mise à jour:15/07/2018
'suppression de la gestion d'attente par l'api IsClipboardFormatAvailable
'remplacer par un multiple paste dans le chart dans que son pictures.count=0(Idée de @Job75)
' l'area du graph est visible ,solid et transparent à 100%
'**********************************************************************************
Option Explicit
Dim cheminT$
Function CopyOBJECTInImagePNG(ObjecOrRange, _
Optional cheminx As String = "", _
Optional transparency As Boolean = False) As String
Dim Graph As Object
If cheminx = "" Then cheminx = ThisWorkbook.Path & "\imagetemp.png"
With CreateObject("htmlfile").parentwindow.clipboardData.clearData("Text") 'on vide le clipboard entre chaque copie pour tester vraiment le available
End With
ObjecOrRange.CopyPicture
Set Graph = ObjecOrRange.Parent.ChartObjects.Add(0, 0, 0, 0).Chart
Graph.Parent.ShapeRange.Line.Visible = msoFalse
With Graph.Parent
.Width = ObjecOrRange.Width: .Height = ObjecOrRange.Height: .Left = ObjecOrRange.Width + 20:
.Select
'paste tant que le picture.count =0
Do: DoEvents: .Chart.Paste: Loop While .Chart.Pictures.Count = 0
.Chart.ChartArea.Fill.Visible = msoTrue
.Chart.ChartArea.Fill.Solid
If transparency Then
.Chart.ChartArea.Format.Fill.transparency = 1
Else
.Chart.ChartArea.Format.Fill.transparency = 0.1
End If
.Chart.Export cheminx, Split(cheminx, ".")(1)
End With
Graph.Parent.Delete
CopyOBJECTInImagePNG = cheminx
End Function
'***************************************************
'sub de test
Sub export_Range_To_ImagePNG()
Dim Fichier$
Fichier = ThisWorkbook.Path & "\imagetemp.png"
CopyOBJECTInImagePNG [Feuil1!A1:F10], Fichier
End Sub
'sub de test
Sub export_Range_To_ImagePNGNotransparency()
Dim Fichier$
Fichier = ThisWorkbook.Path & "\imagetemp.png"
CopyOBJECTInImagePNG [Feuil1!A1:F10], Fichier, True
End Sub
'***************************************************
Sub export_boite_To_ImagePNG()
Dim Fichier$
Fichier = ThisWorkbook.Path & "\" & ActiveSheet.Shapes("boite").Name & ".png"
CopyOBJECTInImagePNG ActiveSheet.Shapes("boite"), Fichier
End Sub
Sub export_Object_To_ImagePNGNotransparency()
Dim Fichier$
Fichier = ThisWorkbook.Path & "\" & ActiveSheet.Shapes("Boule").Name & ".png"
CopyOBJECTInImagePNG ActiveSheet.Shapes("Boule"), Fichier, True
End Sub
Sub testMultiShape()
Dim Shap, Fichier$
For Each Shap In ActiveSheet.Shapes
Fichier = ThisWorkbook.Path & "\" & Shap.Name & ".gif"
CopyOBJECTInImagePNG Shap, Fichier
Next
End Sub
'***************************************************
[Code/]