TL;DR —
Workbook_BeforePrintest un événement qu'Excel déclenche avant que quoi que ce soit dans le classeur ne soit imprimé. Il vous remet un seul argument,Cancel. MettezCancel = Trueet l'impression est annulée — vous pouvez donc valider d'abord (bloquer une impression avec des champs obligatoires vides), tamponner la date d'impression, ou journaliser qui a imprimé. Deux choses surprennent tout le monde : il se déclenche aussi pour l'aperçu avant impression — pas seulement pour une vraie impression — si bien que tout traitement lourd ici s'exécute chaque fois que quelqu'un fait un aperçu ; et il se déclenche une seule fois pour tout le classeur, pas une fois par feuille. Le code réside dansThisWorkbook.
' Réside dans ThisWorkbook — PAS un Module, PAS une feuille.
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If ThisWorkbook.Sheets("Invoice").Range("Total").Value = "" Then
MsgBox "Enter a Total before printing this invoice.", vbExclamation
Cancel = True ' <-- bloquer l'impression ; rien ne part à l'imprimante
End If
End Sub
La plupart des macros s'exécutent quand un utilisateur le demande — un bouton, un raccourci.
Workbook_BeforePrint s'exécute quand un utilisateur tente d'imprimer, et il s'exécute
avant que le travail n'atteigne l'imprimante. Ce moment précis est exactement ce qu'il vous
faut pour les vérifications et tampons de dernière seconde : confirmer que la feuille est prête
à l'impression, inscrire la date du jour dans un en-tête, consigner qui a imprimé et quand — ou
empêcher l'impression tout court. C'est aussi un événement doté de deux comportements qui
prennent les gens au dépourvu, et tous deux changent la façon dont vous devez écrire le
gestionnaire.
Ce que vous allez apprendre
- Le modèle mental — un point de contrôle sur l'impression, avec un
Cancelqui vous permet d'opposer un veto - La règle qui compte le plus —
Cancel = Truebloque l'impression, et un blocage silencieux est un bug - Le piège de l'aperçu avant impression — l'événement se déclenche aussi à l'aperçu, alors gardez-le léger
- Pourquoi il s'exécute une seule fois pour tout le classeur, pas par feuille — et quoi faire pour les en-têtes
- Où le code doit résider, et en quoi il diffère des événements gestuels
Le modèle mental : un point de contrôle sur l'impression, pas un bouton d'impression
Workbook_BeforePrint se déclenche à l'instant où une impression est demandée — Fichier ▸
Imprimer, Ctrl+P, une macro appelant .PrintOut, ou l'ouverture de la vue Imprimer — et il
se déclenche avant qu'Excel n'envoie quoi que ce soit à l'imprimante. Il passe un unique
Boolean par référence, Cancel. Vous n'appelez jamais ce Sub ; c'est Excel qui vous appelle,
attend, puis regarde Cancel. Laissez-le tel quel et l'impression se poursuit. Mettez
Cancel = True et Excel abandonne l'impression.
Le gestionnaire est donc un point de contrôle sur le chemin de l'imprimante, pas un bouton
d'impression que l'on presse. C'est la même forme que ses cousins de la famille des événements
gardiens, Workbook_BeforeClose et
Workbook_BeforeSave : chacun vous remet un Cancel que
vous pouvez régler pour opposer un veto à l'action qu'Excel s'apprête à entreprendre. Lisez
BeforePrint comme « préviens-moi quand quelqu'un imprime » et vous passez à côté du veto qui
justifie de le câbler. Et comme ces deux-là, son code réside dans le module ThisWorkbook —
double-cliquez sur ThisWorkbook sous « Microsoft Excel Objets » dans l'Explorateur de projets.
Dans un Module standard, il ne se déclenche jamais.
La règle qui compte le plus : Cancel = True la bloque — mais dites pourquoi
Bloquer une impression est la raison même pour laquelle beaucoup se tournent vers cet
événement — valider avant d'imprimer, ou empêcher un brouillon de sortir. Le mécanisme tient en
une ligne, Cancel = True. L'erreur, c'est de le faire en silence :
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If Sheets("Invoice").Range("Approved").Value <> "Yes" Then Cancel = True ' bloque... en silence
End Sub
L'utilisateur appuie sur Ctrl+P, rien ne s'imprime, et aucune explication n'apparaît. Il en
conclut que l'imprimante est en panne, ou qu'Excel est cassé, et il ouvre un ticket de bug
contre vous. Un Cancel silencieux est un bug, pas une fonctionnalité. Quand vous bloquez
une impression, dites à l'utilisateur pourquoi, pour que l'absence d'impression soit
manifestement votre décision :
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If Sheets("Invoice").Range("Approved").Value <> "Yes" Then
MsgBox "This invoice isn't approved yet - printing is blocked.", vbExclamation
Cancel = True
End If
End Sub
Le blocage devient alors lisible : l'utilisateur sait exactement quoi corriger. La même courtoisie s'applique à Workbook_BeforeSave — tout veto auquel l'utilisateur ne s'attendait pas mérite une phrase d'explication.
Le piège qui ruine les performances : l'aperçu avant impression le déclenche aussi
Voici le comportement qui transforme un gestionnaire utile en gestionnaire poussif.
Workbook_BeforePrint se déclenche non seulement lors d'une vraie impression, mais aussi quand
l'utilisateur ouvre l'aperçu avant impression (la vue Imprimer dans le Backstage). Si donc
votre gestionnaire fait quelque chose de coûteux — actualiser une connexion de données, lancer
une requête Web, recalculer un énorme modèle, reconstruire une feuille — ce travail s'exécute
chaque fois que quelqu'un fait un aperçu, et l'aperçu, c'est quelque chose que l'on fait
négligemment et souvent. La feuille rame, et personne ne relie la lenteur à un événement
d'impression.
La règle : gardez BeforePrint léger. Une validation, un tampon de date, une ligne de
journal — parfait. Les actualisations lourdes ont leur place sur une action explicite (un bouton
« Actualiser ») ou une tâche planifiée, pas sur un événement qui se déclenche à chaque coup
d'œil à l'aperçu avant impression. Si vous devez vraiment ne faire un traitement lourd que pour
une vraie impression, il n'existe aucun moyen propre et universel de distinguer l'aperçu de
l'impression à l'intérieur de l'événement classique — ce qui constitue en soi le meilleur
argument pour ne pas y placer de travail lourd du tout.
La règle sur la portée : il s'exécute une seule fois pour tout le classeur
Workbook_BeforePrint se déclenche une seule fois par demande d'impression, pour le classeur
entier — pas une fois par feuille, et il ne vous indique pas quelle feuille s'imprime. Il
n'existe pas de Worksheet_BeforePrint. Toute logique du type « préparer ceci avant d'imprimer »
doit donc prendre le classeur pour unité. Si vous voulez un tampon d'impression sur chaque
feuille, parcourez les feuilles vous-même, ou — mieux — utilisez un en-tête PageSetup
qu'Excel entretient pour vous :
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.PageSetup.LeftFooter = "Printed " & Format(Date, "yyyy-mm-dd")
Next ws
End Sub
Préférez les en-têtes et pieds de page PageSetup — &D pour la date, &P pour le numéro de
page, &F pour le nom de fichier — plutôt que d'inscrire le tampon dans une cellule. Un pied de
page ne concerne que l'impression et se nettoie tout seul ; une cellule que vous modifiez pour
l'impression doit être rétablie ensuite, et comme il n'existe pas d'événement partenaire
« AfterPrint » fiable et que l'aperçu déclenche lui aussi ce gestionnaire, ce rétablissement est
délicat à réussir. Laissez Excel maître du papier ; gardez vos cellules pour les données.
La distinction qui cadre le groupe : pas de Target, uniquement le classeur
Les deux événements gestuels de cette famille —
Worksheet_BeforeDoubleClick et
Worksheet_BeforeRightClick — sont au niveau feuille
et vous remettent une cellule Target, parce qu'un clic se produit quelque part de précis.
Workbook_BeforePrint, c'est l'inverse : au niveau classeur, sans Target, parce qu'une
impression est une action portant sur tout le document, pas un point sur une feuille. Ce que les
trois partagent, c'est l'indicateur Cancel — l'unique argument qui fait passer un événement de
la notification au veto. C'est la colonne vertébrale de toute la famille d'interception :
double-clic, clic droit, impression — pour chacun, Excel demande à votre code « dois-je
poursuivre ? » et votre Cancel est la réponse.
Comment ExcelMaster aide
Un garde-fou d'impression, ce sont quelques petites décisions faciles à rater subtilement : le
Cancel = True qui bloque le travail, le MsgBox qui empêche le blocage de rester mystérieux,
la discipline de garder le gestionnaire léger pour que l'aperçu reste rapide, et le recours à
PageSetup au lieu de modifier des cellules.
ExcelMaster
vous laisse décrire le comportement à la place. Dites « avant impression, si la facture n'est
pas approuvée, bloque l'impression et préviens l'utilisateur, et tamponne la date d'impression
dans le pied de page de chaque feuille », et il écrit un Workbook_BeforePrint dans
ThisWorkbook qui règle Cancel, explique le blocage, et utilise PageSetup pour le tampon.
Vous gardez le classeur et le code ; vous vous épargnez d'apprendre le piège de l'aperçu à la
dure.
Questions fréquentes
Comment exécuter une macro avant l'impression dans Excel ?
Placez une procédure Workbook_BeforePrint dans le module ThisWorkbook :
Private Sub Workbook_BeforePrint(Cancel As Boolean). Excel l'appelle avant toute impression du
classeur. Ajoutez-y votre préparation ou vos vérifications. Il ne se déclenche pas depuis un
Module standard.
Comment empêcher un classeur de s'imprimer en VBA ?
Mettez Cancel = True à l'intérieur de Workbook_BeforePrint. Excel vérifie Cancel après
l'exécution de votre gestionnaire, et True bloque l'impression. Affichez toujours un MsgBox
qui explique pourquoi — un blocage silencieux ressemble à une imprimante en panne aux yeux de
l'utilisateur.
Workbook_BeforePrint se déclenche-t-il à l'aperçu avant impression ?
Oui. Ouvrir la vue Imprimer / Aperçu avant impression le déclenche, pas seulement une vraie impression. C'est pourquoi vous devriez garder le gestionnaire léger — toute actualisation ou tout recalcul lourd s'exécuterait chaque fois que quelqu'un fait un aperçu.
Existe-t-il un événement Worksheet_BeforePrint pour une seule feuille ?
Non. BeforePrint n'existe qu'au niveau classeur et se déclenche une seule fois pour tout le
classeur, sans vous dire quelle feuille s'imprime. Pour agir feuille par feuille, parcourez
ThisWorkbook.Worksheets à l'intérieur du gestionnaire, ou réglez l'en-tête/pied de page
PageSetup de chaque feuille.
Comment ajouter la date d'impression sur chaque page ?
Utilisez un pied de page PageSetup avec la date, soit le code intégré &D, soit
Format(Date, "yyyy-mm-dd"), appliqué à chaque feuille dans Workbook_BeforePrint. Un pied de
page ne concerne que l'impression et n'a pas besoin d'être nettoyé, contrairement à une valeur
inscrite dans une cellule.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 06/08/2026.
Guides associés : VBA Worksheet_BeforeDoubleClick · VBA Worksheet_BeforeRightClick · VBA Workbook_BeforeSave · VBA Workbook_BeforeClose · VBA Workbook_Open
