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:
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
- Si le fichier PDF choisi existe déjà, il sera tout bonnement remplacé.
- Si le fichier PDF est ouvert, il y aura une erreur d’exécution.
- 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.
- Il est également possible de forcer l’ouverture du fichier PDF. Il s’agit du paramètre OpenAfterPublish. C’est à vous de voir.
- 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:
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 :
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é ?
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:
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
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
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
Bonjour Paul,
Voici le code VBA modifié pour votre besoin:
Voilà,
Francis
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
Paul,
Changez la commande ActiveCell.Interior.Color = Sheets(i).Tab.Color pour
En effet, l’absence de couleur de l’onglet est la valeur 0.
Francis
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
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
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
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
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.
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
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
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
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
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 ?
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,
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
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
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
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
Et les ” ” doivent être remplacés par des guillemets!
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?
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?
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
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
Jonathan,
J’ai publié un billet de blogue là-dessus https://www.lecfomasque.com/comment-envoyer-un-courriel-a-laide-de-vba-depuis-excel/ que je vous invite à consulter…
Francis
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
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
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
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 ?
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 !
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?
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
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