Tableau pour accès différents selon utilisateurs

Bonjour à tous ,

je cherche à créer un tableau pour donner des accès différents selon les utilisateurs.

Sur le net j'ai trouvé ceci pour m'aider, ça ressemble un peu au fichier de ce site ...

J'ai adapté le fichier trouvé à mon application. Cela ne fonctionne pas !

j'ai un bug au niveau de cette ligne, erreur 9 "l'indice n'appartient pas à la sélection"

 Sheets(.Cells(1, i).Value).Visible = True
            'on affiche la feuille
        Else
            Sheets(.Cells(1, i).Value).Visible = xlSheetVeryHidden

Ci-dessous le module complet :

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 : (NOM As String, Id As String)
    'sont des paramètres envoyés lors du clic sur le bouton

Function VerifId(NOM As String, Id As String) As Boolean
Dim rngTrouve As Range
VerifId = False 'par défaut, renvoie FAUX

With Sheets("Feuil2") 'dans la feuil2
     'cherche, colonne A, le nom d'utilisateur saisi
    Set rngTrouve = .Columns(1).Cells.Find(NOM, lookat:=xlWhole)
    If rngTrouve Is Nothing Then 'si il ne trouve pas
        VerifId = False 'la fonction renvoie faux
    Else 's'il le trouve
        'vérifie que le mot saisi feuille parametrage colonne B est identique
        'au mot de passe saisi dans l'USF
        If rngTrouve.Offset(0, 1) <> Id Then
            VerifId = False 'si FAUX
        Else
            VerifId = True 'si VRAI
        End If
    End If
End With
End Function

Sub AfficheFeuilles(NOM As String)
Dim Col As Byte, i As Byte, Lig As Integer

With Sheets("Feuil2") 'dans la feuil2
    '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(NOM, 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

j'ai besoin d'un regard neuf s'il vous plait. Je ne comprend pas cette erreur.

Merci de votre aide,

cordialement,

bonjour

dit moi ce que vous donne :

 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 : (NOM As String, Id As String)
       'sont des paramètres envoyés lors du clic sur le bouton

    Function VerifId(NOM As String, Id As String) As Boolean
    Dim rngTrouve As Range
    VerifId = False 'par défaut, renvoie FAUX

    With Sheets("Feuil2") 'dans la feuil2
        'cherche, colonne A, le nom d'utilisateur saisi
       Set rngTrouve = .Columns(1).Cells.Find(NOM, lookat:=xlWhole)
        If rngTrouve Is Nothing Then 'si il ne trouve pas
           VerifId = False 'la fonction renvoie faux
       Else 's'il le trouve
           'vérifie que le mot saisi feuille parametrage colonne B est identique
           'au mot de passe saisi dans l'USF
           If rngTrouve.Offset(0, 1) <> Id Then
                VerifId = False 'si FAUX
           Else
                VerifId = True 'si VRAI
           End If
        End If
    End With
    End Function

    Sub AfficheFeuilles(NOM As String)
    Dim Col As Byte, i As Byte, Lig As Integer
On Error Resume Next
    With Sheets("Feuil2") 'dans la feuil2
       '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(NOM, 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

Resume Next
     MsgBox i
     MsgBox .Cells(1, i).Value
     MsgBox Sheets(.Cells(1, i).Value).Name
    End With
    End Sub

Bonjour,

Rien de directement apparemment (à vérifier le contenu des cellules appelées pour les noms de feuilles...)

Tu donnes deux lignes en survenance d'erreur : laquelle des deux, ou les deux ?

As-tu recueilli la valeur de i lors de l'erreur ?

