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 :

"Inputbox de confirmation"


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
    Étudiant
    Inscrit en
    Février 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 35
    Par défaut "Inputbox de confirmation"
    Bonjour,
    Je bloque sur du VBA.... normal XD

    alors voila J'ai un fichier qui a son ouverture fait pop une inputbox et demande un matricule (ex: U789345). Si le matricule est connu dans une feuille appelée DroitsUsers (colonne A), alors les onglets associés dans une seconde colonne(colonne B) sont affichés, si le matricule n'existe pas, msgbox avec message d'erreur puis retour sur l'inputbox demandant le matricule.
    Je souhaiterai faire une input box de "confirmation":

    Si matricule entré précedemment est dans la liste (colonne A de DroitsUsers) alors rechercheV dans la même fueilleune 3ième colonne (C), contenant le nom associé au matricule.
    Puis msgbox demandant "êtes vous bien -nom et matricule- (trouver par la rechercheV) avec "oui" et "non" ds la msgbox, Si oui alors affichage des onglets associés (en colonne B de DroitsUSers) Sinon retour l'inputbox de demande de matricule.

    J'expère que mon explication est claire.

    Merci d'avance!

    Ps: j'ai trouvé ce code sur un fil de discussion, ce n'est pas moi qui l'ait fait.

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
     
    'on affiche la feuille Page d'accueil
     
        Sheets("Page d'accueil").Visible = True
     
    'on planque toutes les autres feuilles sauf Vierge
     
        For x = 1 To ThisWorkbook.Sheets.Count
     
            If Sheets(x).Name <> "Page d'accueil" Then Sheets(x).Visible = xlSheetVeryHidden
     
        Next
     
     
     
    End Sub
     
     
     
     
     
     
     
    Private Sub Workbook_Open()
     
    On Error Resume Next
     
            Application.ScreenUpdating = False
     
    'on defini un pointeur
     
            Pointeur = 0
     
     
    'on affiche la feuille Vierge
     
            Sheets("Page d'accueil").Visible = True
     
    'on va dessus
     
            Sheets("Page d'accueil").Activate
     
    'on planque toutes les autres
     
    For x = 1 To ThisWorkbook.Sheets.Count
     
    If Sheets(x).Name <> "Page d'accueil" Then Sheets(x).Visible = xlSheetVeryHidden
     
    Next
     
     
     
    'on saisit le user
     
    User = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
    'on saisit le mot de passe
    'Pour mettre un mot de passe enlever le "  '   " de la ligne d'après
    'MDP = InputBox("Veuillez saisir votre mot de passe", "Mot de passe")
     
     
     
    'Derniere ligne du tableau de la feuille DroitsUsers pour boucler dessus
     
    DerLigne = Sheets("DroitsUsers").Range("A65536").End(xlUp).Row
     
     
     
    'on boucle pour trouver les occurences, x=2 car je pars du principe que la premiere ligne contient les entetes de colonne
     
        For x = 2 To DerLigne
     
    'si ce qu'il y a dans la colonne1 (Colonne A : user) = le user saisi et ce qu'il y a dans la colonne2 (Colonne B : mot de passe)
     
    If Worksheets("DroitsUsers").Cells(x, 1) = User And Worksheets("DroitsUsers").Cells(x, 2) = MDP Then
     
    'on affiche la feuille définié en colonne3 (Colonne C : Onglet autorisé)
     
    'on affiche la feuille correspondante
     
            FeuilleVisible = Worksheets("DroitsUsers").Cells(x, 3)
     
            Sheets(FeuilleVisible).Visible = True
     
    'on va dessus
     
            Sheets(FeuilleVisible).Activate
     
    'on se met un pointeur pour voir si on trouve quelque chose, si on trouve rien on quittera
     
              Pointeur = Pointeur + 1
     
          End If
     
     
     
       Next x
     
     
     
     
     
    'Si le pointeur est 0 on ferme le fichier.
     
        If Pointeur = 0 Then
     
            MsgBox "Utilisateur ou mot de passe non valide, si ce message persiste veuillez vous adresser au gestionnaire du fichier"       
     
     
        End If
        If Pointeur = 0 Then
        User = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
    End If
     
     
    'on planque la feuille Vierge
     
        Sheets("Page d'accueil").Visible = 2
     
     
     
        Application.ScreenUpdating = True
     
     
     
    End Sub

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    bien que ton process me surprend un peu (il suffit qu'une personne non autorisées indique le matricule d'un autre ...), peux-tu nous montrer l'état actuel du code que tu utilises ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 35
    Par défaut
    Bonjour,
    Merci pour ta réponse,
    Ci-joint le fichier "test", une fois le code écrit je le mettrais dans le fichier avec tout noms des différents collaborateurs.

    C'est un fichier qui gère les besoins de formations, les personnes viennent, indiquent leur matricule dans le fichier et ont accès a certains onglets et pas a d'autres en fonction de leur statut définit dans la feuille DroitsUsers (bénéficaires de formation, référent de formation, responsable de service ou encore gestionnaire du fichier (moi)), puis choisissent une formation associé à un numéro (onglet 1) puis renseignent leurs matricule et le numéro dans un second onglet. Avec des rechercheV dans certains cases qui affiche noms de la personne et les informations sur les formations et fonction du matricule et numéro renseignés.

    Effectivement une personne peut utiliser l'identifiant d'un autre pour se "logger" mais au final ca ne lui donnerai pas grand chose. Néanmoins, je pourrai effectivement rajouter un mot de passe pour le gestionnaire et les responsables de services, qui eux pour le coup, ont accès a quasiment tout les onglets (12, avec des stats par mois etc, des évaluation) contre 3 onglets pour les personnes qui viennent s'inscrirent. (liste de formation, inscription, évaluation des formations)

    Mon matricule est U483388 ici et donne accès a tout les onglets
    Merci encore
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Déjà, première chose à faire, c'est d'activer l'option qui ne distingue pas la casse Majuscule/Minuscule.
    En effet, tu me donnes un matricule avec un U majuscule ... dans ton fichier c'est un u minuscule

    donc à mettre en haut du module :


    Ensuite, j'ai légèrement modifié la présentation de ta feuille de DroitsUsers :

    Nom : Util.png
