IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tableau pour accès différents selon utilisateurs


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2016
    Messages : 22
    Par défaut 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é un exemple pour m'aider.

    J'ai tout adapté à 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"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Sheets(.Cells(1, i).Value).Visible = True
                'on affiche la feuille
           Else
                Sheets(.Cells(1, i).Value).Visible = xlSheetVeryHidden
    Ci-dessous le module complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    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,

  2. #2
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Bonjour,

    Tout d'abord, quelques petites améliorations :
    - utilisation de variables contenant les worksheet pour améliorer la vitesse d'exécution
    - Amélioration du if ligne 22 : les 5 lignes peuvent se faire en une seule

    Ensuite, en commentaire ligne 35, tu dis que l'on parcourt les colonnes de la 4ème à la énième. Or, dans ta boucle, tu commences à partir de la troisième (corrigé dans mon code).

    Après, tu peux avoir des soucis d'indiçage à cause des lignes 36 et 38 si jamais elles sont vides.
    En tout cas, ton erreur est une erreur d'indice, et à moins d'avoir le fichier, on ne pourra pas faire grand chose (une copie d'écran est suffisante). Ou alors, tu peux nous donner la plage de données sur laquelle tu travailles.

    Sinon voici ton code légèrement amélioré et avec la correction de la colonne 3 en 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Option Explicit
     
    Function VerifId(NOM As String, Id As String) As Boolean
        Dim rngTrouve As Range
        Dim feui As Worksheet
     
        VerifId = False 'par défaut, renvoie FAUX
        Set feui = Sheets("Feuil2")
     
        With feui '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 's'il ne trouve pas
                VerifId = False 'la fonction renvoie faux
            Else
                'vérifie que le mot saisi feuille parametrage colonne B est identique au mot de passe saisi dans l'USF
                VerifId = Not rngTrouve.Offset(0, 1) <> Id
            End If
        End With
    End Function
     
    Sub AfficheFeuilles(NOM As String)
        Dim i As Long, col As Long, lig As Long
        Dim feui As Worksheet
        Dim c As Range
     
     
        Set feui = Sheets("Feuil2")
     
        With feui '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 = 4 To col
                If UCase(.Cells(lig, i).Value) = "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

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2016
    Messages : 22
    Par défaut
    Bonjour jeanmidudu,

    C'est le commentaire qui n'était pas bon, c'est bien à partir de Colonne 3, Excuse moi.
    J'ai essayé ton code et l'erreur est toujours là.

    Ci-dessous mon tableau : 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)
    Nom : Sans titre.png
Affichages : 283
Taille : 42,2 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    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 3 à 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

  4. #4
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Je n'y avais pas pensé au début, mais en voyant ton classeur, je me demande si tu as la même orthographe exactement.
    Attention à la casse, aux espaces avant, après, entre et aux caractères spéciaux. Le meilleur moyen d'assurer le coup, c'est de faire un copier-coller des noms de feuille dans tes entêtes de colonnes.

    Si ça ne fonctionne pas, fais afficher
    .Cells(1, i).Value

    Sinon, je persiste mais je te conseille d'utiliser le code ci-dessous (corrigé pour la colonne 4 en 3), car plus efficace (grosse différence avec 1000 lignes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Option Explicit
     
    Function VerifId(NOM As String, Id As String) As Boolean
        Dim rngTrouve As Range
        Dim feui As Worksheet
     
        VerifId = False 'par défaut, renvoie FAUX
        Set feui = Sheets("Feuil2")
     
        With feui '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 's'il ne trouve pas
                VerifId = False 'la fonction renvoie faux
            Else
                'vérifie que le mot saisi feuille parametrage colonne B est identique au mot de passe saisi dans l'USF
                VerifId = Not rngTrouve.Offset(0, 1) <> Id
            End If
        End With
    End Function
     
    Sub AfficheFeuilles(NOM As String)
        Dim i As Long, col As Long, lig As Long
        Dim feui As Worksheet
        Dim c As Range
     
     
        Set feui = Sheets("Feuil2")
     
        With feui '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).Value) = "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

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2016
    Messages : 22
    Par défaut
    Sinon, je persiste mais je te conseille d'utiliser le code ci-dessous (corrigé pour la colonne 4 en 3), car plus efficace (grosse différence avec 1000 lignes)
    oui pardon je l'utilise maintenant c'est juste que je voulais te montrer le code précédent corrigé avec la bonne colonne. Merci encore.

    j'ai bien vérifié les noms des feuilles et les noms dans le code.

    Est-ce que l'erreur peut venir du fait que dans mon tableau la colonne Remplir renvoie à un Userform et non pas à une Feuille Excel ?

  6. #6
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Citation Envoyé par Max1991 Voir le message
    Est-ce que l'erreur peut venir du fait que dans mon tableau la colonne Remplir renvoie à un Userform et non pas à une Feuille Excel ?
    Alors là oui, je peux t'assurer que ça ne fonctionnera JAMAIS

    Pour contourner le problème il y a plusieurs moyens, mais tout dépend de comment tu ouvres ton UserForm.
    Un bon moyen en général est de stocker la valeur dans une variable booléenne et de tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ouvrir = true then userform.show

Discussions similaires

  1. Affichage différent selon utilisateur excel
    Par mimititimi dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/09/2015, 11h35
  2. Réponses: 1
    Dernier message: 08/03/2010, 17h09
  3. Réponses: 5
    Dernier message: 24/08/2009, 18h22
  4. Autorisatioons différentes selon utilisateur
    Par chibredor dans le forum Sécurité
    Réponses: 3
    Dernier message: 21/07/2008, 21h35
  5. Formulaire de modification différent selon utilisateur
    Par Cilaos dans le forum SharePoint
    Réponses: 3
    Dernier message: 02/12/2007, 12h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo