Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA
Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/09/2011, 16h16   #1
Membre régulier
 
Avatar de blaiso
 
Banquier
Inscription : 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
Points : 91
Points : 91
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 :
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 :
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?
__________________
Patience et longueur de temps font plus que force, ni que rage.
Mon site: http://www.emiage.infopluseco.net
Mon blog: http://azojeca07.wordpress.com
blaiso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2011, 22h17   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
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 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/09/2011, 22h32   #3
Membre régulier
 
Avatar de blaiso
 
Banquier
Inscription : 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
Points : 91
Points : 91
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.
__________________
Patience et longueur de temps font plus que force, ni que rage.
Mon site: http://www.emiage.infopluseco.net
Mon blog: http://azojeca07.wordpress.com
blaiso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 09h02   #4
Membre régulier
 
Avatar de blaiso
 
Banquier
Inscription : 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
Points : 91
Points : 91
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 :
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
__________________
Patience et longueur de temps font plus que force, ni que rage.
Mon site: http://www.emiage.infopluseco.net
Mon blog: http://azojeca07.wordpress.com
blaiso est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h00.


 
 
 
 
Partenaires

Hébergement Web