Affichages : 458
Taille : 18,4 Ko


    Tu constates que :

    - tes utilisateurs ne sont écrits qu'une seule fois dans la colonne A
    - en ligne 1, à partir de la colonne B, j'ai écris le nom des feuilles
    - de la colonne B jusque ... tant que tu en as besoin : je met des "x" pour les feuilles où l'utilisateur a les accès
    - la plage où sont inscrits les matricules a été nommé : UTILISATEURS


    Ainsi, j'ai modifié ta façon de gérer les accès comme cela :

    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
    Private Sub Workbook_Open()
    Dim Utilisateurs As Range
    Dim CellUser As Range
    Dim j As Long
     
    '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    '$$$$$ J ai laissé ta gestion de camouflage des feuilles $$$$$$
    '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    Sheets("Page d'accueil").Visible = True
    Sheets("Page d'accueil").Activate
     
    For x = 1 To ThisWorkbook.Sheets.Count
        If Sheets(x).Name <> "Page d'accueil" Then Sheets(x).Visible = xlSheetVeryHidden
    Next
     
    Set Utilisateurs = Range("UTILISATEURS")
     
    'Application.ScreenUpdating = False
     
    'on saisit le user
    user = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
    ' on recherche l'utilisateur dans la plage
    Set CellUser = Utilisateurs.Find(user, , , xlWhole)
     
    ' si on le trouve
    If Not CellUser Is Nothing Then
        ' référence à l'objet parent de la plage (= fait référence à la feuille)
        With Utilisateurs.Parent
            ' boucle sur chaque colonne de B jusqu'à la dernier
            For j = 2 To .UsedRange.Columns.Count
                ' si la cellule (sur la ligne de l'agent) n'est pas vide
                ' alors on récupère le nom de la feuille (qui est en ligne 1) pour la rendre visible
                If Not IsEmpty(.Cells(CellUser.Row, j)) Then ThisWorkbook.Worksheets(.Cells(1, j).Value).Visible = True
            Next j
        End With
    ' si on ne trouve pas l'agent
    Else
        MsgBox "Utilisateur ou mot de passe non valide, si ce message persiste veuillez vous adresser au gestionnaire du fichier"
    End If
     
    Application.ScreenUpdating = True
     
    End Sub

    Cela fonctionne dans le cadre que tu poses.

    Maintenant ... je persiste sur les risques de laisser les utilisateurs s'identifier eux-mêmes.
    Si tu veux sécuriser ça en mettant un mot de passe, tu vas mettre un pansement sur une jambe de bois puisque :

    - tu vas devoir maintenir cette liste de mots de passes
    - quid d'un utilisateur qui a oublié son mot de passe ? Du développement supplémentaire à faire (et encore + de risques d'avoir un système corruptible)
    - etc..


    Si tu es sur un réseau d'entreprise, je présume que chaque utilisateur dispose d'une session Windows (un "compte utilisateur") qui est identifiable de façon simple ? (Prénom NOM ou autres variations) ?

    Tu pourrais ainsi utiliser les variables environnement via la fonction Environ() : Environ("USERNAME")

    A l'ouverture du fichier : détection du nom d'utilisateur ==> recherche dans ta colonne d'utilisateurs pour donner (ou non) les accès


    c'est ainsi que je gère les accès de certains outils au travail, et la maintenance est minimaliste : ajouter un nouvel utilisateur (ou l'enlever) quand le besoin s'en fait sentir.

    pas de mot de passe à gérer, et la seule faille c'est si l'utilisateur A utilise la session Windows de l'utilisateur B ... mais ça c'est pas mon problème (c'est le problème des collaborateurs et de leur chef !)

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 35
    Par défaut
    Oui je suis sur un réseau d'entreprise. Ce que tu proposes serait juste parfait, je ne savais pas qu'il était possible de faire ca.
    Si tu as un code à proposer je suis plus que preneur ))

    Au niveau des onglets auxquels on donne accès je suppose qu'il faut répéter le nom en colonne A et décliner les feuilles autorisées en colonne B?

    Sinon je ne connais pas environ(), ou faut-il le placer dans le code? y'a-t-il des choses à supprimer?

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub TestUser()
        MsgBox VBA.Environ("USERNAME")
    End Sub
    voilà ton nom d'utilisateur (session Windows)

    tu construits ta liste d'accès comme j'ai montré sur ma capture écran :

    - colonne A : les noms d'utilisateurs (au lieu des matricules)
    - colonnes suivantes : gestion des accès de feuille

    et ton code de détection devient en gros :

    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
    Private Sub Workbook_Open()
    Dim Utilisateurs As Range
    Dim CellUser As Range
    Dim j As Long
     
    Set Utilisateurs = Range("UTILISATEURS")
     
    'Application.ScreenUpdating = False
     
    ' on recherche l'utilisateur dans la plage
    Set CellUser = Utilisateurs.Find(VBA.Environ("USERNAME"), , , xlWhole)
     
    ' si on le trouve
    If Not CellUser Is Nothing Then
        ' référence à l'objet parent de la plage (= fait référence à la feuille)
        With Utilisateurs.Parent
            ' boucle sur chaque colonne de B jusqu'à la dernier
            For j = 2 To .UsedRange.Columns.Count
                ' si la cellule (sur la ligne de l'agent) n'est pas vide
                ' alors on récupère le nom de la feuille (qui est en ligne 1) pour la rendre visible
                If Not IsEmpty(.Cells(CellUser.Row, j)) Then ThisWorkbook.Worksheets(.Cells(1, j).Value).Visible = True
            Next j
        End With
     
        MsgBox "Bonjour " & VBA.Environ("USERNAME")
    ' si on ne trouve pas l'agent
    Else
        MsgBox "Utilisateur non valide, si ce message persiste veuillez vous adresser au gestionnaire du fichier"
    End If
     
    Application.ScreenUpdating = True
     
    End Sub
    tu peux personnaliser l'identité de tes utilisateurs : en colonne B, tu mets le Prénom NOM de la personne et tu fais commencer tes paramétrages de feuille à la colonne C

    exemple :

    - colonne A : "jlevrai" (mon nom de session Windows)
    - colonne B : "Joe LEVRAI" (mon identité)
    - colonnes suivantes : mes accès de feuilles


    ainsi, si tu dois "parler" à l'utilisateur, tu utiliseras son identité :

    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
    Private Sub Workbook_Open()
    Dim Utilisateurs As Range
    Dim CellUser As Range
    Dim j As Long
        Set Utilisateurs = Range("UTILISATEURS")
        Set CellUser = Utilisateurs.Find(VBA.Environ("USERNAME"), , , xlWhole)
     
        If Not CellUser Is Nothing Then
            With Utilisateurs.Parent
                ' boucle sur chaque colonne de C jusqu'à la dernière !
                For j = 3 To .UsedRange.Columns.Count
                    If Not IsEmpty(.Cells(CellUser.Row, j)) Then ThisWorkbook.Worksheets(.Cells(1, j).Value).Visible = True
                Next j
            End With
     
            ' ici, j'utilise l'identité de l'utilisateur (colonne B) au lieu de son nom de session windows (le contenu de la cellule CellUser)
            MsgBox "Bonjour " & CellUser.Offset(0, 1).Value
        Else
            ' dans le message de refus d'accès, je présente à l'utilisateur son nom de session, afin qu'il puisse prévenir le gestionnaire du fichier
            MsgBox "Utilisateur non valide, si ce message persiste veuillez vous adresser au gestionnaire du fichier" & vbCrLf & "Votre session est : " & VBA.Environ("USERNAME")
        End If
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

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