Macro pour gérer l'affichage des feuilles
Bonsoir à tous
J'ai un userform à patir duquel je souhaite que lorsque les conditions souhaitées pour un utilisateur sont réunies, que les feuilles devant s'afficher s'affichent et les autres restent masquées.
Les conditions à prendre en compte sont :
- le code utilisateur à saisir dans le textbox5. la liste des utilisateurs se trouve dans la feuille ADMIN!B4:B23
- le mot de passe à saisir dans le textbox6. le mot de passe de chaque utilisateur figure dans la feuille ADMIN!C4:C23
- fermeture du userform
- affichage des feuilles autorisées sachant les feuilles autorisées pour un utilisateur sont celles comportant "x".
J'ai bidouillé le code ci-dessous mais il ne fonctionne pas et une erreur est signalée dans cette partie du code :
If Sheets("ADMIN").Cells(Ligne, i) = "x" ThenVoici le l'intégralité du code :
Sub Gestion_Feuille()
Sheets("ADMIN").Visible = True
Sheets("ADMIN").Select
Dim i As Long, Ligne As Long, nbColonnes As Long, nbLignes As Long
nbLignes = Sheets("ADMIN").Cells(Rows.Count, "B").End(xlUp).Row
nbColonnes = Sheets("ADMIN").Cells(3, Columns.Count).End(xlToLeft).Column
'Trouver la ligne du User
For i = 4 To nbLignes
If Sheets("ADMIN").Range("B" & i) = UCase(Range("motpasse")(i)) Then
Ligne = i
Exit For
End If
Next
'Parcourir ses feuilles permises
For i = 4 To nbColonnes
If Sheets("ADMIN").Cells(Ligne, i) = "x" Then
Sheets(Cells(3, i).Value).Visible = xlSheetVisible
Else
Sheets(Cells(3, i).Value).Visible = xlSheetVeryHidden
End If
Next
End SubLe code du userform est le suivant:
Private Sub CommandButton1_Click()
Dim i
Dim t
For i = 1 To Range("MotPasse").Count
For t = 1 To Range("motpasse2").Count
If TextBox5 = UCase(Range("motpasse")(i)) And TextBox6 = UCase(Range("motpasse2")(t)) Then
Unload Me
Call Gestion_Feuille
End If
Exit Sub
Next
Next
TextBox2.Value = TextBox2.Value + 1
If TextBox2.Value = 3 Then
Unload Me
If Workbooks.Count > 1 Then
ActiveWorkbook.Save
ActiveWorkbook.Close
Else
Application.Quit
End If
Else
TextBox5 = ""
TextBox6 = ""
TextBox5.SetFocus
TextBox6.SetFocus
End If
End SubComment fusionner les 2 codes (le code du module et celui du userform) pour aboutir au même résultat.
Je reste disponible pour plus d'éclaircissement
Bonjour,
Une piste, code attaché au bouton "Valider" :
Private Sub CommandButton1_Click()
Dim PlgNom As Range
Dim PlgMdeP As Range
Dim PlgFe As Range
Dim Cel As Range
Dim I As Integer
Set PlgNom = Range("Motpasse")
Set PlgMdeP = Range("Motpasse2")
Set PlgFe = Worksheets("ADMIN").Range("D3:AE3")
Set Cel = PlgNom.Find(TextBox5.Text, , xlValues, xlWhole)
If Cel Is Nothing Then
MsgBox "Nom d'utilisateur incorrect !": Exit Sub
Else
If Cel.Offset(, 1).Value <> TextBox6.Text Then
MsgBox "Mot de passe incorrect !": Exit Sub
End If
End If
For I = 1 To PlgFe.Count
'gestionnaire d'erreur pour les feuilles inexistantes
On Error Resume Next
If Cel.Offset(, I + 1).Value = "x" Then
Worksheets(PlgFe(I).Value).Visible = True
If Err.Number <> 0 Then MsgBox "Feuille " & PlgFe(I).Value & " introuvable !"
Else
Worksheets(PlgFe(I).Value).Visible = False
If Err.Number <> 0 Then MsgBox "Feuille " & PlgFe(I).Value & " introuvable !"
End If
Next I
End SubBonjour Theze et le forum
Je viens de tester votre solution mais il ne fonctionne pas comme je souhaite.
J'ai l'impression qu'il ne se limite pas seulement à la ligne du code utilisateur et au mot de passe correspondant à l'utilisateur pour ces vérifications.
Aussi les feuilles à masquer ne se masquent pas.
Un test avec le fichier joint vous permettra de mieux cerner nos préoccupations et certainement de les prendre en considération.
Merci déjà pour cette piste de solution.
Bonjour,
Je reprend ta demande :
J'ai un userform à patir duquel je souhaite que lorsque les conditions souhaitées pour un utilisateur sont réunies, que les feuilles devant s'afficher s'affichent et les autres restent masquées.
Les conditions à prendre en compte sont :
Cela signifie que lorsque le code utilisateur et le mot de passe sont corrects les actions suivantes doivent se produire :
- le code utilisateur à saisir dans le textbox5. la liste des utilisateurs se trouve dans la feuille ADMIN!B4:B23
- le mot de passe à saisir dans le textbox6. le mot de passe de chaque utilisateur figure dans la feuille ADMIN!C4:C23
- fermeture du userform
- affichage des feuilles autorisées sachant les feuilles autorisées pour un utilisateur sont celles comportant "x".
- le code utilisateur à saisir dans le textbox5. la liste des utilisateurs se trouve dans la feuille ADMIN!B4:B23
C'est ce que fait cette partie du code :
Set Cel = PlgNom.Find(TextBox5.Text, , xlValues, xlWhole)
If Cel Is Nothing Then
MsgBox "Nom d'utilisateur incorrect !": Exit Sub
Else- le mot de passe à saisir dans le textbox6. le mot de passe de chaque utilisateur figure dans la feuille ADMIN!C4:C23
C'est ce que fait cette partie du code :
If Cel.Offset(, 1).Value <> TextBox6.Text Then
MsgBox "Mot de passe incorrect !": Exit Sub
End IfCela signifie que lorsque le code utilisateur et le mot de passe sont corrects les actions suivantes doivent se produire :
- fermeture du userform
- affichage des feuilles autorisées sachant les feuilles autorisées pour un utilisateur sont celles comportant "x".
C'est ce que fait cette partie du code :
For I = 1 To PlgFe.Count
'gestionnaire d'erreur pour les feuilles inexistantes
On Error Resume Next
If Cel.Offset(, I + 1).Value = "x" Then
Worksheets(PlgFe(I).Value).Visible = True
If Err.Number <> 0 Then MsgBox "Feuille " & PlgFe(I).Value & " introuvable !"
Else
Worksheets(PlgFe(I).Value).Visible = False
If Err.Number <> 0 Then MsgBox "Feuille " & PlgFe(I).Value & " introuvable !"
End If
Next IMis à part la fermeture de l'UserForm mon code fait ce qui est demandé. J'ai rajouté un gestionnaire d'erreur car une grande partie des feuille est absente.
Je poste ton premier fichier avec quelques modifications (suppressions des liaisons, ajout de certaines feuilles et suppression de certaines références de feuille
Bonjour Theze
Merci pour les éclaircissements apportés.
J'ai testé votre fichier joint et il fonctionne à merveille.
J'ai pu détecté la cause du pourquoi il ne fonctionne pas dans mon cas réel (selon mon interprétation).
En effet, le nombre d'utilisateur est appelé à évolué par l'ajout de nouveaux utilisateurs.
Donc la plage
Worksheets("ADMIN").Range("D3:O3")n'est pas exhaustive voila pourquoi mon cas réel part de ADMIN!D3:AE3.
La plage ADMIN!D3:AE3 comporte des formules de ADMIN!L3:AE3 qui prenne en compte les nouvelles feuilles qui viendraient a être créée suite à l’ajout d'un utilisateur.
J'ai l'impression que les cellules vides contenues dans la plage ADMIN!L3:AE3 perturbent le fonctionnement de la macro.
Est-ce possible d'adapter votre proposition (macro) afin quelle puisse intégrer mes préoccupation?
Je suis preneur d'autre solution prenant en compte mes attentes.
NB : mes fichiers joint (post précédent) permettront de mieux comprendre certainement
Encore merci Theze pour vos riches contributions.
Bonjour,
J'ai modifié le code pour prendre en considération les plages dynamiques en colonne B et ligne 3. J'ai aussi fais en sorte, dans la plage des noms de feuille (ligne 3), d'éviter les valeurs égale à 0 ou chaîne vide, par contre, si le nom contenu dans la cellule ne correspond pas au nom d'une feuille, tu aura un message issu du gestionnaire d'erreur !
J'ai commenté le code pour plus de clarté :
Private Sub CommandButton1_Click()
Dim PlgNom As Range
Dim PlgFe As Range
Dim Cel As Range
Dim I As Integer
With Worksheets("ADMIN")
'défini la plage sur la colonne B de la feuille "ADMIN" de B4 à la dernière cellule non vide de la colonne B
Set PlgNom = .Range(.Cells(4, 2), .Cells(.Rows.Count, 2).End(xlUp))
'défini la plage sur la ligne 3 de D3 la dernière colonne non vide de la ligne 3
Set PlgFe = .Range(.Cells(3, 4), .Cells(3, .Columns.Count).End(xlToLeft))
End With
'recherche le login dans la colonne B (PlgNom)
Set Cel = PlgNom.Find(TextBox5.Text, , xlValues, xlWhole)
'si non trouvé, message et fin de procédure !
If Cel Is Nothing Then
MsgBox "Nom d'utilisateur incorrect !": Exit Sub
Else
'si login trouvé mais mot de passe incorrect, message et fin de procédure !
If Cel.Offset(, 1).Value <> TextBox6.Text Then
MsgBox "Mot de passe incorrect !": Exit Sub
End If
End If
'si on arrive ici, le login et mot de passe sont corrects...
For I = 1 To PlgFe.Count
'gestionnaire d'erreur pour les feuilles inexistantes
On Error Resume Next
'si un x dans la cellule de la ligne correspondant au login...
If Cel.Offset(, I + 1).Value = "x" Then
'la feuille est rendue visible à condition que dans la plage des noms de feuille
'la cellule qui correspond ne contient pas de 0 et qu'elle n'est pas vide
If PlgFe(I).Value <> 0 And PlgFe(I).Value <> "" Then
Worksheets(PlgFe(I).Value).Visible = True
'si le nom ne correspond à aucune feuille, une erreur est générée et donc, message !
If Err.Number <> 0 Then MsgBox "Feuille " & PlgFe(I).Value & " introuvable !"
End If
Else
'la feuille est cachée etc...
If PlgFe(I).Value <> 0 And PlgFe(I).Value <> "" Then
Worksheets(PlgFe(I).Value).Visible = False
'idem ici si le nom ne correspond pas !
If Err.Number <> 0 Then MsgBox "Feuille " & PlgFe(I).Value & " introuvable !"
End If
End If
Next I
'ferme la Form
Unload Me
End SubBonsoir Theze
C'est trop cool ce que tu as fait.
Ca me conviens parfaitement.
Merci surtout les explications qui ont facilitées ma compréhension.
Bonjour,
Heureux de t'avoir aidé