Excelastuces

Logo Excelastuces

Comment exporter une feuille en PDF avec du VBA

v2.jpg

Il est possible depuis les dernières versions d’Excel de convertir ou d’enregistrer son fichier directement en PDF
Ce format, très connu, est très pratique pour diffuser toutes sortes d’informations en évitant toutes modifications.

Maintenant est ce que cela vous direz de pouvoir faire la même chose en VBA?

Quel intérêt? me direz vous!

Et bien si vous voulez juste diffuser vos résultats en PDF sans que votre fichier Excel ne soit accessible à tout le monde, cette méthode va générer un fichier PDF que vous pourrez ensuite placer ou bon vous semble(le serveur de votre entreprise par exemple) pour qu’il soit consulter en tout sécurité.

Ça vous tente?

Comme d’habitude c’est super simple

Nous allons vous montrer chaque étape pas à pas

Mise en place

Prenons un exemple :

i1.png

Nous voulons créer un fichier PDF avec toutes les données ci-dessus à l’intérieur

1) Placer le Code VBA

Copier le code dans l’éditeur VBA dans l’onglet « DEVELOPPEUR »

Dans « Feuil1 »

i2.png

Vous pouvez copier le code qui suit :

Sub PDF_SAVE()

Dim LHeure As String, LaDate As String

LHeure = Format(Time, "HMS")
LaDate = Format(Date, "dd" & "." & "mm" & "." & "yyyy")

' Création fichier PDF

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Test\Création du fichier le " & LaDate & " " & LHeure & ".pdf", Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
From:=1, To:=1, OpenAfterPublish:=False

' Message de confirmation

MsgBox ("Création du fichier PDF effectué" & vbCrLf & vbCrLf & "Merci ")

End Sub
Petit rappel ►Comment activer le mode developpeur
Explication du code

LHeure = Format(Time, « HMS »)
LaDate = Format(Date, « dd » & « . » & « mm » & « . » & « yyyy »)
Ces lignes vont nous permettre d’horodater notre fichier PDF

Chaque fichier sera unique et évitera les doublons qui peuvent générer des erreurs lors de la création du fichier
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ « C:\Test\Création du fichier le  » & LaDate &  »  » & LHeure & « .pdf », Quality:= _ xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _ From:=1, To:=1, OpenAfterPublish:=False
Là c’est déja un petit peu plus compliqué
IMPORTANT : Ce qu’il faut retenir c’est qu’il faut absolument mettre le chemin d’un répertoire qui existe (ici C:\Test\) sinon vous risquer d’avoir une erreur!!!

Le From:=1,To:=1 va nous permettre d’ajouter des pages à notre fichier PDF si besoin

Ne toucher pas au reste du code! Sauf le nom du fichier, bien sur, que vous pouvez choisir

2) Création du bouton pour la création du fichier PDF

Dans l’onglet « DEVELOPPEUR »

Cliquer sur « Insérer »

Sélectionner « Bouton » (Case rouge)

i3.png

Une petite croix va s’afficher
Dessiner un carré ou rectangle en maintenant clique gauche

Une fenêtre va s’ouvrir

i4.png

Cliquer sur « Feuil1.PDF_SAVE »

Faire « OK »

3) Définir une zone d’impression

On défini une zone d’impression pour indiquer qu’elle partie du tableau doit se trouver dans votre fichier PDF

Pour cela, définissez une zone en la sélectionnant (ici de A2 à H13)

Tout ce qui sera en dehors de cette zone ne sera pas inscrit dans votre fichier PDF

Dans l’onglet « MISE EN PAGE« , sélectionner « ZoneImpr »

Cliquer sur « Définir »

i5.png

Pour la mise en forme de votre fichier PDF
Décocher les cases « Afficher » et « Imprimer » (soulignées en rouge ci-dessus)

Cela permettra d’avoir un fond blanc!

Vous pouvez également choisir l’orientation du fichier « Portrait » ou « Paysage » à vous de voir

