TL;DR — Il n'existe pas de « SaveAs PDF » en VBA. Vous appelez
ExportAsFixedFormatsur une feuille, une plage ou un classeur, vous passezType:=xlTypePDFet un chemin complet se terminant par .pdf, et Excel produit exactement les pages qu'il imprimerait. Toute l'idée est là : un PDF est un travail d'impression envoyé dans un fichier. Ce sont donc la zone d'impression, l'orientation et l'ajustement à la page qui décident de ce qui finit dans le PDF — réglez d'abord la page, exportez ensuite.
Sub SaveReportAsPdf()
Dim pdfPath As String
pdfPath = ThisWorkbook.Path & "\Report_" & Format(Date, "yyyy-mm-dd") & ".pdf"
ThisWorkbook.Worksheets("Report").ExportAsFixedFormat _
Type:=xlTypePDF, Filename:=pdfPath, Quality:=xlQualityStandard, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub
La plupart des gens arrivent ici après avoir tenté un SaveAs avec un nom en .pdf, ou après avoir
enregistré une macro de Fichier ▸ Exporter et obtenu une ligne qu'ils ne comprennent pas. Ce guide
ouvre une série de trois articles consacrée à la sortie des données d'Excel. Les trois partagent un
même circuit. La mise en page décide de ce qu'est une page — sa zone
d'impression, son orientation, son échelle. PrintOut envoie ces pages à une
imprimante. ExportAsFixedFormat, traité ici, envoie les mêmes pages dans un fichier PDF. Réglez la
page correctement une fois et les deux sorties seront justes ; ratez-la et aucune option d'export ne
la rattrapera.
Ce que vous allez apprendre
- Pourquoi un PDF produit par Excel est un travail d'impression, et ce que cela implique pour votre code
- L'appel
ExportAsFixedFormatet les arguments qui comptent vraiment - Exporter une feuille, une plage ou le classeur entier
- Regrouper plusieurs feuilles choisies dans un seul PDF
- Construire un chemin de fichier sûr, et l'erreur d'exécution 1004 qu'un mauvais chemin provoque
- L'arbitrage :
ExportAsFixedFormatcontre l'« impression en PDF »
Le modèle mental : un PDF est une impression envoyée dans un fichier
Excel n'a pas de mise en page distincte pour le PDF. À l'export, il découpe la feuille en pages exactement comme pour le papier — même zone d'impression, mêmes sauts de page, mêmes marges, mêmes en-tête et pied de page — et écrit ces pages dans un fichier au lieu de les envoyer à une imprimante. Ce seul fait explique presque toutes les questions du genre « pourquoi mon PDF ressemble-t-il à ça » :
- Le PDF coupe un tableau large sur deux pages parce que la page est en portrait à 100 %.
- Le PDF inclut un bloc de cellules égaré loin sous les données parce que la plage utilisée s'étend jusque-là.
- Le PDF n'affiche qu'une partie de la feuille parce qu'une zone d'impression a été définie il y a des mois et jamais effacée.
Aucun de ces cas n'est un problème d'export. Ce sont des problèmes de page, et ils se corrigent dans la mise en page, avant que la ligne d'export ne s'exécute.
L'appel ExportAsFixedFormat
ExportAsFixedFormat existe sur un Worksheet, un Range, un Workbook et un Chart. Les arguments
dont vous vous servirez réellement :
| Argument | Rôle |
|---|---|
Type |
xlTypePDF (ou xlTypeXPS). Obligatoire. |
Filename |
Le chemin complet du fichier à créer. Incluez le dossier et .pdf. |
Quality |
xlQualityStandard pour une qualité d'impression, xlQualityMinimum pour un fichier plus léger. |
IgnorePrintAreas |
False (la valeur par défaut) respecte la zone d'impression ; True exporte tout. |
From, To |
Une plage de pages, par exemple les pages 1 à 3. |
OpenAfterPublish |
True ouvre le PDF dans la visionneuse par défaut une fois terminé. |
Utilisez les arguments nommés. La forme positionnelle fonctionne, mais
ExportAsFixedFormat xlTypePDF, p, , , True devient illisible une semaine plus tard, et l'ordre est
facile à confondre.
Une feuille, une plage ou le classeur entier
C'est l'objet sur lequel vous l'appelez qui fixe la portée :
' Une feuille (respecte la zone d'impression de cette feuille)
Worksheets("Report").ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
' Une plage, quelle que soit la zone d'impression
Worksheets("Report").Range("A1:H40").ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
' Toutes les feuilles visibles du classeur, dans l'ordre des onglets
ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
La forme plage est le moyen le plus rapide de livrer « juste ce bloc » sans toucher à la zone d'impression de la feuille. La forme classeur laisse de côté les feuilles masquées, ce qui est généralement ce que vous voulez pour les feuilles de calcul intermédiaires et les tables de correspondance.
Plusieurs feuilles choisies dans un seul PDF
Pour réunir un ensemble précis de feuilles — par exemple une synthèse et deux onglets de détail — sélectionnez-les en groupe, puis exportez la feuille active. Une sélection groupée s'exporte en un seul document :
Sub ExportChosenSheets(pdfPath As String)
ThisWorkbook.Worksheets(Array("Summary", "North", "South")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
ThisWorkbook.Worksheets("Summary").Select ' dissocier le groupe
End Sub
C'est l'un des rares endroits où Select est vraiment nécessaire ; voyez
Select et Activate pour comprendre pourquoi on l'évite ailleurs.
Dissociez toujours le groupe ensuite : un utilisateur qui saisit dans des feuilles groupées écrit dans
toutes à la fois.
Pour un PDF par feuille, bouclez plutôt et construisez un nom à partir de chaque feuille :
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Visible = xlSheetVisible Then
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & ws.Name & ".pdf"
End If
Next ws
Un chemin de fichier sûr, et l'erreur 1004 qu'il évite
L'échec que tout le monde rencontre, c'est l'erreur d'exécution 1004 : Document not saved. The document may be open, or an error may have been encountered when saving. Elle ne veut presque jamais dire ce qu'elle semble dire. Les causes habituelles :
- Le dossier n'existe pas — Excel ne le créera pas. Créez-le d'abord avec MkDir.
- Le PDF est déjà ouvert dans une visionneuse, ce qui verrouille le fichier.
- Le nom de fichier contient un caractère interdit par Windows, comme le
/d'une date ou le:d'une heure. - Il n'y a rien à imprimer — la feuille ou la zone d'impression est vide.
Un simple nom de fichier sans dossier ne provoque pas d'erreur, ce qui est pire : le PDF atterrit dans le dossier courant d'Excel (voir CurDir), et l'utilisateur ne le retrouve jamais. Construisez donc toujours le chemin complet, et nettoyez les morceaux qui proviennent des données :
Function SafePdfPath(folder As String, baseName As String) As String
Dim bad As Variant
For Each bad In Array("/", "\", ":", "*", "?", """", "<", ">", "|")
baseName = Replace(baseName, bad, "-")
Next bad
If Dir(folder, vbDirectory) = "" Then MkDir folder
SafePdfPath = folder & "\" & baseName & ".pdf"
End Function
Si c'est à l'utilisateur de choisir l'emplacement, demandez-le avec
GetSaveAsFilename et passez son résultat comme Filename — en
vérifiant False, qui signifie qu'il a annulé.
L'arbitrage : exportez, n'« imprimez » pas en PDF
Vous trouverez du code qui règle l'imprimante active sur Microsoft Print to PDF et appelle PrintOut
avec un nom de fichier. Ne le copiez pas. Il dépend d'un nom d'imprimante qui varie selon la machine et
la langue, il peut faire surgir une boîte de dialogue Enregistrer qui bloque une macro sans
surveillance, et il change au passage l'imprimante active de l'utilisateur. ExportAsFixedFormat est
intégré à Excel, n'a besoin d'aucune imprimante et reçoit le chemin en argument. La règle est simple :
le papier passe par PrintOut ; les fichiers passent par
ExportAsFixedFormat. Et quelle que soit la méthode appelée, la page qu'elle produit a été décidée
dans la mise en page — c'est là qu'un PDF à l'allure bizarre se corrige.
Comment ExcelMaster aide
Les macros PDF échouent de façons banales et bien précises : un dossier qui n'existe pas encore, une date avec des barres obliques dans le nom de fichier, une zone d'impression héritée du trimestre dernier, un tableau qui déborde sur une deuxième page. Chacune se manifeste par la même erreur 1004 peu parlante ou par un PDF subtilement faux.
ExcelMaster vous laisse dire ce que vous voulez — « exporte la synthèse et les deux onglets régionaux dans un seul PDF nommé d'après ce mois-ci, en paysage, sur une page de large » — et il écrit ensemble la mise en page, le chemin sûr et l'export, puis vérifie le résultat. Vous gardez la macro et vous vous épargnez les tâtonnements.
Questions fréquentes
Comment enregistrer une feuille Excel en PDF avec VBA ?
Appelez ExportAsFixedFormat sur la feuille avec Type:=xlTypePDF et un Filename complet se
terminant par .pdf, par exemple
Worksheets("Report").ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Out\Report.pdf". SaveAs
n'offre pas d'option PDF ; la méthode d'export est la voie prévue.
Comment enregistrer uniquement une plage en PDF ?
Appelez la méthode sur la plage elle-même : Range("A1:H40").ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath. Ce bloc est exporté quelle que soit la zone d'impression de la feuille, si bien que
vous n'avez pas à modifier puis rétablir la zone d'impression autour de l'export.
Comment exporter plusieurs feuilles dans un seul PDF ?
Sélectionnez les feuilles en groupe avec Worksheets(Array("Summary", "North")).Select, puis appelez
ActiveSheet.ExportAsFixedFormat. La sélection groupée est écrite en un seul document. Sélectionnez
ensuite une seule feuille pour dissocier le groupe, afin que la saisie suivante n'atterrisse pas sur
toutes les feuilles.
Pourquoi ExportAsFixedFormat déclenche-t-il l'erreur d'exécution 1004 ?
Le plus souvent parce que le dossier du chemin n'existe pas, que le PDF est déjà ouvert dans une
visionneuse, que le nom de fichier contient un caractère interdit comme / ou :, ou qu'il n'y a rien
à imprimer. Construisez le chemin complet, créez d'abord le dossier, et retirez les caractères
interdits de tout morceau issu des données.
Pourquoi mon PDF coupe-t-il le tableau sur plusieurs pages ou inclut-il des cellules en trop ?
Parce que le PDF reprend la mise en page de la feuille. Un tableau large en portrait à 100 % se coupe
sur plusieurs pages, et une plage utilisée qui descend loin sous les données ajoute des pages vides.
Corrigez cela dans PageSetup — orientation, zone d'impression et ajustement à une page de large —
avant d'exporter.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 29/09/2026.
Guides associés : VBA PrintOut · VBA Page Setup · VBA GetSaveAsFilename · VBA MkDir · VBA CurDir · VBA Outlook · VBA On Error
