[VBA] - Exporter une image des cellules au format .jpg
AelithX
Messages postés
4
Statut
Membre
-
Krp753 -
Krp753 -
Bonjour à tous !
Merci d'avance pour les réponses que vous m'apporterez,
Je suis actuellement en train de travailler sur un fichier VBA au travail.
Le concept est simple :
- en appuyant sur le bouton "CommandButton1",
- vba doit générer image de la zone "A1:J30" de l'unique feuille du classeur
- puis exporter cette image au format .jpg
Ca doit donner ca :
https://img-19.ccm2.net/KDzdiENXQzXWylfMmv56kV3jrTE=/ff43548c75244698beae5ddb684c632e/ccm-ugc/Bonne_image.jpg
Le code suivant fonctionne sous 2013, ce qui tombe bien car mon ordinateur professionnel a cette configuration.
Malheureusement, mon chef est sous Windows 10 / Excel 2016 et il y a un problème. Il obtient l'image suivante, totalement vierge (blanche et poids de l'image = 20 ko) :
https://img-19.ccm2.net/MWK_JyUewKjg_qrH4o16darT3f8=/69688c04c4064f348765aed0c4bcc3c5/ccm-ugc/Mauvaise_image.jpg
Ayant testé plusieurs pc, il semble que ma macro ne fonctionne que sous excel 2013, alors que microsoft indique que la méthode ChartObject.Export fonctionne pour "2013 et ultérieur".
De plus, et c'est une énigme pour moi : le code fonctionne en mode pas à pas (F8) sur excel 2016 et j'obtiens bien mon image telle qu'attendue.
Avez-vous une idée de pourquoi le mode pas à pas fonctionne, et mon bouton ne fonctionne pas ? Savez-vous comment adapter mon code à excel 2016 ? Ou alors, y a-t-il une autre approche permettant le fonctionnement ?
Merci à tous,
PS : Je suis parfaitement disposée à fournir une copie de mon fichier .xlsm par MP
AelithX
Merci d'avance pour les réponses que vous m'apporterez,
Je suis actuellement en train de travailler sur un fichier VBA au travail.
Le concept est simple :
- en appuyant sur le bouton "CommandButton1",
- vba doit générer image de la zone "A1:J30" de l'unique feuille du classeur
- puis exporter cette image au format .jpg
Ca doit donner ca :
https://img-19.ccm2.net/KDzdiENXQzXWylfMmv56kV3jrTE=/ff43548c75244698beae5ddb684c632e/ccm-ugc/Bonne_image.jpg
Le code suivant fonctionne sous 2013, ce qui tombe bien car mon ordinateur professionnel a cette configuration.
Private Sub CommandButton1_Click()
Dim Ligne As Integer, Colonne As Integer
'Copie, en tant qu'image, les cellules
Feuil1.Range("A1:J30").CopyPicture
Feuil1.Paste
'Crée un graphique temporaire
With Feuil1.ChartObjects.Add(0, 0, Cells(30, 10).Left, Cells(30, 10).Top).Chart
.Paste
'exporte l'image sur le disque dur, dans le même répertoire que ce classeur.
.Export ThisWorkbook.Path & "\monImage.jpg", "JPG"
End With
With Feuil1
'Supprime le graphique temporaire
.ChartObjects(Feuil1.ChartObjects.Count).Delete
'Supprime l'image dans la feuille.
.Shapes(Feuil1.Shapes.Count).Delete
End With
End Sub
Malheureusement, mon chef est sous Windows 10 / Excel 2016 et il y a un problème. Il obtient l'image suivante, totalement vierge (blanche et poids de l'image = 20 ko) :
https://img-19.ccm2.net/MWK_JyUewKjg_qrH4o16darT3f8=/69688c04c4064f348765aed0c4bcc3c5/ccm-ugc/Mauvaise_image.jpg
Ayant testé plusieurs pc, il semble que ma macro ne fonctionne que sous excel 2013, alors que microsoft indique que la méthode ChartObject.Export fonctionne pour "2013 et ultérieur".
De plus, et c'est une énigme pour moi : le code fonctionne en mode pas à pas (F8) sur excel 2016 et j'obtiens bien mon image telle qu'attendue.
Avez-vous une idée de pourquoi le mode pas à pas fonctionne, et mon bouton ne fonctionne pas ? Savez-vous comment adapter mon code à excel 2016 ? Ou alors, y a-t-il une autre approche permettant le fonctionnement ?
Merci à tous,
PS : Je suis parfaitement disposée à fournir une copie de mon fichier .xlsm par MP
AelithX
5 réponses
-
Bonjour,
Sous Windows10 et Excel 2007, cette macro fonctionne bien.
Une solution enregistrer ton classeur sous "Classeur Excel 97-2003"
Cette version fonctionne avec toutes les versions Office après 2003
Je m'en sers toujours pour envoyer des exemples car je suis sur que tout le monde pourra les ouvrir!
@+ Le Pivert -
Bonjour cs_Le Pivert,
Merci pour ta réponse rapide.
En enregistrant le classeur sous excel 97-2003, ca marche bien chez moi (excel 2013), mais toujours pas sur excel 2016. Le fichier final est toujours désespérément vierge.
Je suis en train de tester une solution en passant par Powerpoint :
au lieu de générer un fichier image .jpg, j'essaie de créer un ppt avec une seule slide contenant mon image. Normalement, les formats de fichiers .jpg et .ppt conviennent tous deux à mon chef, donc si ça marche ça devrait aller. Au pire, je sais qu'il est possible de créer un fichier .jpg depuis Powerpoint...
Je te tiens au courant de ce qui finit par fonctionner et posterai le code associé... -
J'ai trouvé cela:
Public Sub SaveRangeAsImage() Dim r As Range Dim x As Integer, y As Integer Dim varFullPath As Variant Dim Graph As String ' selection de la plage par une InputBox Set r = Application.InputBox("Sélectionnez la plage à exporter", _ "Export Image", Selection.AddressLocal, Type:=8) r.Select ' copie de la plage en format image grâce à .CopyPicture Selection.CopyPicture appearance:=xlScreen, Format:=xlBitmap x = Selection.Width y = Selection.Height ' on utilise l'objet Chart pour sa facilité d'export ' création du graphique Workbooks.Add (1) ActiveSheet.Name = "enJPG" Charts.Add ActiveChart.ChartType = xl3DArea ActiveChart.SetSourceData r ActiveChart.Location xlLocationAsObject, "enJPG" ' le graph n'est là que comme réceptacle de l'image, on le vide avec .ClearContents ActiveChart.ChartArea.ClearContents ' on colle l'image qui réside dans le presse papier ActiveChart.Paste ' redimensionnement ' on récupére le nom du graph de la collection Shapes Graph = Mid(ActiveChart.Name, Len(ActiveSheet.Name) + 1) ' on effectue un redimensionnement 'ActiveSheet.Shapes(Graph).ScaleWidth x / ActiveChart.ChartArea.Width, _ ' msoFalse, msoScaleFromTopLeft 'ActiveSheet.Shapes(Graph).ScaleHeight y / ActiveChart.ChartArea.Height, _ ' msoFalse, msoScaleFromTopLeft ' export varFullPath = Application.GetSaveAsFilename("C:\Temp\export-" & Format(Now, "yyyymmddhhnn") & ".jpg", _ "Fichiers JPG(*.jpg), *.jpg") ActiveChart.Export varFullPath, "JPG" ActiveChart.Pictures(1).Delete ActiveWorkbook.Close False End Sub
A essayer
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
j'ai exactement le même problème, et le soucis n'est pas dans l'export: l'image n'est pas correcte avant l'export.
et rien trouvé pour éviter cela. -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Bonjour,
Pour ma part, j'ai exactement le même problème d'exportation d'image sous Excel 2016 et VBA 7.1.
ça marche très bien en pas à pas mais l'image est vide en exécution de la macro.
J'arrive à cerner le problème sur le dernier .paste avant le .exporte.
J'en déduis que l'image n'a pas le temps de se copier avant d'être exportée. Mais même en ajoutant un DoEvents ou un Sleep entre les deux, ça ne fonctionne pas...
Qui a résolu le problème ?