Dans cette article, je vais vous expliquer comment il est possible d'empêcher l'utilisateur d'imprimer un Classeur Excel ou une partie d'un Classeur.
Parfois, vous voulez laisser un utilisateur pouvoir ouvrir un Classeur, le consulter ou éventuellement le modifier – mais en même temps, vous ne voulez pas qu'il puisse l'imprimer. Est-ce possible? Oui, tout à fait! Avec un peu de VBA, ceci est très simple à mettre en place.
Utiliser l'événement Workbook.BeforePrint
en VBA
En VBA, il est possible de déclencher une macro au moment où l'utilisateur clique sur le bouton de l'impression. Ce déclenchement se produit grâce à l'événement BeforePrint
placé dans l'Objet ThisWorkbook
du Classeur. D'ailleurs n'hésitez pas à consulter la liste complète des événements en VBA, c'est très pratique!
La structure de l'événement BeforePrint
L'événement BeforePrint
est déclenché, comme son nom en anglais l'évoque, avant l'impression. Il nous donne donc la possibilité d'exécuter un code à ce moment-là.
1 2 3 4 5 |
Private Sub Workbook_BeforePrint(Cancel As Boolean) ' ... votre code ... End Sub |
Comme vous pouvez le constater, cet événement (Event
) contient une variable – Cancel
. Cette variable détermine si oui ou non, le code doit abandonner l'impression.
Par défaut, la valeur de Cancel
est False
et donc l'impression est supposé avoir lieu. Si le contenu de la variable Cancel
est changé en True
, Excel mettra fin à l'impression avant même son début.
Pour rappel: le code VBA de l'événement doit être placé dans l'Objet ThisWorkbook
(voir la capture d'écran, l'Objet est surligné en jaune)…
Maintenant que l'on sait comment déclencher l'exécution du code VBA avant l'impression, voici les manières possibles d'empêcher l'utilisateur d'imprimer…
Empêcher l'impression du Classeur Excel entier
Une des possibilités est d'interdire l'impression de n'importe quelle partie du Classeur en question. Le code VBA pour ce faire est on ne peut plus simple. Il suffit d'attribuer la valeur True
(= Vrai) à la variable Cancel
(= abandonner).
Voici donc le code VBA que vous devez coller dans votre classeur (dans l'objet ThisWorkbook
).
1 2 3 4 5 |
Private Sub Workbook_BeforePrint(Cancel As Boolean) Cancel = True End Sub |
Résultat: après le clic sur "Imprimer", rien ne se passera. Ni l'impression, ni aucune autre action.
Si vous voulez ajouter un message pour l'utilisateur, le code VBA ressemblera à ceci:
1 2 3 4 5 6 |
Private Sub Workbook_BeforePrint(Cancel As Boolean) MsgBox "Ce Classeur ne peut pas être imprimé..." Cancel = True End Sub |
Empêcher l'impression d'une ou plusieurs Feuilles spécifiques
Il est également possible de laisser l'utilisateur imprimer certaines Feuilles mais pas d'autres. Dans ce cas-ci, il faut ajouter une logique conditionnelle dans le code précédent.
Le code VBA qui suit empêche l'utilisateur d'imprimer la Feuille "Résumé". Toutes les autres Feuilles peuvent être imprimées.
1 2 3 4 5 6 7 8 9 |
Private Sub Workbook_BeforePrint(Cancel As Boolean) 'par Excel-Malin.com ( https://excel-malin.com/ ) If ActiveSheet.Name = "Résumé" Then MsgBox "Cette Feuille ne peut pas être imprimée..." Cancel = True End If End Sub |
Si vous souhaitez interdire l'impression de plusieurs Feuilles (mais pas toutes) , le code qui suit fera l'affaire:
1 2 3 4 5 6 7 8 9 |
Private Sub Workbook_BeforePrint(Cancel As Boolean) 'par Excel-Malin.com ( https://excel-malin.com/ ) Select Case ActiveSheet.Name Case "Résumé", "Offre", "Proposition", "Liste des utilisateurs": Cancel = True Case Else: Cancel = False End Select End Sub |
Ce code empêchera l'impression des Feuilles "Résumé", "Offre", "Proposition" et "Liste des utilisateurs". Vous n'avez qu'à adapter cette liste selon vos besoins…
Protéger l'impression par un mot de passe
Si vous voulez, il est également possible de "compliquer" ce code en y ajoutant d'autres fonctionnalités. Une qui me vient à l'esprit est la protection de l'impression par un mot de passe. Ainsi, après avoir lancé l'impression, l'utilisateur est demandé de saisir le mot de passe. S'il est correct, l'impression se poursuit. S'il n'est pas correct, l'impression est abandonnée…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Private Sub Workbook_BeforePrint(Cancel As Boolean) 'par Excel-Malin.com ( https://excel-malin.com/ ) Dim MotDePasse As String Dim MotDePasseUtilisateur As String MotDePasse = "AB123" '<-- mot de passe nécessaire pour poursuivre l'impression. MotDePasseUtilisateur = InputBox("Veuillez saisir le mot de passe pour poursuivre l'impression", "Impression") If MotDePasseUtilisateur <> MotDePasse Then MsgBox "Mot de passe incorrect. l'impression sera abandonnée..." Cancel = True End If End Sub |
Et voilà…
Remarque finale sur l'utilisation pratique
Pour empêcher l'utilisateur de contourner facilement votre restriction en effaçant votre code VBA, n'oubliez pas de protéger votre code VBA par un mot de passe.
Pour aller plus loin en VBA
Voici une sélection des articles de Excel-Malin.com qui pourraient vous être utiles…
- Liste de toutes les fonctions VBA
- Gestion de fichiers en VBA (copie, suppression,…)
- Suivi de l'activité de l'utilisateur d'un Classeur Excel (log)
- Comment utiliser RECHERCHEV en VBA
- Débloquer VBA dans les fichiers en provenance d'internet
A propos, vous pouvez consulter la page dédiée à l'événement BeforePrint
sur le site internet de Microsoft.
Commentaire sur “Excel: empêcher l’impression des Feuilles ou du Classeur entier”
Bonjour,
Mon fichiers ce compose de plusieurs pages, j'aimerais savoir le code a ajouter dans VBA pour empêcher l'impression d'une page si une cellule particulière est vide ou égale a zéro dans chaque page.
Merci d'avance.