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

VBA PrintOut dans Excel — imprimer des feuilles, des plages et des copies depuis une macro

|

VBA PrintOut dans Excel — imprimer des feuilles, des plages et des copies depuis une macro

TL;DR — PrintOut envoie des pages à une imprimante. Appelez-la sur une feuille, une plage, un groupe de feuilles ou un classeur, et utilisez des arguments nommés pour ce dont vous avez besoin : Copies, From/To, Preview, Collate. Elle imprime les pages que définit votre mise en page : corrigez donc d'abord la page. Tant que vous construisez la macro, imprimez avec Preview:=True. Et si la cible est un fichier plutôt que du papier, n'imprimez pas du tout — exportez en PDF.

Sub PrintInvoices()
    With ThisWorkbook.Worksheets("Invoice")
        .PageSetup.PrintArea = "$A$1:$G$45"
        .PrintOut Copies:=2, Collate:=True, Preview:=False
    End With
End Sub

Voici l'extrémité papier d'une série de trois articles consacrée à la sortie des données d'Excel. La mise en page décide de ce qu'est une page. PrintOut, traitée ici, envoie ces pages à une imprimante. ExportAsFixedFormat envoie les mêmes pages dans un fichier PDF. Comme les deux sorties lisent une seule et même définition de page, la plupart des problèmes du type « mon impression est fausse » sont des problèmes de page, et ils se règlent avant même que cette ligne ne s'exécute.

Ce que vous allez apprendre

  • Ce que PrintOut imprime réellement, et d'où vient la page
  • Les arguments à connaître : copies, plages de pages, aperçu, assemblage
  • Imprimer une feuille, une plage, plusieurs feuilles ou un classeur entier
  • Tester sans gaspiller de papier
  • Choisir une imprimante avec ActivePrinter et remettre l'ancienne ensuite
  • L'arbitrage : PrintOut pour le papier, l'export pour les fichiers

Le modèle mental : PrintOut imprime des pages, pas des cellules

PrintOut ne connaît pas votre tableau. Elle connaît des pages : les rectangles dans lesquels Excel découpe la feuille à partir de la zone d'impression, de l'orientation, de l'échelle, des marges et des sauts de page. Elle envoie ces pages à l'imprimante, dans l'ordre. Alors quand une colonne se retrouve seule en page 2, ou qu'une page blanche sort à la fin, la cause est la définition de la page, pas l'appel d'impression :

  • Une colonne déborde sur une nouvelle page parce que la feuille est en portrait à 100 %.
  • Une page blanche apparaît parce qu'une cellule mise en forme loin sous les données étire la plage utilisée.
  • La moitié du rapport manque parce qu'une ancienne zone d'impression est toujours définie.

Gardez cette séparation en tête et le reste devient simple : la mise en page façonne les pages, PrintOut les livre.

Les arguments de PrintOut qui comptent

PrintOut accepte jusqu'à neuf arguments. Voici ceux dont vous vous servirez :

Argument Rôle
From, To Première et dernière page à imprimer. Omettez-les pour tout imprimer.
Copies Nombre de copies.
Collate True imprime chaque copie complète dans l'ordre (1-2-3, 1-2-3).
Preview True ouvre d'abord l'aperçu avant impression au lieu d'imprimer directement.
ActivePrinter L'imprimante à utiliser pour ce travail.
IgnorePrintAreas True imprime toute la feuille, sans tenir compte de la zone d'impression.

Écrivez-les toujours sous forme d'arguments nommés. .PrintOut 1, 2, 3 se compile, mais personne ne peut dire lequel de ces nombres est le nombre de copies.

Une feuille, une plage, plusieurs feuilles ou le classeur

C'est l'objet sur lequel vous appelez PrintOut qui fixe la portée :

Worksheets("Report").PrintOut                       ' une feuille
Worksheets("Report").Range("A1:F30").PrintOut       ' une plage, sans tenir compte de la zone d'impression
Worksheets(Array("North", "South")).PrintOut        ' plusieurs feuilles, un seul travail
ThisWorkbook.PrintOut                               ' toutes les feuilles visibles

Imprimer un ensemble de feuilles en un seul travail compte pour la numérotation des pages et pour les imprimantes recto verso : les feuilles sortent comme un seul document, avec une numérotation qui se poursuit d'une feuille à l'autre si le pied de page utilise &P. Pour imprimer chaque feuille séparément, bouclez avec For Each et appelez PrintOut dans la boucle.

Tester sans gaspiller de papier

Une macro d'impression en cours de développement est un broyeur à papier. Deux habitudes l'évitent :

Worksheets("Report").PrintOut Preview:=True    ' affiche l'apercu ; l'utilisateur decide
Worksheets("Report").PrintPreview              ' apercu seulement, n'imprime jamais de lui-meme

