Excel : Sauvegarder des onglets dans un fichier PDF

Publié le 26 septembre 2016
par Francis Paquet M.Sc., EEE

Il y a quelque temps, je publiais un article donnant une procédure afin de faire la liste des onglets d’un fichier Excel et, par la suite, d’en imprimer une sélection. Cela se faisait à l’aide de macros VBA. Voir à ce sujet les articles  Excel: Créer automatiquement la liste des noms d’onglets d’un fichier et Excel: Imprimer une sélection d’onglets dans un fichier. À la suite de commentaires d’utilisateurs, force est de constater qu’il y a également un besoin afin d’enregistrer les feuilles Excel sous format PDF, au lieu de simplement les imprimer.

 

Les mêmes commentaires font mention de la possibilité de définir une imprimante qui est en fait un pilote de création de fichiers PDF. Toutefois, ce moyen est complexe alors que, depuis Excel 2007, il est possible de sauvegarder directement les onglets désirés d’un fichier Excel en format PDF. Nous allons donc reprendre la procédure déjà décrite dans Excel: Imprimer une sélection d’onglets dans un fichier et la modifier afin de sauvegarder ces feuilles Excel dans un fichier PDF.

 

Étapes afin de modifier la macro

Les étapes 1 à 3 sont les mêmes, soit de mettre en page les onglets comme pour l’impression, de s’assurer que tous les onglets soient bien nommés (sinon, faire rouler la macro de Excel: Créer automatiquement la liste des noms d’onglets d’un fichier et mettez des 1 vis-à-vis des onglets que vous voulez sauvegarder en PDF, tel que montré ci-bas:

ecransauverpdf

 

Comme dans l’article précédent, le nom des onglets doit commencer à la cellule B5 et la sélection 1 ou 0, à la cellule C5. Une fois le tout bien configuré, la procédure suivante va créer un fichier PDF, choisi par l’usager, en fonction des onglets qu’il a décidé de sauvegarder. Il est à noter ici que la sauvegarde des onglets se fait selon la mise en page pour impression de ces dits onglets. Ce paramètre peut être modifié et sera expliqué plus bas.

 

Vous souhaitez créer et personnaliser des outils de gestion automatisés dans Excel  pour mieux répondre aux besoins spécifiques de votre entreprise ? Apprenez à les développer et les présenter avec des interfaces conviviales pour les usagers en suivant nos formations en programmation de macros VBA.

 

La procédure en VBA pour enregistrer des feuilles Excel sous format PDF

Sub SauverEnPDF()

' Un exemple de sauvegarde des onglets sélectionnés en PDF

Dim vararray() As String ' Afin de conserver les noms des onglets sélectionnés
Dim csname As Integer ' Colonne où se trouve le nom des onglets
Dim c As Integer ' Colonne où se trouve les choix 1 ou 0
Dim countarr As Integer ' Pour compter le nombre d'onglets sélectionnés
Dim r As Integer ' Pour compter à travers tous les onglets
Dim sname As Worksheet ' Nom de l'onglet de départ, pour y revenir à la fin
Dim strFileName As String ' Nom du fichier à sauvegarder

'set up location and counter variables
   csname = Range("B5").Column
   c = Range("C5").Column
   Set sname = ActiveSheet
   r = Range("C5").Row
   countarr = 0

' Boucle dans la iste des onglets tant qu'il y a un nom d'onglet
   While sname.Cells(r, csname) <> ""

' Ajouter le nom de l'onglet à la liste si le choix est 1
      If sname.Cells(r, c) = 1 Then
         ReDim Preserve vararray(countarr)
         ' Un ReDim Preserve permet d'augmenter la taille de la variable tout en préservant son contenu
         vararray(countarr) = sname.Cells(r, csname).Value
         countarr = countarr + 1
      End If
   r = r + 1
   Wend

' On sélection ensuite le groupe d'onglets sélectionnés
   Sheets(vararray).Select

   strFileName = Application.GetSaveAsFilename(filefilter:="PDF Files (*.pdf), *.pdf", Title:="Entrez le nom du fichier")

' Il faut s'assurer que l'usager a bel et bien fait un choix.
' Sinon, le nom du fichier sera false ou faux, si Excel français

   If strFileName <> "False" And strFileName <> "Faux" Then

      ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=strFileName _
       , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
       :=False, OpenAfterPublish:=False

' Ici, on va sauvegarder en fonction de la mise en page pour impression

   End If

' On sort en revenant à l'onglet de départ

   sname.Select

   set sname = Nothing

End Sub

 

Petits points à noter pour enregistrer des feuilles Excel sous format PDF

  1. Si le fichier PDF choisi existe déjà, il sera tout bonnement remplacé.
  2. Si le fichier PDF est ouvert, il y aura une erreur d’exécution.
  3. Le paramètre du ExportAsFixedFormat nommé IgnorePrintAreas est configuré à False. Donc, le PDF va suivre la mise en page. Si on ne veut pas cela, on va plutôt allouer la valeur True à ce paramètre.
  4. Il est également possible de forcer l’ouverture du fichier PDF. Il s’agit du paramètre OpenAfterPublish. C’est à vous de voir.
  5. Finalement, on utilise l’application GetSaveAsFilename de MS Office. On peut passer un filtre de fichier et le titre de la fenêtre (Title). Voyez plutôt:

entreznompdf

 

Je vous invite à tester le tout et à nous laisser vos commentaires ci-bas.


 

Formation complémentaire

Pour une introduction à la programmation avec le langage VBA, qui permet de sauver du temps et de réduire les risques d’erreurs en automatisant certaines tâches et certains processus, afin de développer des solutions robustes dans Excel, suivez la formation Excel – VBA (niveau 1).

 

Voici quelques commentaires d’apprenants ayant suivi cette formation :


CFO-Masque_Formations-en-ligne_FBLa mission du CFO masqué est de développer les compétences techniques des analystes et des contrôleurs de gestion en informatique décisionnelle avec Excel et Power BI et favoriser l’atteinte de leur plein potentiel, en stimulant leur autonomie, leur curiosité, leur raisonnement logique, leur esprit critique et leur créativité.

36 réflexions sur “Excel : Sauvegarder des onglets dans un fichier PDF”

  1. Bonjour,

    Cet article est très intéressant! Merci.
    Savez-vous s’il existe une façon, en VBA, d’ajouter lien hypertexte qui permet, en un seul clic, de se rendre à l’onglet concerné ?

    1. Francis Paquet, M.Sc., ing., EEE

      Bonsoir Marylène,

      Il est en effet facile d’ajouter des hyperliens en VBA. À cet effet, je vous donne la commande suivante à titre d’exemple:

      SheetName.Hyperlinks.Add Anchor:=SheetName.Range("A1"), Address:="", SubAddress:= _
              "Sheet1!N4", ScreenTip:="ggggg", TextToDisplay:="Test VBA"
      

      Les paramètres sont:
      SheetName est le nom de la feuille où vous voulez insérer l’hyperlien
      Anchor est la cellule où l’hyperlien sera situé
      Address est le URL du site web (Rien si on pointe à l’intérieur du fichier)
      SubAddress est la destination de l’hyperlien dans votre fichier
      ScreenTip est le texte qui s’affiche quand la souris passe au-dessus de la cellule en question
      TextToDisplay est le texte qui sera affiché dans la cellule de l’hyperlien

      Vous devriez également tester la fonction d’Excel qui s’appelle Hyperlink (ou Lien_Hypertexte en français) qui permet de créer des hyperliens, mais à l’aide d’une formule.

      Francis

  2. Bonjour,

    Ces macro sont très utiles, je m’en sers régulièrement.
    Pour optimiser leur utilisation, j’aurai besoin d’un code VBA pour ne créer que les noms d’onglets non masqués. Auriez-vous un code pour cela ?

    Merci,

    Paul

  3. Et pour aller encore plus loin, serait-il possible d’afficher la couleur de l’onglet sur le nom de celui-ci ?
    Par exemple, si l’onglet “Accueil” est orange, la case contenant le nom de l’onglet “Accueil” devient orange également.

    Ce serait vraiment optimum mais je vous en demande peut-être beaucoup.

    Merci et bonne année à toute l’équipe, votre travail est vraiment remarquable.

    Paul

    1. Francis Paquet, M.Sc., ing., EEE

      Bonjour Paul,

      Voici le code VBA modifié pour votre besoin:

      Sub Snamelist()
      Dim i As Integer
      
          Range("B5").Select
      
          For i = 1 To Sheets.Count
              If Sheets(i).Visible = xlSheetVisible then
                  ActiveCell.Value = Sheets(i).Name
                  ActiveCell.Interior.Color = Sheets(i).Tab.Color
                  ActiveCell.Offset(1, 0).Select
              End If
          Next i
      
      End Sub
      

      Voilà,

      Francis

  4. Bonjour Francis,

    Merci, c’est vraiment très utile pour moi. Une dernière amélioration si vous voulez bien. Pour les onglets qui n’ont pas de couleur, la case apparait alors en noir avec une police en noir, on ne voit plus rien. Serait-il possible de modifier le code pour que les onglets sans couleur apparaissent dans une case sans couleur ?

    Merci

    Paul

    1. Francis Paquet, M.Sc., ing., EEE

      Paul,

      Changez la commande ActiveCell.Interior.Color = Sheets(i).Tab.Color pour

      If Sheets(i).Tab.Color <> 0 Then ActiveCell.Interior.Color = Sheets(i).Tab.Color
      

      En effet, l’absence de couleur de l’onglet est la valeur 0.

      Francis

  5. BONJOUR, J’UTILISE ABONDAMMENT VOTRE MACRO QUI PERMET DE SAUVER EN PDF ( Sub SauverEnPDF()) TOUTEFOIS, SERAIT-IL POSSIBLE DE FAIRE EN SOIT QUE LE CHOIX DE FORMAT ( LEGAL OU LETTER) CHOISIT DAMS LE PAGE SETUP, SOIT RESPECTER DANS LE DOUMENT PDF, POUR CHACUNE DES PAGES SAUVEGARDER. DONC, SI JE SAUVEGARDE EN PDF UNE SUITE DE FEUILLE DE TRAVAIL AVEC DIFFÉRENT FORMAT DE FEUILLE, JE LES RETROUVE DANS MON PDF. MERCI

    1. Francis Paquet, M.Sc., ing., EEE

      Bonjour Marc,

      Quelle est la version Excel que vous utilisez? Moi, de mon côté, quand j’exécute la macro en Excel 2013 ou 2016, le PDF créé respecte le format portrait ou paysage de chacune des feuilles.

      Si vous éprouvez toujours des difficultés, pouvez-vous nous envoyer un fichier qui ne fonctionne pas bien à info@lecfomasque.com?

      Francis

  6. Bonjour,
    J’ai essayé la macro d’impression mais j’ai une erreur d’incompatibilité à la ligne “Sheets(vararray).Select” et comme je n’y connais rien en vba… J’arrive à lire des trucs grâce aux commentaires et à de vieux souvenirs de programmation en Basic (Amstrad :-)). Mais là… c’est pas suffisant.
    Merci de votre aide.
    Alban

  7. Bonjour Alban,

    Pouvez-vous me dire quel est exactement le message d’erreur et quel est la version d’Excel utilisée et sur quel plateforme (Windows ou MAC)? Cela nous aidera à faire le bon diagnostic.

    Merci,

    Francis

  8. Bonsoir,
    Comment pourrais-je inclure un logo enregistrer sur mon tableur de façon que chaque fois que je clic dessus il enregistre dans un dossier distinct mais sans écraser les feuilles précédentes ?
    Merci mille fois pour votre aide.

    1. Bonjour,

      J’ai bien vu votre question ici et sur le forum mais je ne la comprends pas. Vous voulez simplement cliquer sur le logo et faire une copie du fichier dans un nouveau dossier? Merci de préciser votre question.

      Sophie

  9. pascal.malingue@gmail.com

    Bonjour,

    Merci pour la mise à disposition de vos macro.
    J’essaye d’appliquer la macro sur une version Office 365 sur Mac.
    J’ai un anomalie au lancement de la macro : “Erreur d’exécution “1004”.
    La methode “GetSaveAsFilename” de l’objet “_Application” a échoué.

    Le débogeur me met ensuite la dite ligne en surveillance jaune

    strFileName = Application.GetSaveAsFilename(filefilter:=”PDF Files (*.pdf), *.pdf”, Title:=”Entrez le nom du fichier”)

    strFileName = Application.GetSaveAsFilename(filefilter:=”PDF Files (*.pdf), *.pdf”, Title:=”Entrez le nom du fichier”)

    Faut il modifier la requête sur Mac ?

    Merci

    Pascal

    1. Pascal,

      En effet, la gestion de fichiers sur Mac est complétement différente de celle sur Windows. Malheureusement, nous n’offrons pas de support VBA pour les usagers de Mac. Je vous invite à faire des recherches sur Google et vous devriez trouver comment adapter le code pour le Mac.

      Merci et bonne chance,

      Francis

  10. Bonjour,
    Comme vous le précise Francis, la gestion des fichiers est totalement différente pour Mac. De plus la gestion des pdf est natif à Mac et non propre à Office.
    Par exemple la méthode GetSaveAsFileName sous Mac ne fonctionne pas avec un filtre sur un type de fichier : “PDF Files (*.pdf),*pdf”.
    Je ne peux que vous renvoyer vers un expert du VBA pour Mac tel que le MVP Excel Ron de Bruin et plus particulièrement cette page : https://www.rondebruin.nl/mac/mac005.htm
    Cordialement et bonne recherche.
    Cathy

  11. Bonjour, un gros merci pour cette fonction, c’Est vraiemnt génial, j’Aurais une demande spécifique a ajouter à cette macro si possible.

    je voudrait sauvegarder en pdf sous le même nom (de la valeur d’une cellule) à un endroit qui demeurerait toujours dans le même répertoire (one drive) office 365 et ecrasera l’ancienne version s’il y a lieu

    est-ce possible ?

  12. Bonjour,

    Voici le code ci-dessous qui vous permettra de sauvegarder selon un nom indiqué dans une cellule (dans l’exemple ci-dessous la cellule A1 de l’onglet sheet 1).
    Comme le répertoire ne change pas vous avez le choix entre l’inscrire directement dans le code ou bien également le mettre dans une cellule. (dans l’exemple ci-dessous il est directement dans le code)
    Le nouveau fichier PDF viendra également écraser l’ancienne version s’ils ont le même nom.

    Sub SauvegarderPDF()

    ‘Déclaration des variables

    Dim Repertoire As String
    Dim NomFichier As String
    Dim Extension As String

    ‘Définition des variables

    Repertoire = “C:\Users\julie\OneDrive\Pièces jointes\”
    NomFichier = Sheet1.Range(“A1”).Value
    Extension = “.pdf”

    ‘Enregistrement en PDF

    ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Repertoire & NomFichier & Extension

    End sub

    Merci,

  13. Bonsoir
    J’utilise cette macro pour le première fois . Je voudrais seulement imprimer la première page de chacun des onglets de mon classeur et je n’arrive pas à trouver la c commande permettant de faire ceci. Systématiquement toutes les pages même vides de chacun des onglets sont imprimées PDF.
    Merci de votre aide

  14. Gilles,

    La commande d’impression afin de n’imprimer que la première page d’un onglet devrait ressembler à:
    ActiveSheet.PrintOut From:=1, To:=1, Copies:=1, Collate:=True, IgnorePrintAreas:=False
    Les paramètre From et To contrôle les pages qui seront imprimées, ici de la page 1 à la page 1.

    Voilà,

    Francis

  15. Bonjour,
    Cette fonctionnalité de génération de fichier pdf est fort utile. Cependant elle génère un fichier pdf pour les onglets sélectionnés du classeur excel.
    Comment puis-je générer un fichier pdf par onglet sélectionnés avec comme intitulé du fichier pdf le libellé de l’onglet.
    Merci pour votre aide
    Patrick

  16. Voici la même procédure qui va créer un fichier PDF, avec le nom de l’onglet, pour chaque onglet sélectionné et qui va les sauvegarder dans le même répertoire que le fichier Excel.

    Sub SauverEnPDF()

    ‘ Un exemple de sauvegarde des onglets sélectionnés en PDF

    Dim csname As Integer ‘ Colonne où se trouve le nom des onglets
    Dim c As Integer ‘ Colonne où se trouve les choix 1 ou 0
    Dim r As Integer ‘ Pour compter à travers tous les onglets
    Dim sname As Worksheet ‘ Nom de l’onglet de départ, pour y revenir à la fin
    Dim strSheetName As String ‘ Nom de l’onglet

    Dim strFileName As String ‘ Nom du fichier à sauvegarder

    ‘set up location and counter variables
    csname = Range(“B5”).Column
    c = Range(“C5”).Column
    Set sname = ActiveSheet
    r = Range(“C5”).Row

    ‘ Boucle dans la iste des onglets tant qu’il y a un nom d’onglet
    While sname.Cells(r, csname) “”

    ‘ Ajouter le nom de l’onglet à la liste si le choix est 1
    If sname.Cells(r, c) = 1 Then
    strSheetName = sname.Cells(r, csname).Value
    strFileName = ActiveWorkbook.Path & “\” & strSheetName & “.pdf”

    Sheets(strSheetName).ExportAsFixedFormat Type:=xlTypePDF, Filename:=strFileName _
    , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
    :=False, OpenAfterPublish:=False

    ‘ Ici, on va sauvegarder en fonction de la mise en page pour impression

    End If
    r = r + 1
    Wend

    ‘ On sort en revenant à l’onglet de départ

    sname.Select

    Set sname = Nothing

    End Sub

    Bonne fin de journée,

    Francis

  17. Bonjour,
    je trouve votre Macro topissime, je m’en sert énormément….
    Pensez vous qu’il est possible que le fichier soit “Enregistrer sous” comme actuellement et ensuite envoyé par mail automatiquement…

    J’ai déjà une macro qui me créé un email type en fonction de certains champs : Nom, Prénom, mail, … avec un texte préformaté…. Il ne me reste qu’à trouver comment y adjoindre le PDF créé, mais je ne sais pas faire…
    Pourriez vous m’aider?

  18. Bonjour, top votre macro.
    Je m’en sers énormément.
    J’ai fait une macro qui me permet sur clique bouton de générer un mail outlook en fonction de certaines cellules de ma feuille excel.
    J’aurais aimé que mon bouton puisse en plus envoyer le pdf enregistré…
    Pourrait-on imaginer de rajouter la fonction enregistrer puis mail à cette macro?
    Si oui, avez vous une idée de comment faire?

  19. Jonathan,

    Afin de joindre un fichier à un courriel, en VBA dans Excel, vous devez simplement ajouter la commande
    MailItemObject.Attachments.Add (VotreNomdeFichierAuCompletEntreGuillemets)

    Voilà tout! Le nom de fichier doit inclue le chemin + le nom + l’extension (.pdf ici).

    Francis

  20. Bonjour Francis,
    merci pour votre réponse, mais concrètement dans votre script comment je fais pour envoyer le PDF généré par votre moulinette directement?

    Jonathan

  21. Bonjour Ce macro est super.
    Je l’ai utilisée mais il y a une erreur a mon niveau :
    L’indice n’appartient pas à la sélection. Quand je clic sur débogage, elle me montre la ligne ou s’est écrit
    Sheets (vararray) .select

    Aidez moi svp

    1. Amouzou,

      En général, cela indique que vous voulez sélectionner une feuille masquée, ce qui ne se fait pas! Ou que votre sélection est vide, ce qui ne se fait pas non plus!

      Tenez-moi au cournat!

      Francis

  22. Bonjour,
    Merci beaucoup pour votre tutoriel.
    J’aimerai solliciter savoir comment enregistrer les zones d’impression de ces feuilles sélectionnées vers un nouveau classeur.
    Merci

  23. Bonjour,
    serait-il possible de sauvegarder chaque onglet en 1 pdf et de renommer automatiquement chaque onglet avec le contenu d’une cellule avant enregistrement ?

  24. Bonjour,

    Je souhaiterais savoir si il est possible, que lorsque l’on demande d’exporter en PDF une 2nd fois, il puisse ne pas écraser la 1re version ?

    Par avance merci !

  25. Bonjour,
    j’ai paramétré mon onglet source en mode paysage et avec une zone d’impression. Lorsque je fais fonctionner la macro en local (fichier excel sur C: …), les pdf créés sont en portrait.
    Lorsque je fais fonctionner la macro sur un fichier disposé dans un espace sharepoint, les pdf sont bien en paysage.
    Le problème est que je combine cette macro avec un envoi automatique par e-mail. Dans le cadre des fichiers venant d’un espace sharepoint, il sont envoyés en lien partageable (avec nécessité d’avoir une autorisation de lecture) et pas en fichier directement en pièce-jointe. Avez-vous une solution pour forcer la mise en pièce jointe du pdf venant de Sharepoint?

  26. Bonjour,

    Est-il possible créer la même macro mais pour réaliser une extraction de plusieurs onglets excel dans un nouveau fichier ?

    Merci d’avance

    1. Audrée Pellerin

      Bonjour Vincent,

      Oui c’est possible! Vous pouvez utiliser l’enregistreur de macro pour vous aider à créer le code requis.
      Pour plus de détails, je vous invite à poser votre question sur le forum. Une personne de la communauté sera en mesure de vous aider.
      https://www.lecfomasque.com/forums/

      Merci!
      Audrée

Laisser un commentaire

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

Retour en haut