VBA Excel - Mot de passe et Utilisateurs

Septembre 2016


VBA Excel - Mot de passe et Utilisateurs


Cette fiche pratique vous permet de configurer votre classeur Excel afin que chaque utilisateur accède uniquement aux feuilles qui lui sont autorisées.

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


Suite aux conseils d'Eriiic, 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.

Nous allons insérer un UserForm qui s'affichera à l'ouverture du fichier. Dans cette interface, nous aurons besoin de deux labels (étiquettes), deux TextBox pour la saisie du nom et du mot de passe et d'un CommandButton pour valider.
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
Vous pouvez maintenant :


*
    • fermer l'éditeur VBA,
    • enregistrer votre classeur,
    • fermer puis ouvrir à nouveau votre classeur pour tester.

Un exemple


Ci-joint, vous trouverez un classeur de démonstration. Nom d'utilisateur : ADMIN, mot de passe : ADMIN

A voir également :

Ce document intitulé «  VBA Excel - Mot de passe et Utilisateurs  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.