🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Save as PDF dans Excel — ExportAsFixedFormat pour les feuilles, les plages et les classeurs

|

VBA Save as PDF dans Excel — ExportAsFixedFormat pour les feuilles, les plages et les classeurs

TL;DR — Il n'existe pas de « SaveAs PDF » en VBA. Vous appelez ExportAsFixedFormat sur une feuille, une plage ou un classeur, vous passez Type:=xlTypePDF et 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 ExportAsFixedFormat et 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 : ExportAsFixedFormat contre 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