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
Cela 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".

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" Then

Voici 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 Sub

Le 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 Sub

Comment 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 Sub

Bonjour 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 :

  • 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
Cela 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".

- 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 If

Cela 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 I

Mis à 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 Sub

Bonsoir 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é

Rechercher des sujets similaires à "macro gerer affichage feuilles"