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

Rechercher des sujets similaires à "enregistrer image plage"