NB- Tu utilises Find sans tester si la recherche a aboutie, cela peut être risquée (mais l'erreur ne vient pas de là, elle serait alors sur la ligne précédente utilisant Lig.

Tu as des Cells parasites dans tes expressions :

.Columns(1).Cells.Find... => .Columns(1).Find.... suffit ! [dans la Function et la Sub

De même dans :

.Cells(1, .Cells.Columns.Count).End... => .Cells(1, .Columns.Count).End...

Columns renvoie un objet Range qui se suffit à lui-même pour indiquer une colonne entière.

Je ne vois pas d'utilisation de la fonction dans ton code... ?

Mais supprime cette ligne :

VerifId = False 'par défaut, renvoie FAUX

Si tu fais un renvoi de valeur au début de la fonction tu risques d'avoir False alors que la bonne réponse serait True... !

lors de son utilisation dans le code d'une procédure (tu n'es pas dans une feuille de calcul !)

En outre, elle est inutile : ton code lui fait renvoyer une valeur dans tous les cas testés.

[L'utilisation de renvoi d'une valeur par défaut, exemple False, se fait s'il y a lieu à la fin, mais dans ce cas dans le code qui précède tu teste les cas où tu dois renvoyer vrai, tu fais renvoyer True et tu sors derrière par Exit Function ; si tu n'es pas sorti en cours de route, l'exécution arrivera alors à la fin et renverra False ; cela peut permettre dans certains cas de raccourcir le code, voire le rendre plus rapide (si statistiquement, tu sors plus souvent plus près de début que de la fin....)]

Cordialement.

Bonjour à tous,

merci pour vos réponses.

AMIR j'ai essayé ton code

j'ai des messages Box qui apparaissent mais ça fonctionne moins bien que le code que j'avais.

Avec le code que je vous ai montré, lorsque je rentré le NOM et le Matricule d'une personne, je voyais une correspondance avec mon tableau ce faire.

Dans mon tableau j'ai en colonne A = NOM, B =Id, C= Feuil1, D= Feuil2(la feuille où se trouve ce fameux tableau), E= Feuil3, F= Remplir( Formulaire à remplir par certain utilisateurs)

MFerrand

Le code a bugé seulement sur cette ligne

Sheets(.Cells(1, i).Value).Visible = True

Comment recueil ton la valeur de i lors de l'erreur ?

Si je supprime VerifId = False, le NOM et Matricule ne sont plus reconnus. J'ai cette procédure qui s’enclenche (j'obtiens le MsgBox en vert "Erreur Mot de passe et/ou utilisateur. Merci de saisir à nouveau") :

Option Explicit

'Code se déclenchant au clic sur bouton
Private Sub CommandButton3_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 matricule.", vbInformation
    Exit Sub
End If
'Lance la fonction VerifId en utilisant :
    '- TextBox1 comme paramètre "NOM"
    '- TextBox2 comme paramètre "Matricule"
'Si la fonction renvoie FAUX :
If VerifId(TextBox1, TextBox2) = False Then
    'c'est que le mot de passe ou l'utilisateur est faux donc
    'Message à l'utilisateur
    MsgBox "[color=#00BF40]Erreur Mot de passe et/ou utilisateur. Merci de saisir à nouveau[/color].", 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
Accueil.Hide
End Sub

Encore merci pour votre aide

bonjour

dit moi ce que vous donne :

oui j ai voulu les infos sur ces msgboxs

Ci-dessous mon tableau pour info

sans titre

bonjour

dit moi ce que vous donne : ( recuperer les infos qui sont sur les msgbox)

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 : (NOM As String, Id As String)
       'sont des paramètres envoyés lors du clic sur le bouton

    Function VerifId(NOM As String, Id As String) As Boolean
    Dim rngTrouve As Range
    VerifId = False 'par défaut, renvoie FAUX

    With Sheets("Feuil2") 'dans la feuil2
        'cherche, colonne A, le nom d'utilisateur saisi
       Set rngTrouve = .Columns(1).Cells.Find(NOM, lookat:=xlWhole)
        If rngTrouve Is Nothing Then 'si il ne trouve pas
           VerifId = False 'la fonction renvoie faux
       Else 's'il le trouve
           'vérifie que le mot saisi feuille parametrage colonne B est identique
           'au mot de passe saisi dans l'USF
           If rngTrouve.Offset(0, 1) <> Id Then
                VerifId = False 'si FAUX
           Else
                VerifId = True 'si VRAI
           End If
        End If
    End With
    End Function

    Sub AfficheFeuilles(NOM As String)
    Dim Col As Byte, i As Byte, Lig As Integer
On Error GoTo er1
    With Sheets("Feuil2") 'dans la feuil2
       '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(NOM, 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

er1:
     MsgBox "Col = " & Col & " Lig = " & Lig & " i = " & i
     MsgBox .Cells(1, i).Value
     MsgBox Sheets(.Cells(1, i).Value).Name
    End With
    End Sub

J'ai eu exactement ceci

msgbox1 msgbox2 msgbox3

bonjour

avez vous sur le classeur une feuill nome "Feuil3"

Dans mon classeur j'ai "Feuil1 (des listes pour les ComboBox qui se trouvent dans l'Userform Remplir), Feuil2 ( le tableaux avec les autorisations d'accès), Feuil3 ( Un récapitulatif des choix fait dans les ComboBox par les utilisateurs de Remplir)

Lorsque tu es en mode Arrêt suite à une erreur d'exécution, le survol des variables avec la souris affiche leur valeur au moment de l'arrêt dans une info-bulle.

Je n'ai parlé que de supprimer la première affectation de renvoi de la fonction, à la 3e ligne (juste après Dim) pas les autres.

Je la trouve dangereuse.

OK merci MFerrand

bonjour

je pense

 Col = 5 '.Cells(1, .Columns.Count).End(xlToLeft).Column cette methode inclus la derniere colonne comme une feuille
    ' et vous n avez pas une feuil nome "Remplir"

alors

Col = 5

voici une autre proposition

Function User_Verif(Nom As String, Id As String) As Byte ' Vous pouvez appeler  cette fonction  a partir des autre codes
    Dim c
    User_Verif = 0
    With Sheets("Feuil2")
       Set c = .Columns(1).Cells.Find(Nom, lookat:=xlWhole) ' Il faut interdire les doublons de noms
       '  Cette méthode trouve seulement le dernier occurrence
       'Si par exemple vous avez deux  jean alors la méthode dépasse le première  vous donne le deuxième
       If Not c Is Nothing Then
           If c.Offset(0, 1) = Id Then
           User_Verif = 1 'existe et Id correct ===> OK
           Else
           User_Verif = 2 'existe mais Id incorrect
          ' MsgBox "Id incorect"
           End If
           Else
           User_Verif = 0 'pas d utilisateur portant ce nom
          ' MsgBox "pas d utilisateur portant ce nom"
       End If
    End With
    End Function

    Sub AfficheFeuilles() 'Nom As String a adapter selon votres besoin
    Dim Col As Byte, i As Byte, Lig As Integer
    With Sheets("Feuil2")
    Col = 5 '.Cells(1, .Columns.Count).End(xlToLeft).Column cette methode inclus la derniere colonne comme une feuille
    ' et vous n avez pas une feuil nome "Remplir"
    Lig = .Columns(1).Cells.Find("john", lookat:=xlWhole).Row ' Il faut interdire les doublons de noms
       '  Cette méthode trouve seulement le dernier occurrence
       'Si par exemple vous avez deux  jean alors la méthode dépasse le première  vous donne le deuxième
    Select Case User_Verif("john", "0000")
    Case 1
    For i = 3 To Col
    If UCase(.Cells(Lig, i)) = "X" Then
    Sheets(.Cells(1, i).Value).Visible = True
    Else
    Sheets(.Cells(1, i).Value).Visible = xlSheetVeryHidden ' bien pour mise a jour
    End If
    Next i
   Case 2
    MsgBox "Id incorect"
   Case 0
   MsgBox "pas d utilisateur portant ce nom"
   End Select
   End With
    End Sub
     

et pour prévenir un arrêt de la machine ou la fermeture de Excel sans avertissement « il arrive «

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name = "Feuil1" Then ' metre la feuil ou les feuils qui reste toujours affichees 'Or Sh.Name = "Feuil2" Or (Sh.Name = "Feuil3") Then
Sh.Visible = True
Else
Sh.Visible = xlSheetVeryHidden
End If
End Sub

ou :

--------------------------########################--------------------------

Private Sub Workbook_Open()
If ActiveSheet.Name = "Feuil1" Then ' metre la feuil ou les feuils qui reste toujours affichees 'Or ActiveSheet.Name = "Feuil2" Or (ActiveSheet.Name = "Feuil3") Then
ActiveSheet.Visible = True
Else
ActiveSheet.Visible = xlSheetVeryHidden
End If
End Sub

--------------------------########################--------------------------

Rechercher des sujets similaires à "tableau acces differents utilisateurs"