Perte de la main ds un TextBox

A

Antoine

Guest
bonsoir le forum,

j'avance à petit pas dans ma gestion d'un Textbox, j'ai actuellement la perte de la main si ma valeur string n'est pas>"00" et <"99". Voici ci dessous le moceau qui me fait tourner en bourique.

box2:
dept = TextBox2.Value
If dept < "00" Or dept > "99" Then
GoTo box2
Else

Merci de vos conseils, et bonne soirée..
 
J

jmps

Guest
Bonjour Antoine,

D'après ce que je comprends tu cherches à contôler la validité d"un numéro de département. La raison de la "perte de la main" vient de ton GoTo qui repart tester la condition. Or, comme rien n'a changé entre-temps, la condition est toujours vraie, donc re GoTo et ainsi de suite. Ta macro part en boucle. Il faut donc rendre la main à l'utilisateur pour qu'il puisse corriger son erreur.

L'instruction GoTo est à bannir de ta mémoire (sauf dans des cas bien spécifiques de gestion d'erreurs par exemple). En utilisant cette instruction tu peux vite te retrouver avec un code incompréhensible avec des aller-retour dans tous les sens. Dans les années 80 on appelait ça du code "spaghetti". Lol !

Voici ce que je te propose :
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
&nbsp;&nbsp;If Len(TextBox2) <> 2 Or Not IsNumeric(TextBox2.Value) Or TextBox2.Value < "00" Or TextBox2.Value > "99" Then
&nbsp;&nbsp;' MsgBox ("Saisie incorrecte !")
&nbsp;&nbsp;TextBox2.SelStart = 0
&nbsp;&nbsp;TextBox2.SelLength = Len(TextBox2.Value)
&nbsp;&nbsp;Cancel = True
&nbsp;&nbsp;End If
End Sub


Quelques explications :
Le code est placé dans le Sub TextBox2_Exit qui est l'évènement qui se déclenche quand on sort de la zone.
Le test de validité est un peu plus compliqué car avec le tien, si je rentre "0a" par exemple ou "1" ou même "100", ça passe quand même. La raison en est qu'un TextBox contient du texte (même si on saisit des chiffres, ils sont considérés comme alphas) et VBA évalue l'expression caractère par caractère. Donc "un-zéro-zéro" est bien supérieur à "zéro-zéro" et inférieur à "neuf-neuf". Je ne sais pas si je suis bien clair mais si tu as besoin je pourrais te réexpliquer.
Le MsgBox étant facultatif, je l'ai mis en commentaire. Tu pourras le remettre si tu veux en enlevant le ' devant.
Les SelStart et SelLength permettent de sélectionner la saisie pour signaler une erreur et n'avoir plus qu'a resaisir sans se ballader avec les flèches ou le backspace.
Enfin le Cancel = True indique à VBA de ne pas sortir de la zone (ne pas valider l'évènement Exit).
Je n'ai pas utilisé non plus de variable intermédiaire (dept), mais tu peux la déclarer en début de Sub si tu veux et remplacer ensuite TextBox2.Value par dept.

Une dernière chose. Si tu as un bouton de validation, il faut aussi mettre ce code dans le Sub BoutonX_Click() car l'utilisateur pourrait cliquer le bouton sans être sorti de la TextBox et là le test ne se ferait pas.

Voilà, tu as un peu attendu ta réponse mais j'espère que tu en as pour ton argent. En tous cas en longueur. Lol !

Bon courage.

José
 

Discussions similaires

Réponses
6
Affichages
247

Statistiques des forums

Discussions
312 228
Messages
2 086 421
Membres
103 205
dernier inscrit
zch