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

VBA Discussion :

Un problème avec Do/Loop et If/else/end If


Sujet :

VBA

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de blaiso
    Profil pro
    Banquier
    Inscrit en
    Décembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Banquier

    Informations forums :
    Inscription : Décembre 2005
    Messages : 97
    Par défaut Un problème avec Do/Loop et If/else/end If
    Bonjour,

    Je suis entrain de boucler une application Excel. J'ai fait un userform de login/password. Dans une feuille cachée, j'ai une colonne pour les noms d'utilisateur, une autre pour les mots de passe et une dernière colonne pour les groupes (gestion des profils des utilisateurs). Du genre:
    Nom.....password..............groupe
    toto.......pwd1 ..............0
    tata.......pwd2 ..............2
    titi.........pwd3 ...............1

    Selon le code du groupe, l'utilisateur aura accès à certaines feuilles et pas à d'autres.
    J'ai écrit un bout de code qui permet de tester le nom/pwd pour accéder aux feuilles.
    Le problème est que je n'arrive pas à gérer le cas où le nom et le mot de passe de correspondent pas. En fait, j'aimerai qu'un message puisse indiquer à l'utilisateur qu'il y a non concordance entre login et mot de passe.
    Il y a un détail qui me manque, c'est pour cela que je sollicite votre aide:
    C'est une boucle Do... Loop. l'alternative Else ne fonctionne pas pour le premier If.
    Voici le code:
    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
     
    Private Sub cmdOK_Click()
     
    '******************************************
    '******************************************
    'Code de connexion dans l'applicatif
     
    '******************************************
    '******************************************
     
    Dim sLogin As String
    Dim sPwd As String
    Dim i As Integer
    Dim iVarTest As Integer
    Dim iLongueur As Integer
     
    'Gestionnaire des erreurs
    On Error Resume Next
     
    'Récupération des paramètres de connexion
    sLogin = txtNom
    sPwd = txtMot
     
    'Récupération de la longueur du mot de passe
    iLongueur = Len(sPwd)
     
    'Vérification que le mot de passe est de longueur supérieur à 5 et inférieur à 8
     
    If iLongueur < 5 Or iLongueur > 8 Then
     
        MsgBox "Le mot de passe doit avoir 5 caractères au minimum et 8 caractères au maximum", vbInformation, "Longueur mot de passe"
        txtMot.SetFocus
        Exit Sub
    End If
     
    'Récupération du numéro de la dernière ligne occupée
    iVarTest = Sheets("mot").Range("A65000").End(xlUp).Row
     
    '*****************************************************
    '*****************************************************
    Application.ScreenUpdating = False
     
    'Initialisation de la variable de la boucle
    i = 2
     
    'Début de la boucle
    Do
     
        'Vérification du nom d'utilisateur et du mot de passe
        If (sLogin = Sheets("mot").Cells(i, 1).Value) And (sPwd = Sheets("mot").Cells(i, 2).Value) Then
     
                'Vérification du profil de l'utilisateur
                If Sheets("mot").Cells(i, 3).Value = 0 Then
     
                    Call ReactivationFeuille0
     
                    'sortie de la boucle
                    Exit Do
     
                '****************************************************
                ElseIf Sheets("mot").Cells(i, 3).Value = 1 Then
                    Call ReactivationFeuille1
     
     
                    'sortie de la boucle
                    Exit Do
                '*****************************************************
     
                ElseIf Sheets("mot").Cells(i, 3).Value = 2 Then
                    Call ReactivationFeuille2
     
     
                    'sortie de la boucle
                    Exit Do
                '*****************************************************
                Else
     
                    MsgBox "Groupe inconnu", vbInformation, "Gestion des profils"
     
                    Exit Do
     
                End If
       '***********************
       'Si code actif, une seule entrée dans la boucle
       '***********************
       'Alternative à problème
       'Else
       'MsgBox "Nom ou mot de passe incorrects", vbInformation, "Login"
       'Exit Do
        '***********************
        '***********************
     
       End If
     
    'Icrémentation de la boucle
    i = i + 1
     
    'Sortie définitive de la boucle si la condition est remplie:
    '(la valeur de i est supérieure au numéro de la dernière ligne occupée)
    Loop While i <= iVarTest
     
     
    End Sub
    Si le bout de code suivant est actif, le test se fait seulement sur le premier enrégistrement, les autres sont ignorés. Je suis obligé de le mettre en commentaire. Dans ce cas, le code n'a pas de problème, sauf que si le login et le mot de passe ne sont pas bons, il ne fait rien, c'est-à-dire, l'utilisateur n'accède pas à l'application, mais aucun message ne le lui dit, comme j'aurai voulu que ce soit le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    '***********************
       'Si code actif, une seule entrée dans la boucle
       '***********************
       'Alternative à problème
       'Else
       'MsgBox "Nom ou mot de passe incorrects", vbInformation, "Login"
       'Exit Do
        '***********************
        '***********************
    Qu'est qui ne va pas dans ce code?

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Bonsoir,

    tu ne peu pas mettre ton message d'erreur dans ta boucle, car à ce moment la tu aurait un message d'erreur pour chaque utilisateur ...

    Utilise un flag ( un booléen..) pour dans ta boucle mémoriser si le bon login à été saisie ...

    Et après la boucle teste ce flag pour afficher le message.

  3. #3
    Membre actif Avatar de blaiso
    Profil pro
    Banquier
    Inscrit en
    Décembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Banquier

    Informations forums :
    Inscription : Décembre 2005
    Messages : 97
    Par défaut
    Citation Envoyé par bbil Voir le message
    Bonsoir,

    tu ne peu pas mettre ton message d'erreur dans ta boucle, car à ce moment la tu aurait un message d'erreur pour chaque utilisateur ...

    Utilise un flag ( un booléen..) pour dans ta boucle mémoriser si le bon login à été saisie ...

    Et après la boucle teste ce flag pour afficher le message.
    bbil, merci pour cette réponse.
    C'est exactement ce qui arrive.
    Je travaille dans cette perspective ce soir et te rend compte demain.
    Merci encore.

  4. #4
    Membre actif Avatar de blaiso
    Profil pro
    Banquier
    Inscrit en
    Décembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Banquier

    Informations forums :
    Inscription : Décembre 2005
    Messages : 97
    Par défaut
    Bonjour bbil,

    Merci pour ton idée géniale. J'ai résolu le problème.

    Voici le code pour ceux que cela intéresse:

    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
     
     
    Private Sub cmdOK_Click()
     
    '******************************************
    '******************************************
    'Code de connexion dans l'applicatif
     
    '******************************************
    '******************************************
     
    Dim sLogin As String
    Dim sPwd As String
    Dim i As Integer
    Dim iVarTest As Integer
    Dim iLongueur As Integer
    Dim bVerif as Boolean
     
    'Gestionnaire des erreurs
    On Error Resume Next
     
    'Variable flag 
    bVerif = False
     
    'Récupération des paramètres de connexion
    sLogin = txtNom
    sPwd = txtMot
     
    'Récupération de la longueur du mot de passe
    iLongueur = Len(sPwd)
     
    'Vérification que le mot de passe est de longueur supérieur à 5 et inférieur à 8
     
    If iLongueur < 5 Or iLongueur > 8 Then
     
        MsgBox "Le mot de passe doit avoir 5 caractères au minimum et 8 caractères au maximum", vbInformation, "Longueur mot de passe"
        txtMot.SetFocus
        Exit Sub
    End If
     
    'Récupération du numéro de la dernière ligne occupée
    iVarTest = Sheets("mot").Range("A65000").End(xlUp).Row
     
    '*****************************************************
    '*****************************************************
    Application.ScreenUpdating = False
     
    'Initialisation de la variable de la boucle
    i = 2
     
    'Début de la boucle
    Do
     
        'Vérification du nom d'utilisateur et du mot de passe
        If (sLogin = Sheets("mot").Cells(i, 1).Value) And (sPwd = Sheets("mot").Cells(i, 2).Value) Then
     
                'la variable change de statut si login/pwd corrects
                bVerif = True
     
                'Vérification du profil de l'utilisateur
                If Sheets("mot").Cells(i, 3).Value = 0 Then
     
                    Call ReactivationFeuille0
     
                    'sortie de la boucle
                    Exit Do
     
                '****************************************************
                ElseIf Sheets("mot").Cells(i, 3).Value = 1 Then
                    Call ReactivationFeuille1
     
     
                    'sortie de la boucle
                    Exit Do
                '*****************************************************
     
                ElseIf Sheets("mot").Cells(i, 3).Value = 2 Then
                    Call ReactivationFeuille2
     
     
                    'sortie de la boucle
                    Exit Do
                '*****************************************************
                Else
     
                    MsgBox "Groupe inconnu", vbInformation, "Gestion des profils"
     
                    Exit Do
     
                End If
       '***********************
       'Si code actif, une seule entrée dans la boucle
       '***********************
       'Alternative à problème
       'Else
       'MsgBox "Nom ou mot de passe incorrects", vbInformation, "Login"
       'Exit Do
        '***********************
        '***********************
     
       End If
     
    'Icrémentation de la boucle
    i = i + 1
     
    'Sortie définitive de la boucle si la condition est remplie:
    '(la valeur de i est supérieure au numéro de la dernière ligne occupée)
    Loop While i <= iVarTest
     
    'Si mot de passe ou password incorrect
       if bVerif = False then
        MsgBox "Nom ou mot de passe incorrects", vbInformation, "Login"
       Exit sub
       end if
     
    End Sub

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

Discussions similaires

  1. Problème avec la fonction if et else
    Par e4919milie dans le forum Général Python
    Réponses: 4
    Dernier message: 09/11/2012, 10h23
  2. [XL-2003] VBA problème avec la une boucle for range.end(xlup).row après suppression de lignes
    Par JohnNC115 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 25/01/2011, 10h21
  3. Problème avec un while if et else
    Par niepoc dans le forum Général Python
    Réponses: 10
    Dernier message: 22/06/2009, 16h37
  4. Problème avec Fruity loop 8
    Par ali_can dans le forum Windows Vista
    Réponses: 1
    Dernier message: 26/03/2008, 20h36
  5. Problèmes avec des else if
    Par Kr00pS dans le forum C
    Réponses: 2
    Dernier message: 15/04/2006, 11h04

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