Protéger son code VBA : verrouiller le projet et exiger un mot de passe
Un classeur avec des macros circule : collègues, clients, stagiaires. Sans précaution, chacun peut lire le code, le modifier par erreur, ou lancer une macro qui efface des données. Protéger son code VBA se fait à deux niveaux : verrouiller le projet pour que le code ne soit plus visible, et contrôler l’exécution par un mot de passe, une liste d’utilisateurs ou la protection des feuilles. Les simulateurs reproduisent la fenêtre Propriétés de VBAProject, la liste des macros (Alt+F8) et le débogueur. Voir aussi MsgBox et InputBox, la gestion des erreurs et les formulaires UserForm.
Comment protéger l’accès au code VBA
Le code d’un classeur appartient à son projet VBA (VBAProject), visible dans l’explorateur de projet de l’éditeur (Alt+F11). Le verrouiller par mot de passe empêche d’afficher et de modifier les modules, les formulaires et les propriétés du projet. Les macros, elles, continuent de fonctionner normalement.
Verrouiller le projet pas à pas
- Ouvrez l’éditeur VBA avec Alt + F11.
- Dans l’explorateur de projet, cliquez avec le bouton droit sur VBAProject (Formation.xlsm) › Propriétés de VBAProject, ou passez par le menu Outils › Propriétés de VBAProject.
- Onglet Protection : cochez Verrouiller le projet pour l’affichage.
- Saisissez le mot de passe dans Mot de passe puis dans Confirmer le mot de passe, et validez par OK.
- Enregistrez le classeur au format .xlsm (Classeur Excel prenant en charge les macros).
- Fermez puis rouvrez le classeur : la protection ne s’applique qu’à la prochaine ouverture.
| Case « Verrouiller » | Mot de passe | Résultat à la réouverture |
|---|---|---|
| Cochée | Oui | Projet replié, mot de passe demandé pour voir le code : protection complète |
| Non cochée | Oui | Code visible et modifiable ; seule la fenêtre Propriétés du projet est protégée |
| Cochée | Non | Refusé par l’éditeur : un mot de passe est obligatoire |
| Non cochée | Non | Aucune protection |
Masquer ses macros de la liste Alt+F8
Verrouiller le projet cache le code, mais toutes les macros restent proposées dans Développeur › Macros (Alt+F8). Pour qu’un utilisateur ne lance pas une procédure interne, on la retire de cette liste : Private Sub, un argument, ou Option Private Module en tête de module.
| Écriture | Liste Alt+F8 | Appel depuis un autre module |
|---|---|---|
Sub Macro() ou Public Sub Macro() | Visible | Oui |
Private Sub Macro() | Masquée | Non, seulement dans son module |
Sub Macro(Optional x As Boolean) | Masquée | Oui |
Option Private Module en tête du module | Toutes masquées | Oui, à l’intérieur du projet |
Function Calcul() | Jamais listée | Oui (si Public) |
Empêcher l’exécution de code par mot de passe
Le verrouillage du projet n’empêche pas l’exécution. Pour réserver une macro sensible (suppression, mise à jour des tarifs, paie), on place un contrôle au début de la procédure : si la condition n’est pas remplie, Exit Sub quitte avant toute action. Le contrôle peut être un mot de passe saisi, le nom de l’utilisateur Windows, ou la protection de la feuille elle-même.
Demander un mot de passe avant d’exécuter
Sub Effacer_Stagiaires()
Dim mdp As String
mdp = InputBox("Mot de passe :", "Action protégée")
If mdp <> "Form26" Then
MsgBox "Mot de passe incorrect : action annulée.", vbCritical
Exit Sub
End If
Range("A2:C5").ClearContents
End Sub
| Technique | Instruction | À savoir |
|---|---|---|
| Mot de passe saisi | InputBox + If … Then Exit Sub | La saisie s’affiche en clair à l’écran |
| Saisie masquée | UserForm avec une TextBox PasswordChar = "*" | Voir la page sur les formulaires UserForm |
| Nombre d’essais | Do … Loop Until essai = 3 | Prévoir le cas Annuler (chaîne vide) |
| Casse | = ou StrComp(a, b, vbBinaryCompare) | Respecte les majuscules (comportement par défaut) |
| Sans la casse | StrComp(a, b, vbTextCompare) = 0 | Pour des noms d’utilisateurs |
| Utilisateur Windows | Environ("USERNAME") | Aucun mot de passe à retenir |
| Nom dans Office | Application.UserName | Modifiable par l’utilisateur : peu fiable |
| À l’ouverture | Workbook_Open + ThisWorkbook.Close | Sans effet si les macros sont désactivées |
Const MDP = "Form26") est lisible par quiconque ouvre l’éditeur. Le contrôle par mot de passe n’a de sens que si le projet VBA est verrouillé.Protéger les feuilles par le code
Protéger la feuille par macro empêche l’utilisateur de modifier les cellules verrouillées. Mais une feuille protégée bloque aussi… vos propres macros : il faut ôter la protection, écrire, puis reprotéger, ou utiliser UserInterfaceOnly:=True.
| Instruction | Effet |
|---|---|
ActiveSheet.Protect Password:="Form26" | Protège la feuille avec un mot de passe |
ActiveSheet.Unprotect Password:="Form26" | Ôte la protection (mot de passe sensible à la casse, sinon erreur 1004) |
ActiveSheet.Unprotect | Sans argument : Excel demande le mot de passe dans une boîte masquée |
Protect Password:=…, UserInterfaceOnly:=True | Protège pour l’utilisateur, laisse écrire les macros ; à reposer dans Workbook_Open |
ActiveSheet.ProtectContents | Renvoie True si la feuille est protégée |
ThisWorkbook.Protect Password:=…, Structure:=True | Interdit d’ajouter, supprimer, renommer ou afficher des feuilles |
Sheets("Paie").Visible = xlSheetVeryHidden | Masque une feuille : impossible à afficher depuis Excel, seulement par VBA |
On Error GoTo Fin).Exercice : sécuriser la mise à jour des tarifs
Classeur d’exercice (Énoncé et Corrigé)
- Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » : Module1, Module2 et ThisWorkbook.
- Ouvrez Alt+F8 : seule la macro
Lancer_MiseAJourdoit apparaître. Expliquez pourquoi les autres sont masquées. - Exécutez-la : testez un mauvais mot de passe, Annuler, puis Form26. Les tarifs augmentent de 5 % et la feuille reste protégée.
- Verrouillez le projet avec le mot de passe VBA2026, enregistrez, fermez, rouvrez et vérifiez que le code est masqué mais que la macro fonctionne.
- Répondez aux questions de la feuille Contrôle (cellules jaunes) et comparez avec la feuille Corrigé.