Voir notre exemple ► Création du fichier le 02.05.2019 185915

45 réflexions sur “Comment exporter une feuille en PDF avec du VBA”

  1. Bonjour, dans un premier temps je vous remercie pour votre explication.
    Concernant le nom du fichier
    (manipulation suivante : Filename:= _ « C:\Test\Création du fichier le » & LaDate & » » & LHeure & « .pdf »)
    je souhaitais savoir comment intégrer dans le nom du fichier PDF le contenu d’une cellule en plus de l’horodater.

    Vous remerciant de me lire et vous souhaitant une excellente journée !

    1. Bonjour Dévida,
      tout d’abord désolé pour la réponse tardive, nous n’avions pas reçu la notification de votre commentaire.

      Voici la réponse à votre question
      Filename:= _ « C:\Test\Création du fichier » & Sheets(« Feuil1 »).Range(« A1 »).Value & « le » & LaDate & » » & LHeure & « .pdf »

      Sheets correspond au nom de la feuille ou se trouve votre cellule
      A1 est le nom de votre cellule

      Nous restons à votre écoute
      Bonne journée

  2. Bonjour,
    En exécutant le code, une erreur 1004 est générée. je ne comprends pas d’où provient le souci.
    Est-ce qu’il y a un paramétrage à effectuer?
    Bravo et merci pour votre site qui est très utile.
    Bonne journée
    Ludo

  3. Bonjour,

    J’ai essayé vos manipulations, l’erreur d’incompatibilité de type revient sans cesse:

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    « C:\Users\…\DEVIS  » & Sheets(Feuil6).Range(F14).Value & « le  » & LaDate &  »  » & LHeure & « .pdf », Quality:= _
    xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
    From:=1, To:=1, OpenAfterPublish:=True

    1. Bonjour Chris,
      cela peu arriver quand une variable n’est pas déclarée.
      Vous avez bien mis les lignes qui suivent au début du code?
      [..]
      Dim LHeure As String, LeDate As String
      LHeure = Format(Time, « HMS »)
      LaDate = Format(Date, « dd » & « . » & « mm » & « . » & « yyyy »)
      […]
      Ensuite, peu probable, mais votre répertoire DEVIS existe bien en étant accessible?

  4. Bonjour, ça marche parfaitement je vous remercie, j’ai une question comment pourrai-je faire en sorte que le bouton m’exporte une autre feuille excel ?
    Le bouton étant sur la feuille 1 il m’exporte la feuille 1 mais j’aimerai exporter un élément de la feuille 2

    1. Bonjour Tibzz,

      Vous avez défini une zone d’impression pour la feuille 1? et pour l’élément que vous souhaitez ajouter de la feuille 2?
      Il y a aura 2 zones à définir donc.

      Une fois fait modifier dans le code : « From:=1, To:=2 »

      Cela doit fonctionner. Si ce n’est pas le cas nous reviendrons vers vous pour une autre solution.

      Cordialement

  5. Bonjour,
    Tout d’abord, merci pour le partage de la macro. Il est très utile.
    Cependant, est il possible de définir automatiquement le nombre de page pdf?
    J’enregistre un tableau qui s’agrandit tous le temps du coup, je suis obligé de modifier la macro régulièrement.

      1. Bonjour,
        Je serai aussi intéressé par la réponse à cette question,
        Avez vous trouvé une solution ?
        En vous remerciant

  6. Après plusieurs de recherche et d échec et grace v a vos explications j ai enfin réussis à exporter un fichier 😻😻

  7. Bonjour,
    Dans le cadre de mon script, j’effectue un export en PDF avec le code suivant :
    ActiveSheet.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:= _
    « \\PARD…\…\Test_Reports.pdf », _
    Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, _
    IgnorePrintAreas:=False, _
    OpenAfterPublish:=False

    Le problème étant que l’option ‘Compatible ISO 19005-1 (PDF/A)’ est cochée automatiquement lors de l’export et me fais ressortir quelques images (les logos) en noir.

    Ce qui est particulièrement moche.

    En mode manuel, si cette option est décochée => plus de problème !

    J’ai donc tenté de rajouter ‘UseISO19005_1:=False’ mais l’exécution me balance une erreur 1004.
    ActiveSheet.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:= _
    « \\PARD…\…\Test_Reports.pdf », _
    Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, _
    IgnorePrintAreas:=False, _
    OpenAfterPublish:=False, _
    UseISO19005_1:=False

    Pourtant, l’UseISO19005_1:=False fonctionne sur Word.

    Je sèche ! Auriez-vous une petite idée ?

    Merci et bonne journée.
    Franck

  8. Bonjour,
    pour une feuille ok ça fonctionne, mais si nous voulons exporter en pdf 2 feuilles ou plus ? est ce possible ?

    d’avance merci
    bonne journée
    Marion

    1. Bonjour Mama,
      Il est possible de sélectionner (manuellement ou via une select.sheets dans VBA) autant de feuilles que souhaité
      Attention toutefois, le PDF créé prendra la lecture de vos feuilles dans le même ordre qu’une impression. Il faut donc bien ordonnancer ses feuilles dans le classeurs au préalable.
      Pour ma part, production de guide de plus de 100 pages en plusieurs langues.
      Attention au images qui peuvent être mal interprétées lors de la création du PDF (voir mon message ci-dessus).
      Bonne fin de journée.
      Franck

  9. jérémy BZL

    Bonjour,
    Merci pour ce Tuto très clair
    J’ai également l’erreur 1004, je suis sur Mac et j’ai autorisé les macros
    voici le script :
    Dim Chemin As String
    Chemin = ActiveWorkbook.Path
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _
    Chemin & « \ » & Range(« a35 »).Value & « .pdf », Quality:= _
    xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
    From:=1, To:=1, OpenAfterPublish:=False
    MsgBox « Le PDF a été généré dans le répertoire source de ce fichier »
    End Sub
    si vous avez une solution merci d’avance

    1. Bonjour Jérémy,

      Votre code semble bon et fonctionne de notre côté.
      Le chemin de votre fichier Excel est il accessible en écriture ?

      Avez vous definie une zone d’impression ?

      Si c’est non.
      Soit vous en activez une, vous lancer la macro et vous pourrez la supprimer ensuite apres la première utilisation.

      Soit vous mettez True à « IgnorePrintAeras:=….. »

      Vous pouvez ensuite utiliser ThisWorkBook.Path au lieu de ActiveWorkBook.Path

      Cordialement

  10. IsaJoe Lapointe Desmeules

    Bonjour, tout fonctionne… mais j’aimerais à la place de l’heure que celui-ci utilise la case C6 de mon premier onglet qui s’appelle Bon de commande.

    Je n’arrive pas à l’insérer… Avez-vous une idée pour moi.
    Merci de votre aide

  11. Bonjour, Merci pour ce code qui m’est très utile mais je n’arrive pas à nommer les fichiers correctement, a chaque fichier créer j’obtiens : Création du fichier Sheets(«Feuil7»).Range(«C2»).Value » & LaDate & » « .pdf

    Je suis sous Mac je ne sais pas si ça a un effet
    Merci de votre aide

      1. Merci de votre retour, voilà le code complet

        Sub ExportPDF()

        ‘ ExportPDF Macro

        Dim LeDate As String

        LaDate = Format(Date, « dd » & « . » & « mm » & « . » & « yyyy »)

        ‘ Création fichier PDF

        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _
        « /Users/margotdelacroix/Documents/Fiches techniques cost/Création du fichier & Sheets(«Feuil7»).Range(«C2»).Value » & LaDate & » « .pdf », Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        From:=1, To:=1, OpenAfterPublish:=False

        ‘ Message de confirmation

        MsgBox (« Création du fichier PDF effectué » & vbCrLf & vbCrLf & « Merci « )

        End Sub

        1. Bonjour Margot,

          c’est effectivement une petite erreur de  »
          Avant le & Sheets il en faut un pour fermer le texte.
          Ensuite on ajoute nos variables et après le dernier & on ouvre les  » pour finir le nom du fichier

          cela donne le code suivant :

          ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _
           » /Users/margotdelacroix/Documents/Fiches techniques cost/Création du fichier  » & Sheets(«Feuil7»).Range(«C2»).Value & LaDate & « .pdf », Quality:= _
          xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
          From:=1, To:=1, OpenAfterPublish:=False

          Attention au nom du répertoire 😉

          Cordialement.

  12. bonjour,

    impossible de parvenir à créer un enregistrement .. je souhaite juste un enregistrement auto en PDF avec un nom qui varie en fonction de la case D19.. si quelqu’un peut m’aider ..

    Sub PDF_SAVE()

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    « F:\APPLICATION THERMO\PDF CIRTEUS\ » & Range(« D19 ») & « .pdf », Quality:= _
    xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
    OpenAfterPublish:=False

    End Sub

    1. Bonjour,
      Quelques pistes :
      Est ce qu’il y a un message d’erreur ?
      Le répertoire APPLICATION THERMO\PDF CIRTEUS existe t il?
      Est ce que ce qui se trouve dans la case D19 respecte bien les caractères autorisés pour la création de fichiers pour Windows?
      La case D19 se trouve t elle dans la feuille ou est executé la macro?

  13. Bonsoir,
    Très bonne astuce que je ne connaissais pas! Cela vient de me gagner beaucoup de temps même si je n’ai pas automatisé la gestion de toutes les feuilles du classeur.
    Présentation sobre et visuellement agréable!
    Bravo et merci.

  14. Bonjour
    Merci beaucoup pour cette astuce.
    Serait-il possible d’inclure un export automatique du fichier à certaine échéance données (date + heure) et sur des portions de document données (plage de cellule) ?

    Merci pour votre aide !!

  15. mathis Cotonnec

    Bonjour,
    J’ai bien réussi à éditer mon PDF mais la zone que je veux imprimer en PDF doit être trop grande. Tout n’apparaît pas dans le PDF.
    J’aimerai utiliser la totalité de la page PDF, je pense aussi qu’il y a des marges et donc qu’il est impossible de mettre quelque chose dessus. Sauriez vous comment je pourrais procéder ? Et peut-être y a-t-il une taille maximale dans la sélection des cellules Excel.
    Merci d’avance.

    1. Bonjour, il y a effectivement des limites a ne pas dépasser.
      Pour ajuster au mieux, apres avoir defini votre zone d’impression, simuler une impression. Vous pouvez voir un aperçu et ajuster au mieux vos marges.
      Revenez ensuite sur votre feuille et les pointillés des zones d’impressions seront visibles pour placer ce que vous voulez imprimer.
      Il faut optimiser un maximum, c’est le côté un peu frustrant de cette fonction qui reste efficace malgré tout.

  16. Bonjour,

    Je suis très intéressé par cette procédure qui permet d’imprimer une sélection de cellules Excel directement dans un pdf (je cherche depuis plusieurs jours, mais vous êtes le premier site assez clair pour m’avoir donné envie d’essayer votre « Astuce » !).

    Malheureusement, cette procédure me génère un message d’erreur « Argument ou appel de procédure incorrect »
    Je précise :
    – Je suis en Excel 2007
    – J’ai corrigé une petite faute de frappe dans votre code au niveau des Dim de variables (LaDate au lieu de LeDate)

    Espérant une réponse prochaine de votre part, je vous souhaite une bonne nuit.
    Et une Bonne Année, par la même occasion.

    GC (de Cognac)

    1. Bonjour Guy,

      Meilleurs vœux pour 2023.

      Merci pour la coquille, cela va être corrigé.

      En général cette erreur peut venir lorsqu’une plage de données est trop importante. Il y a aussi le fait qu’il existe une incompatibilité pour ce code et la version d’Excel.

      Le ExportAsFixedFormat ne fonctionne pas sur Excel 2007

      Voici un autre code VBA mais je ne l’ai pas testé :

      Sub ExportSheetToPDF()
      Dim ws As Worksheet
      Dim strFileName As String

      Set ws = ThisWorkbook.Sheets(« Nom_de_la_feuille »)
      strFileName = « Chemin\Nom_du_fichier.pdf »

      ws.SaveAs strFileName, FileFormat:=xlPDF
      End Sub

      1. Bonjour et merci,

        Ben ! Ca ne marche pas non plus. Mais je ne suis pas sûr d’avoir bien remplacé les choses comme il faut. Je suis débutant en VBA, donc je ne connais pas tous les sous-entendus que les chevronnés connaissent par cœur, et qui se passent de commentaires détaillés. Ce que j’avais apprécié dans votre proposition initiale, c’est précisément que le code était écrit entièrement, depuis Sub() jusqu’à End Sub() avec les Dim et tout ce qui va bien. Apporter une modification dans un code existant est au delà de mon petit niveau, bien que je progresse tous les jours…

        Autrement dit : Pouvez-vous, s’il vous plait, me faire parvenir le code complet qui puisse répondre à mon besoin, de sorte que je n’ai qu’à faire un copier-coller dans la feuille de code vba de mon classeur Excel. A moins que ce soit dans ThisWorkBook. Merci de me préciser cela. Peut-être était-ce la première cause du dysfonctionnement???

        D’avance, je vous en remercie.
        Bonne soirée.

        1. Bonjour,
          Je ne sais si l’extrait de code (qui fonctionne très bien dans mon cas avec Excel 2021 et aussi 2016) peut vous aider.
          J’imprime une plage donnée « $B$2:$AA$41 » (dans mon cas), dans mon cas j’ai une routine qui me permet d’effectuer l’impression de cette zone pour tous les onglets qui répondent au critères.

          Mon répertoire de « sortie » est dans fPath qui lui même est dépendant de OutPath (qui est lui même calculé en fonction de la date du jour, ci-dessous j’ai simplifié en codant en dur un nom de répertoire (QUI DOIT EXISTER AU PREALABLE!!!)
          Dans mon cas le nom du fichier de sortie est égal au nom de l’onglet à imprimer, pour simplifier ici j’ai codé en dur le nom du fichier de sortie

          Normalement le code ci-dessous devrait fonctionner:

          Sub PrintPDF()

          Dim OutPath As String
          Public fPath As String
          Public CompFName As String

          OutPath = « 2023-01-12 »

          fPath = « F:\20.0_Projets\09-Total\20.0_Engineering\Output\ » & OutPath & « \ »

          CompFName = « Fichier_de_Sortie.pdf »

          ‘ Sélection de la zone à imprimer
          Range(« B2:AA41 »).Select
          ActiveSheet.PageSetup.PrintArea = « $B$2:$AA$41 »

          ‘ Impression en PDF avec variables
          ‘fPath = Path (chemin)
          ‘CompFName = Nom complet du fichier (AVEC EXTENSION)
          ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
          Filename:=fPath & CompFName, _
          Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
          From:=1, To:=1, OpenAfterPublish:=False

          ‘MsgBox (« Terminé avec :  » & vbCrLf & vbCrLf & nbVal &  » fichiers « )
          End Sub

          1. Bonjour et merci PierS

            Toujours pas !

            Mais le message d’erreur a changé :

            Impossible d’exécuter cette macro…blablabla

            Bonne soirée !

          2. J’ai testé le code initial proposé par Sub PDF_SAVE(), il fonctionne bien chez moi. Excel 2021

            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
            « F:\APPLICATION THERMO\PDF CIRTEUS\ » & Range(« D19 ») & « .pdf », Quality:= _
            xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
            OpenAfterPublish:=False

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut