Introduction
L’objectif est que chaque utilisateur puisse avoir accès au fichier par mot de passe perso et qu’il soit limité à la lecture et aux modifications de certaines pages du fichier. Chaque utilisateur aurait alors accès à ses feuilles et uniquement à celles-là. D’un autre côté, il faut un mot de passe administrateur pour avoir accès à toutes les feuilles.
Présentation
J’ai inséré une feuille pour paramétrer plus facilement l’affichage des feuilles selon l’utilisateur. Le code en a été grandement simplifié. Merci à lui.
Notre classeur contient donc 13 feuilles :
– la feuille « Feuil1 » qui devra toujours être affichée,
– 11 feuilles à afficher selon les utilisateurs,
– la feuille « parametrage » qui regroupe les informations des utilisateurs, mots de passe ainsi que les feuilles à afficher selon. Seul l’ « admin » pourra accéder à cette feuille.
Feuille paramétrage :

Les noms d’utilisateurs et mots de passe sont sensibles à la casse.
Le code VBA du bouton devra :
- Vérifier que les 2 TextBox sont remplis,
- Vérifier que le mot de passe correspond au nom de l’utilisateur,
- Boucler sur toutes les feuilles, afficher celles correspondant à l’utilisateur et masquer « fortement » les autres.
Pour le fun, on ajoutera un code :
- Au chargement de l’UserForm :
- Vidage des 2 TextBox,
- Changement des propriétés « caption » de l’UserForm, des 2 labels et du CommandButton afin d’afficher ce que l’on souhaite (utilisateur, mot de passe, Valider etc.).
- afin que ne s’affichent que des *** au lieu des caractères saisis dans le textbox mot de passe.
NB : J’appelle masquer « fortement » une feuille, le fait de ne pas pouvoir l’afficher, même en passant par le menu Affichage. Pour cela, la propriété Visible de la feuille doit être réglée sur : xlSheetVeryHidden (en français dans le texte : « feuille excel fortement masquée »).
Le UserForm
Pour créer cet UserForm, il nous faut accéder à l’éditeur VBA. Pour vous familiariser avec celui-ci, vous pouvez consulter cette fiche pratique. Pour y accéder :
- Ouvrir le classeur concerné,
- Depuis n’importe quelle feuille du classeur, taper le raccourci clavier : ALT+F11
Dans l’éditeur VBA, créons notre UserForm. Pour cela, rien de plus simple :
Menu : Insertion ; Choix : UserForm.
Nous obtenons ceci :
NB : Si la boîte à outils n’apparaît pas par défaut : Menu : Affichage, cliquez sur « boîte à outils ».
Les contrôles de notre UserForm
Dans la boîte à outils, en survolant les icônes à l’aide de la souris, nous allons repérer les contrôles qui nous intéressent aujourd’hui, à savoir :
- Intitulé
- Zone de texte
- Bouton de commande
Pour les dessiner dans notre UserForm, il suffit de cliquer, dans la boîte à outils, sur l’icône correspondante et de dessiner, avec la souris, le contrôle que l’on souhaite, dans l’UserForm, à l’endroit de votre choix. Il vous faut donc dessiner, dans l’Userform, 2 Intitulés (labels – en vert dans l’image), 2 zones de texte (textbox) et un bouton de commande (CommandButton – en rouge dans l’image).

NB : Ne changez rien aux noms que vous voyez inscrit (Label1, Label2, UserForm etc.). C’est avec le code que nous allons les modifier.
Vous pouvez, par contre, régler tout de suite couleurs et tailles de votre UserForm et de ses contrôles. Pour cela, sélectionnez-les un par un et faites les réglages voulus dans la fenêtre Propriété.
Le code
- Les routines :
Pour ne pas encombrer les codes de notre Userform, nous allons placer, dans un module standard, les codes permettant de vérifier le mot de passe et d’afficher les feuilles.
Pour cela : Menu : Insertion ; Choix : Module.
Dans la fenêtre d’affichage du code du module ainsi créé, copiez-collez ces 2 procédures :
Option Explicit 'J'ai fait le chiox d'une fonction car il ne s'agit que de savoir 'si le mot de passe correspond à l'utilisateur. 'par conséquent, il nous faut une procédure qui compare les 2 'et qui renvoie VRAI ou FAUX (d'où la fonction déclarée As Boolean). 'ICI : (Utilisateur As String, MdP As String) 'sont des paramètres envoyés lors du clic sur le bouton Function VerifMDP(Utilisateur As String, MdP As String) As Boolean Dim rngTrouve As Range VerifMDP = False 'par défaut, renvoie FAUX With Sheets("parametrage") 'dans la feuille paramétrage 'cherche, colonne A, le nom d'utilisateur saisi Set rngTrouve = .Columns(1).Cells.Find(Utilisateur, lookat:=xlWhole) If rngTrouve Is Nothing Then 'si il ne trouve pas VerifMDP = False 'la fonction renvoie faux Else 's'il le trouve 'vérifie que le mot saisi feuille parametrgae colonne B est identique 'au mot de passe saisi dans l'USF If rngTrouve.Offset(0, 1) <> MdP Then VerifMDP = False 'si FAUX Else VerifMDP = True 'si VRAI End If End If End With End Function Sub AfficheFeuilles(Utilisateur As String) Dim Col As Byte, i As Byte, Lig As Integer With Sheets("parametrage") 'dans la feuille paramétrage 'comme on va boucler de la colonne 4 à la dernière colonne, on stocke le n° de la dern colonne : Col = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column 'on cherche colonne A le nom d'utilisateur saisi et on stocke son num de ligne Lig = .Columns(1).Cells.Find(Utilisateur, lookat:=xlWhole).Row For i = 3 To Col If UCase(.Cells(Lig, i)) = "X" Then 'si on trouve un "X" dans la cellule Sheets(.Cells(1, i).Value).Visible = True 'on affiche la feuille Else Sheets(.Cells(1, i).Value).Visible = xlSheetVeryHidden 'sinon on la masque End If Next i End With End Sub
Repassons maintenant à notre UserForm. En fermant la fenêtre d’affichage du code du module, nous devrions revoir notre UserForm. Si ce n’est pas le cas, dans la fenêtre VBA-Project (en haut à gauche), double-cliquez sur UserForm1 pour le faire réapparaitre.
- Du bouton de commande :
Double-cliquez sur le bouton de commande, dans votre UserForm. Vous entrez alors dans la fenêtre d’affichage du code où vous obtenez ces deux lignes :
Private Sub CommandButton1_Click() End Sub
Tout code, placé entre ces 2 lignes, sera exécuté à chaque clic gauche sur votre bouton.
Supprimez ces deux lignes de code et remplacez-les par :
Option Explicit 'Code se déclenchant au clic sur bouton Private Sub CommandButton1_Click() 'Si TextBox1 est vide If TextBox1 = "" Then 'Message à l'utilisateur MsgBox "Saisie du nom d'utilisateur obligatoire.", vbInformation 'sortie de la procédure Exit Sub End If 'Même chose avec TextBox2 If TextBox2 = "" Then MsgBox "Saisie du mot de passe obligatoire.", vbInformation Exit Sub End If 'Lance la fonction VerifMDP en utilisant : '- TextBox1 comme paramètre "utilisateur" '- TextBox2 comme paramètre "MdP" 'Si la fonction renvoie FAUX : If VerifMDP(TextBox1,TextBox2) = False Then 'c'est que le mot de passe ou l'utilisateur est faux donc 'Message à l'utilisateur MsgBox "Erreur Mot de passe et/ou utilisateur. Merci de saisir à nouveau.", vbInformation 'on vide les 2 textbox TextBox1 = "" TextBox2 = "" 'on sort de la procédure Exit Sub End If 'A partir d'ici, le code ne se déroule que lorsque mdp et nom sont corrects. 'On peut donc afficher les feuilles correspondant à l'utilisateur saisi AfficheFeuilles TextBox1 'masque l'UserForm UserForm1.Hide End Sub
- A l’initialisation de l’UserForm :
Sous le code que vous venez de coller, copiez-collez celui-ci :
'code se déclenchant à l'ouverture de Userform1 Private Sub UserForm_Initialize() 'vidage des textbox : TextBox1 = "" TextBox2 = "" 'réglage des propriétés Caption 'de l'Userform : Me.Caption = "Saisie du Mot de Passe" 'des labels : Label1.Caption = "Utilisateur" Label2.Caption = "Mot de Passe" 'du bouton CommandButton1.Caption = "VALIDER" 'Remplace les caractères saisis dans le textbox2 par des astérisques Me.TextBox2.PasswordChar = "*" End Sub
- A l’ouverture du classeur :
Vous voulez, qu’à l’ouverture de votre classeur :
– N’apparaisse que la feuille « Feuil1 » (toutes les autres feuilles sont masquées fortement)
– Apparaisse votre Userform
Toujours sous l’éditeur VBA, dans la fenêtre VBA-Project, double-cliquez sur ThisWorkbook, la fenêtre d’affichage du code de votre classeur s’ouvre, vide. Copiez-collez ce code :
Option Explicit Private Sub Workbook_Open() Dim Ws As Worksheet 'Masque toutes les feuilles sauf la feuille "Feuil1" '!!!! ADAPTEZ le nom de la feuille qui doit rester affichée For Each Ws In ThisWorkbook.Worksheets If Ws.Name <> "Feuil1" Then Ws.Visible = xlSheetVeryHidden Next Ws 'Charge l'Userform en mémoire Load UserForm1 'Affiche l'Userform UserForm1.Show End Sub