[vba] test d'un type dans un textbox

  • Auteur de la discussion badboy9312
  • Date de début

badboy9312

Nouveau membre
Bonjour, je vous explique mon soucis:
j'ai un formulaire contenant un label "label3" et un textbox " textbox2" et lorsqu'on rentre dans textbox2 une valeur strictement positif affiche "achat "et une valeur strictement négative "vente" sinon (donc soit valeur nulle ou de type non numerique) voila ce que j'ai coder:

Private Sub TextBox2_Change()
If IsNumeric(TextBox2.Value) Then
Select Case TextBox2.Value
Case Is > 0
Label3.Caption = "BUY"
Case Is < 0
Label3.Caption = "SELL"
Case 0
MsgBox "Veuillez entrer une valeur non nulle"
TextBox2.Value = ""

End Select
Else
MsgBox "Veuillez entrer une valeur numerique"
TextBox2.Value = ""
End If


End Sub

Mon premier problème est que si je tape un nombre négatif il m'affiche (avec le msgbox )d' "entrer une valeur numerique " en faite je pense que le "-" qu'on rentre vba le considere comme un "string"
Mon deuxième est que lorsque je tape un type string il m'affiche deux msgbox à la suite...

Merci d'avance pour votre aide
Bonne journée
 

zeb

Modérateur
Je vous explique mon soucis: badboy93120 n'a pas lu les règles de publication et/ou ne les respecte pas ! [:zeb]
 

badboy9312

Nouveau membre
Je vous explique mon soucis: badboy93120 n'a pas lu les règles de publication et/ou ne les respecte pas ! [:zeb]
si je les ai vu mais en diagonale...
qu'est ce qu''il ne va pas?
 

Senvisage

Habitué
tu dois mettre le code source entre balises (cpp) et (/cpp). faut mettre des crochets et pas des parentheses.
 

badboy9312

Nouveau membre
[cpp]
Private Sub TextBox2_Change()
If IsNumeric(TextBox2.Value) Then
Select Case TextBox2.Value
Case Is > 0
Label3.Caption = "BUY"
Case Is < 0
Label3.Caption = "SELL"
Case 0
MsgBox "Veuillez entrer une valeur non nulle"
TextBox2.Value = ""

End Select
Else
MsgBox "Veuillez entrer une valeur numerique"
TextBox2.Value = ""
End If


End Sub
[/cpp]
voilà mon code "aux normes"
 

zeb

Modérateur
Explications :
Tu fais la vérification en cours de saisie ( _Change() ). Donc, tant qu'un nombre n'est pas correctement saisi, tu prends la main pour metre un message et effacer le contenu ! Dans le cas d'une saisie "Texte", l'appel à la fonction se fait une fois quand l'utilisateur "change" le texte et une seconde fois quand TextBox2_Change vide le texte.

Propositions de solution :
Ne pas mettre de message d'erreur ni de vidage de champs en cours de saisie.
Tiens-le toi pour dit une bonne fois pour toute, c'est toujours vrai !!!!!! (On peut trouver des exceptions :whistle: )

