[VBA] - Exporter une image des cellules au format .jpg

Fermé
AelithX Messages postés 4 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 28 juillet 2017 - 27 juil. 2017 à 15:36
 Krp753 - 24 mai 2018 à 13:25
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.

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
A voir également:

5 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
Modifié le 27 juil. 2017 à 18:14
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
0
AelithX Messages postés 4 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 28 juillet 2017
28 juil. 2017 à 13:34
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é...
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
28 juil. 2017 à 13:58
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
0
AelithX Messages postés 4 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 28 juillet 2017
28 juil. 2017 à 14:49
Re-hello,

Ta solution fonctionne en effet bien sur mon excel 2013.
Il faudra, la semaine prochaine, que je la teste sur un excel 2016.

Merci tout de même pour l'aide :)
0
zlatooob69 Messages postés 1 Date d'inscription jeudi 7 septembre 2017 Statut Membre Dernière intervention 7 septembre 2017
7 sept. 2017 à 15:55
Bonjour

merci pour vos contributions

Elle fonctionne bien chez moi sur 2016 par contre la qualité de l'image n'est pas top , tu aurais une idée pour l'améliorer ? :)
0
yg_be Messages postés 22723 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
Modifié le 28 juil. 2017 à 14:53
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.
0
AelithX Messages postés 4 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 28 juillet 2017
28 juil. 2017 à 14:18
En ce qui me concerne, l'image apparait bien comme ok lors de la copie...
Peut-être deux problèmes différents ?
Quelle config as-tu ?

Avec la solution de l'export via ppt ça convient à mon boss donc ça me va.
Je testerai la solution de cs_Le Pivert pour voir si ca répond mieux à la demande.
0
yg_be Messages postés 22723 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > AelithX Messages postés 4 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 28 juillet 2017
28 juil. 2017 à 15:50
avec Excel 2016, j'ai supprimé la copie en ligne 6, qui, je pense, ne sert à rien. la copie en ligne 9 ne fonctionne pas (sauf en pas à pas).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PhilippeF75 Messages postés 3 Date d'inscription mercredi 18 avril 2018 Statut Membre Dernière intervention 17 décembre 2018 7
18 avril 2018 à 00:54
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 ?
0
Merci pour cette solution
Même souci avec Excel 2016 et VBA même conclusion sur problème avant .export.
0