Enregistrer sous (image) une plage de cellules
Bonjour,
Je cherche à enregistrer au format image une plage de cellule (contenant des graphiques) via un code VBA. Après avoir cherché un peu sur les divers forum j'ai cru comprendre qu'une des solutions serait de stocker temporairement la plage dans un chartobject puis de l'exporter en image. J'ai ce code pour le moment :
Sub test1()
'inspiré en grande partie de http://excel-malin.com/vba-astuces/excel-vers-jpg/
Application.ScreenUpdating = False
On Error GoTo ExportErreur
Dim Plage As Range
Dim FichierImage As String
Set Plage = Range("D4:I10").Cells
Plage.CopyPicture Appearance:=xlScreen, Format:=xlPicture
With ActiveSheet.ChartObjects.Add(Left:=Plage.Left, Top:=Plage.Top, Width:=Plage.Width, Height:=Plage.Height)
.Name = "ExportImage"
.Activate
End With
ActiveChart.Paste
FichierImage = Application.GetSaveAsFilename(InitialFileName:="*.jpg", FileFilter:="Image file (*.jpg), *.jpg")
ActiveSheet.ChartObjects("ExportImage").Chart.Export FichierImage
ActiveSheet.ChartObjects("ExportImage").Delete
Application.ScreenUpdating = True
Exit Sub
ExportErreur:
MsgBox "Une erreur est survenue..."
Application.ScreenUpdating = True
End Sub
Quand on rentre un nom de fichier et qu'on clique sur ok : tout va bien, ça fonctionne au poil.
Cependant si on clique sur annuler dans la boite de dialogue "save as", ça merdouille un peu :
- ça met le message d'erreur de "ExportErreur", mais en quoi est-ce une erreur ?
- ça crée un fichier "faux" sans extension et pesant 0 octet dans le chemin par défaut
- ça laisse le chartobject par dessus la plage de cellule.
Est-ce que quelqu'un aurait une idée de comment éviter ces 3 désagréments ?
Et dans le code que j'ai utilisé je ne comprends pas comment c'est possible que la variable string FichierImage puisse prendre la valeur Application.GetSaveAsFilename(...), je trouve ça bizarre pour une string...
En vous remerciant par avance pour vos réponses.
Bonjour,
Intéressant.
j'ai cru comprendre qu'une des solutions serait de stocker temporairement la plage dans un chartobject puis de l'exporter en image.
Je ne sais pas du tout, je n'ai pas regardé de ce côté-là, mais sinon, cela a l'air de fonctionner :
Sub test1()
Application.ScreenUpdating = False
On Error GoTo ExportErreur
Dim Plage As Range
Dim FichierImage As Variant
Set Plage = Range("D4:I10").Cells
Plage.CopyPicture Appearance:=xlScreen, Format:=xlPicture
With ActiveSheet.ChartObjects.Add(Left:=Plage.Left, Top:=Plage.Top, Width:=Plage.Width, Height:=Plage.Height)
.Name = "ExportImage"
.Activate
End With
ActiveChart.Paste
FichierImage = Application.GetSaveAsFilename(InitialFileName:="*.jpg", FileFilter:="Image file (*.jpg), *.jpg")
If FichierImage <> False Then
ActiveSheet.ChartObjects("ExportImage").Chart.Export FichierImage
End If
ActiveSheet.ChartObjects("ExportImage").Delete
Application.ScreenUpdating = True
Exit Sub
ExportErreur:
MsgBox "Une erreur est survenue..."
Application.ScreenUpdating = True
End Sub
La valeur renvoyée par GetSaveAsFilename est de type Variant, ça permet d'avoir une String ou la valeur False en cas d'erreur.
Merci, effectivement les trois points soulevés sont résolus !
il y avait effectivement une condition genre "if FichierImage = false then exit function" dans le code original, mais que je n'ai pas cru bon de recopier car je ne passais pas par la définition préalable d'une fonction....
Encore merci