Exporter Excel comme image (jpg) 40


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.

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. Mais cela a un impact négatif sur la lisibilité.

Le code que je vous propose est donc beaucoup plus pratique qu'une capture d'écran classique!

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). 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!

Comment cela fonctionne?

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 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…" (Variante A)
  • La deuxième variante, 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 type Boolean) et l'emplacement et le nom du fichier exporté (argument de type String). (variante B)

Le code VBA de la fonction (variante A)

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 (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é…

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\

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 astuce qui devrait pouvoir vous économiser du temps et de rendre votre travail plus efficace. N'hésitez pas à partager vos remarques et/ou suggestions dans les commentaires…

56 0




Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.

40 commentaires sur “Exporter Excel comme image (jpg)

  • H. Simon

    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.

    • excel-malin.com Auteur de l’article

      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.

  • Totofox

    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 :)/

  • Dam

    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

    • Dam

      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

          • Dam

            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

          • excel-malin.com Auteur de l’article

            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

          • Dam

            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

          • Dam

            J'ai l'impression que me copier coller de mon code n'affiche pas tout ??

          • Dam

            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"

          • Dam

            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

          • Dam

            les tags HtmL passent pas
            je vais essayer une méthode
            HTMLBody = .HTMLBody & "Embedded Image:" _
            & "" _
            & "Best Regards, Sumit"

          • Dam

            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

          • Dam

            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.

  • François JAUNAY

    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

    • excel-malin.com Auteur de l’article

      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édure ExempleExportImage) 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

  • PINEL

    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.

    • excel-malin.com Auteur de l’article

      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

  • Nono1975

    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.

    • excel-malin.com Auteur de l’article

      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:

          '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
      

      en

         'Copier l'image dans le graphique, sauvegarder le fichier et supprimer le graphique temporaire
          ActiveChart.Paste
          ActiveWindow.Zoom = 300
          ActiveSheet.ChartObjects("ExportImage").Chart.Export FichierImage
          ActiveSheet.ChartObjects("ExportImage").Delete
          ActiveWindow.Zoom = 100
      

      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

      • Nono1975

        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

          • nono1975

            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,

          • excel-malin.com Auteur de l’article

            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)

            Public Function ExporterPlageCommeImage2(PlageAExporter As Range, LignesDeGrille As Boolean, FichierImage As String)
            'par: Excel-Malin.com ( https://excel-malin.com )
            
            On Error GoTo FonctionErreur
            
            If Len(Dir(FichierImage)) > 0 Then '=fichier existe déjà
                FichierImage = Replace(FichierImage, ".jpg", "_nouveau.jpg")
            Else
            End If
            
            '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

            Cordialement, Martin

  • P JULIEN

    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.

    • excel-malin.com Auteur de l’article

      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

  • dominique schuel

    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

    • excel-malin.com Auteur de l’article

      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

      • dominique schuel

        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