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 = xlSheetVeryHiddenCi-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 Subj'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 SubBonjour,
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 = TrueComment 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 SubEncore merci pour votre aide
bonjour
dit moi ce que vous donne :
oui j ai voulu les infos sur ces msgboxs
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 Subbonjour
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.
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 = 5voici 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 Subou :
--------------------------########################--------------------------
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--------------------------########################--------------------------