Preview:=True est l'interrupteur à basculer une fois la macro terminée : le code reste identique, seul cet argument change. Mieux encore, vérifiez la disposition en exportant en PDF pendant que vous travaillez — cela montre exactement les pages que PrintOut enverrait, et ne coûte rien.

Choisir une imprimante, et remettre l'ancienne ensuite

Application.ActivePrinter est l'imprimante qu'utilise Excel. Vous pouvez la modifier, mais le nom doit correspondre exactement, y compris le port attribué par Windows — quelque chose comme "Label Printer on Ne02:" — et ce port peut varier d'un ordinateur à l'autre. La modifier change aussi l'imprimante pour tout ce que l'utilisateur imprimera ensuite. Alors sauvegardez la valeur actuelle, changez, imprimez, puis rétablissez — même si l'impression échoue :

Sub PrintOnLabelPrinter()
    Dim oldPrinter As String
    oldPrinter = Application.ActivePrinter
    On Error GoTo Restore
    Application.ActivePrinter = "Label Printer on Ne02:"
    Worksheets("Labels").PrintOut
Restore:
    Application.ActivePrinter = oldPrinter
    If Err.Number <> 0 Then MsgBox "Could not print: " & Err.Description
End Sub

Pour trouver le nom exact, imprimez une fois à la main sur cette imprimante et lancez Debug.Print Application.ActivePrinter dans la fenêtre Exécution.

L'arbitrage : le papier par PrintOut, les fichiers par l'export

PrintOut possède les arguments PrintToFile et PrToFileName, et vous trouverez du code qui les associe à l'imprimante Microsoft Print to PDF pour fabriquer un PDF. Évitez-le. Il dépend d'un nom d'imprimante qui varie selon la machine et la langue de Windows, il peut faire surgir une boîte de dialogue Enregistrer qui fige une macro sans surveillance, et il change l'imprimante active. ExportAsFixedFormat produit le même PDF sans imprimante, sans boîte de dialogue et sans effet de bord. La règle : PrintOut sert au papier ; un fichier est un export. Et quelle que soit la sortie choisie, ses pages viennent de la mise en page — c'est là qu'il faut corriger.

Comment ExcelMaster aide

Les macros d'impression déraillent d'une manière qu'on ne voit que sur papier : la colonne orpheline en page 2, la page blanche à la fin, la mauvaise imprimante, les vingt copies qui devaient être deux. Chacune coûte une réimpression avant que quiconque ne regarde le code.

ExcelMaster vous laisse décrire le travail — « imprime la feuille de facture en deux exemplaires, en paysage, sur une page de large, sur l'imprimante d'étiquettes » — et écrit ensemble la mise en page et l'appel PrintOut, avec l'imprimante sauvegardée puis rétablie. Vous en voyez l'aperçu en PDF avant qu'une seule feuille de papier ne bouge.

Questions fréquentes

Comment imprimer une feuille avec VBA ?

Appelez PrintOut sur la feuille de calcul : Worksheets("Report").PrintOut. Ajoutez des arguments nommés selon vos besoins, comme Copies:=2 ou From:=1, To:=3. Elle imprime les pages définies par la mise en page de la feuille : réglez donc d'abord la zone d'impression et l'orientation si la disposition compte.

Comment imprimer une plage précise en VBA ?

Appelez PrintOut sur la plage : Range("A1:F30").PrintOut. Seule la plage est imprimée, quelle que soit la zone d'impression de la feuille. Pour une plage que vous imprimez souvent, définissez une fois pour toutes PageSetup.PrintArea et imprimez plutôt la feuille.

Comment afficher l'aperçu avant impression avant d'imprimer ?

Passez Preview:=True à PrintOut, ce qui ouvre l'aperçu avant impression et laisse l'utilisateur imprimer ou annuler. Pour afficher l'aperçu sans rien imprimer, appelez PrintPreview sur la feuille. Servez-vous de l'aperçu pendant le développement de la macro pour que vos tests ne gaspillent pas de papier.

Comment imprimer sur une imprimante précise en VBA ?

Affectez à Application.ActivePrinter le nom exact de l'imprimante, port compris, par exemple "Office Printer on Ne01:", puis appelez PrintOut. Sauvegardez d'abord la valeur précédente et rétablissez-la ensuite, car le réglage reste en vigueur pour tout ce que l'utilisateur imprimera après.

Peut-on utiliser PrintOut pour créer un PDF ?

Oui, avec l'imprimante Microsoft Print to PDF et PrToFileName, mais c'est fragile : les noms d'imprimante diffèrent d'une machine à l'autre et une boîte de dialogue Enregistrer peut bloquer la macro. Utilisez plutôt ExportAsFixedFormat Type:=xlTypePDF — il n'a besoin d'aucune imprimante et reçoit le chemin du fichier en argument.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 29/09/2026.

Guides associés : VBA Save as PDF · VBA Page Setup · VBA Used Range · VBA For Each · VBA Workbook BeforePrint · VBA Immediate Window · VBA On Error