Vérifier la siaise à la fin de celle-ci : sur l'appui d'un bouton VALIDER, sur l'évenement _Exit.
(EDIT: ^^^ Le mot là, c'est SAISIE !!!!!!)


Ton code devient :
Code:
Private Sub TextBox2_Change()
	If IsNumeric(TextBox2.Value) Then
		Select Case TextBox2.Value
		Case Is > 0
			Label3.Caption = "BUY"
		Case Is < 0
			Label3.Caption = "SELL"
		End Select
	End If
End Sub

Private Sub TextBox2_Exit()
	If Not IsNumeric(TextBox2.Value) Then 
		MsgBox "Veuillez entrer une valeur numerique"
	Else
		If TextBox2.Value = 0 Then 
			MsgBox "Veuillez entrer une valeur non nulle"
		End If
	End If
End Sub
 

badboy9312

Nouveau membre
Explications :
Tu fais la vérification en cours de saisie ( _Change() ). Donc, tant qu'un nombre n'est pas correctement saisi, tu prends la main pour metre un message et effacer le contenu ! Dans le cas d'une saisie "Texte", l'appel à la fonction se fait une fois quand l'utilisateur "change" le texte et une seconde fois quand TextBox2_Change vide le texte.

Propositions de solution :
Ne pas mettre de message d'erreur ni de vidage de champs en cours de saisie.
Tiens-le toi pour dit une bonne fois pour toute, c'est toujours vrai !!!!!! (On peut trouver des exceptions :whistle: )

Vérifier la siaise à la fin de celle-ci : sur l'appui d'un bouton VALIDER, sur l'évenement _Exit.
(EDIT: ^^^ Le mot là, c'est SAISIE !!!!!!)


Ton code devient :
Code:
Private Sub TextBox2_Change()
	If IsNumeric(TextBox2.Value) Then
		Select Case TextBox2.Value
		Case Is > 0
			Label3.Caption = "BUY"
		Case Is < 0
			Label3.Caption = "SELL"
		End Select
	End If
End Sub

Private Sub TextBox2_Exit()
	If Not IsNumeric(TextBox2.Value) Then 
		MsgBox "Veuillez entrer une valeur numerique"
	Else
		If TextBox2.Value = 0 Then 
			MsgBox "Veuillez entrer une valeur non nulle"
		End If
	End If
End Sub


ok merci de ton conseil: j'ai complété ton code mais ce que j'aimerai c'est que quand il y erreur le focus reste dans texbox2 ce qui n'est pas le cas:

[cpp]


Private Sub textbox2_Change()
If IsNumeric(textbox2.Value) Then
Select Case textbox2.Value
Case Is > 0
Label3.Caption = "BUY"
Case Is < 0
Label3.Caption = "SELL"
End Select
End If
End Sub



Private Sub textbox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(quantity.Value) Then
MsgBox "Veuillez entrer une valeur numerique"
textbox2.Value = ""
textbox2.SetFocus
Else
If quantity.Value = 0 Then
MsgBox "Veuillez entrer une valeur non nulle"
textbox2.Value = ""
textbox2.SetFocus
End If
End If

End Sub
[/cpp]
 

Freeman23

Expert


Cette méthode fonctionne très bien si tu te mords pas la queue, dans ton cas le problème vient du fait que tu ne testais pas la valeur chaine vide avant tout, car la modification en chaine vide que tu faisais provoquer le rappel de la fonction Change et donc la génération d'un doublon de message d'erreur.

[cpp]
Private Sub TextBox2_Change()
if TexteBox2 <> "" then
If IsNumeric(TextBox2.Value) Then
Select Case TextBox2.Value
Case Is > 0
Label3.Caption = "BUY"
Case Is < 0
Label3.Caption = "SELL"
Case 0
MsgBox "Veuillez entrer une valeur non nulle"
TextBox2.Value = ""
End Select
Else
MsgBox "Veuillez entrer une valeur numerique"
TextBox2.Value = ""
End If
End if
End Sub
[/cpp]



 

badboy9312

Nouveau membre


ok merci de ton aide voilà ce que j'ai fait avec tout vos conseils:
[cpp]
Private Sub TextBox2_Change()
If TextBox2.Value <> " " Then
If IsNumeric(TextBox2.Value) Then
Select Case TextBox2.Value
Case Is > 0
Label3.Caption = "BUY"
Case Is < 0
Label3.Caption = "SELL"
Case 0
MsgBox "Veuillez entrer une valeur non nulle"
TextBox2.Value = ""
TextBox2.SetFocus

End Select
ElseIf TextBox2.Value <> "" And TextBox2.Value <> "-" And TextBox2.Value <> "+" Then
MsgBox "Veuillez entrer une valeur numerique"
TextBox2.Value = ""
TextBox2.SetFocus

End If
End If
End Sub
[/cpp]

Par contre, lorsqu'il ya erreur je reviens à l"textbox2" que je fais avec Setfocus mais cela ne marche pas...
 

zeb

Modérateur
badboy, vilain garçon !!!
Bis repetitas : Ne pas mettre de message d'erreur ni de vidage de champs en cours de saisie.

Bon, après tout tu as le droit de faire comme tu veux... :sarcastic:

Par contre, je ne comprends pas bien où est le problème de Focus.
Si tu es en train de changer la valeur du texte de TextBox2, TextBox2 a déjà le focus. Pourquoi alors avoir besoin de le lui rendre ?
 

badboy9312

Nouveau membre
badboy, vilain garçon !!!
Bis repetitas : Ne pas mettre de message d'erreur ni de vidage de champs en cours de saisie.

Bon, après tout tu as le droit de faire comme tu veux... :sarcastic:

Par contre, je ne comprends pas bien où est le problème de Focus.
Si tu es en train de changer la valeur du texte de TextBox2, TextBox2 a déjà le focus. Pourquoi alors avoir besoin de le lui rendre ?

Salut,
concernant le vidage de champs c'est que freeman m' a connseillé de faire non?

en faite, quand on a fini de saisir on tape "enter" et quand il y a erreur un msgbox apparait mais le focus est (à casue du enter) redirigé vers le prochain textbox et j'aimerai donc remettre le focus à "textbox2".
 

zeb

Modérateur
Non, Freeman t'explique pourquoi et te donne un exemple pour étayer sa démonstration. Après, rien ne t'empêche de le faire quand même.

Maintenant encore une explication :
Sous Windows, la programmation événementielle fonctionne avec des listes de messages intrinsèques. Pour voir dans quel ordre ils sont envoyés, mets un MSGBOX nom_evenement (ou mieux DEBUG.PRINT nom_evenement si tu sais t'en servir) dans les différentes fonctions de TextBox2 et du "prochain TextBox". Je pense à Change, BeforeUpdate, AfterUpdate, Enter, Exit, etc. Tu en verras la mécanique sous-jacente.

Alors, maintenant une soluce :sol: en forme de quizz :
Je te proposais l'utilisation de Exit, n'est-ce pas ? RELIS L'AIDE DE EXIT et dis-moi à quoi sert le paramètre CANCEL que je n'ai pas écrit dans mon exemple.
Comme par hasard, CANCEL sert à annuler le passage vers le composant suivant. Stro facile :)
 

badboy9312

Nouveau membre
Non, Freeman t'explique pourquoi et te donne un exemple pour étayer sa démonstration. Après, rien ne t'empêche de le faire quand même.

Maintenant encore une explication :
Sous Windows, la programmation événementielle fonctionne avec des listes de messages intrinsèques. Pour voir dans quel ordre ils sont envoyés, mets un MSGBOX nom_evenement (ou mieux DEBUG.PRINT nom_evenement si tu sais t'en servir) dans les différentes fonctions de TextBox2 et du "prochain TextBox". Je pense à Change, BeforeUpdate, AfterUpdate, Enter, Exit, etc. Tu en verras la mécanique sous-jacente.

Alors, maintenant une soluce :sol: en forme de quizz :
Je te proposais l'utilisation de Exit, n'est-ce pas ? RELIS L'AIDE DE EXIT et dis-moi à quoi sert le paramètre CANCEL que je n'ai pas écrit dans mon exemple.
Comme par hasard, CANCEL sert à annuler le passage vers le composant suivant. Stro facile :)

ok voilà ce que j'ai fait avec tous tes conseils, si j'ai bien compris ce que servais Cancel... Par contre même constat(le focus ne va pas au texbox suivant mais disparait...):

Private Sub TextBox2_Change()
If TextBox2.Value <> " " Then
If IsNumeric(quantity.Value) Then
Select Case quantity.Value
Case Is > 0
Label3.Caption = "BUY"
Case Is < 0
Label3.Caption = "SELL"
End Select
End If
End If
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox2.Value) And TextBox2.Value <> "" And TextBox2.Value <> "-" And TextBox2.Value <> "+" Then
MsgBox "Veuillez entrer une valeur numerique"
TextBox2.Value = ""
Cancel = True
Else
If quantity.Value = 0 Then
MsgBox "Veuillez entrer une valeur non nulle"
TextBox2Value = ""
Cancel = True
End If
End If

End Sub
 

badboy9312

Nouveau membre
Et la mise en forme du code !!!!!
oups pardon cela devient une mauvaise habitude...
[cpp]
Private Sub TextBox2_Change()
If TextBox2.Value <> " " Then
If IsNumeric(quantity.Value) Then
Select Case quantity.Value
Case Is > 0
Label3.Caption = "BUY"
Case Is < 0
Label3.Caption = "SELL"
End Select
End If
End If
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox2.Value) And TextBox2.Value <> "" And TextBox2.Value <> "-" And TextBox2.Value <> "+" Then
MsgBox "Veuillez entrer une valeur numerique"
TextBox2.Value = ""
Cancel = True
Else
If quantity.Value = 0 Then
MsgBox "Veuillez entrer une valeur non nulle"
TextBox2Value = ""
Cancel = True
End If
End If

End Sub
[/cpp]

oui donc personne pour résoudre mon problème? (disparition mystérieuse du focucs même si je fais un textbox2.setfocus)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 122
Messages
6 717 713
Membres
1 586 356
Dernier membre
TommyStam
Partager cette page
Haut