FONCTION ISNUMERIC AMÉLIORÉE (EMPÊCHE LES EXPOSANTS)
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014
-
7 avril 2005 à 17:39
Reservoir_Dogs
Messages postés3Date d'inscriptiondimanche 6 août 2006StatutMembreDernière intervention 7 août 2006
-
6 août 2006 à 22:40
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Reservoir_Dogs
Messages postés3Date d'inscriptiondimanche 6 août 2006StatutMembreDernière intervention 7 août 2006 6 août 2006 à 22:40
J'ai vraiment besoin d'aide. Dans mon programme, il y a une zone de texte qui sert à l'utilisateur a s'inscrire. Quand il clique sur le boutton inscription, le code doit empècher la zone de texte de contenir une valeur numérique. Alors moi j'ai ecrit:
'Vérification du contenu de la zone de texte Utilisateur
If Id_Utilisateur = "" Then
MsgBox " Vous devez saisir un nom d'utilisateur ! ", vbInformation, " Erreur! "
Txt_User.SetFocus
Exit Sub
ElseIf IsNumeric(Id_Utilisateur) = True Then
MsgBox " Le nom de l'utilisateur ne doit comprendre aucun chiffre ! ", vbInformation, " Erreur! "
Txt_User.SetFocus
Exit Sub
Il y a une petit probleme. S'y je met de l'alpha-numérique dans la zone de texte il y a pas de message d'erreur alor que j'en voudrait un.
Moi perso je cherche justement a faire cette fonction, car comme toi j'ai des truc zarbe a cause des format monaitaire ( placer F comme valeur de monaite et dans ce cas vous avez F344 ( 344 c'est nimporte quelle chiffre en fait, la c de l'exemple) et bien isnumeric de VBS dit vrai car considere F comme symbole monetaire et pas comme une letre.
merci a toi
mais perso je vais ajouter a ta fonction juste 2 case pour les codes de + et -
ndjpoyepoy
Messages postés7Date d'inscriptionlundi 4 avril 2005StatutMembreDernière intervention10 avril 2005 10 avril 2005 à 19:19
oups, j'ai le "then" a la fin de la ligne if.
ndjpoyepoy
Messages postés7Date d'inscriptionlundi 4 avril 2005StatutMembreDernière intervention10 avril 2005 10 avril 2005 à 19:17
[merci de me dire que ma fonction peut être optimisée, mais alors sois constructif, et indique-nous comment ... ???]
et plus loint
[ il est certain que cette fonction peut être améliorée/optimisée/modifiée/etc... à vos besoins, mais personnellement, ma fonction répond exactement aux miens]
WSIsNumeric(Value As Variant) As Boolean
Dim Compteur As Byte
WSIsNumeric = False
if IsNumeric(Value) and instr(value,"E")=O and instr(value,"D")=0
WSIsNumeric = True
End IF
end function
Et voila
cs_WebSeb
Messages postés9Date d'inscriptionsamedi 22 décembre 2001StatutMembreDernière intervention10 avril 2005 10 avril 2005 à 14:08
Pour resituer un peu mon besoin, access considère les chaînes "00100D18" et "00100E25" comme étant des chaines numériques, alors que dans mon cas, elles doivent être considérées commes alphanumérique (vu qu'il y a des lettres dedans). De ce fait, la fonction standard VBA IsNumeric ne retourne pas le résultat que je veux. Je n'ai pas besoin de vérifier le signe, car la valeur ne peut jamais être négative (il s'agit en fait de centres de frais, en comptabilité analytique). Comme j'ai expliqué plus haut, il est certain que cette fonction peut être améliorée/optimisée/modifiée/etc... à vos besoins, mais personnellement, ma fonction répond exactement aux miens.
ndjpoyepoy
Messages postés7Date d'inscriptionlundi 4 avril 2005StatutMembreDernière intervention10 avril 2005 9 avril 2005 à 18:27
Function WSIsNumeric(Value As Variant) As Boolean
Dim Compteur As Byte
WSIsNumeric = False
if IsNumeric(Value) and instr(value,"E")=O and instr(value,"e")=0 and instr(value,"+")=O and instr(value,"-")=0
WSIsNumeric = True
End IF
end function
La, sauf oublie, ca devrais être bon. Si la valeur est concidéré comme bonne par isnuméruc, il nous reste plus que les E, + et - ou il reste encore un truc ?
S'il en reste, il suffit de rajouter un instr.
Je suis toujours pas sur qu'il y ai pas une fonction plus rapide qu'instr pour ca.
JoePatent
Messages postés171Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention20 juillet 2008 9 avril 2005 à 02:38
[La fonction retourne True si la chaine est exclusivement composée de chiffres, tous les autres caractères étant exclus ]
Ca c'est ta premisse de depart. C'est avec ce mandat que j'ai travaillé.
Tu peux ajouter a cette condition toutes tes exceptions. {if not isnumeric(mid$(value,compteur,1)) then exit function}
Selon les autres commentaires, tu auras du pain sur la planche pour inclure les exceptions. Les chiffres signés ne peuvent avoir un (+,-) qu'au premier caractere de la chaines. Le E que l'on doit tolérer ne doit pas etre a la premiere ni a la derniere position de la chaine, etc etc
Personnellement, j'organiserais mon code afin d'éviter de devoir faire ce genre de test autant que possible.
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014 9 avril 2005 à 02:25
Désoler, j'ai été pris pour quitter prématurément :
Function WSIsNumeric(Value As String) As Boolean
Dim Compteur As Byte
For Compteur = 1 To Len(Value)
'48 8, 57 9
If (Asc(Mid(Value, Compteur, 1)) < 48 Or Asc(Mid(Value, Compteur, 1)) > 57) And Mid(Value, 1, 1) <> "-" Then
WSIsNumeric = False
Exit Function
End If
Next
WSIsNumeric = True
End Function
Ça prend aussi les négatifs, le byte et bien ... c'est rare un nombre de 255 chiffres.
ndjpoyepoy
Messages postés7Date d'inscriptionlundi 4 avril 2005StatutMembreDernière intervention10 avril 2005 8 avril 2005 à 23:15
Elle est bien ta fonction. Et s'est bien d'en faire profiter.
On fait des remarques juste pour voir si on peut la perfectionner (on donc tous apprendre).
pour Gobillot :
d'après l'exmple, j'en déduit qu'on veut tester si s'est numérique,pas currency (monértaire). Donc on veut pas de € et de F.
Quant a + et - au début, ca serais une function ispos ou isneg dans ce cas. Mais rien n'empèche de rajouter 2 instr (je crois d'ailleur qu'il y a mieux comme fonction que instr).
cs_WebSeb
Messages postés9Date d'inscriptionsamedi 22 décembre 2001StatutMembreDernière intervention10 avril 2005 8 avril 2005 à 17:54
Juste pour info, sachez que "D" a bizarrement le même effet que le "E", à savoir que les nombres sont "exposés"... En tout cas, ma fonction me donne le résultat que je veux, et je voulais vous en faire profiter.
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 8 avril 2005 à 17:52
il y a d'autres caractères et ça dépend des options régionales:
point, virgule, espace, "+","-", "E", "€" (remplace le "F")
ndjpoyepoy
Messages postés7Date d'inscriptionlundi 4 avril 2005StatutMembreDernière intervention10 avril 2005 8 avril 2005 à 16:33
ha oui, donc plus besoin de déclarer Compteur dans mon exemple.
ndjpoyepoy
Messages postés7Date d'inscriptionlundi 4 avril 2005StatutMembreDernière intervention10 avril 2005 8 avril 2005 à 16:30
On peut pas faire plutot :
Function WSIsNumeric(Value As Variant) As Boolean
Dim Compteur As Byte
WSIsNumeric = False
if IsNumeric(Value) and instr(value,"E")=O and instr(value,"e")=0
WSIsNumeric = True
End IF
end function
cs_WebSeb
Messages postés9Date d'inscriptionsamedi 22 décembre 2001StatutMembreDernière intervention10 avril 2005 8 avril 2005 à 00:19
JoePatent, ta remarque est correcte, mais dans ton cas, que fais-tu des signes (+ et -) qui ne sont pas à proprement parler des signes "numériques" (càd de 0 à 9) mais qui peuvent composer un nombre (négatif, donc). Ma fonction ne les gère pas non plus comme dans le code fourni, mais il suffit d'ajouter leur code ascii dans les exceptions, et c'est réglé.
Max12, merci de me dire que ma fonction peut être optimisée, mais alors sois constructif, et indique-nous comment ... ???
JoePatent
Messages postés171Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention20 juillet 2008 7 avril 2005 à 23:16
Ce n'est pas plus simple de s'assurer que le E ne soit pas présent ?
Tu le passes deja dans le tamis du IsNumeric. Donc, a part les [E,e], y a-t-il d'autres exceptions ?
Autrement il serait plus court de passer en revue chaque caracteres de la chaine plutot que de faire une boucle de 32 à 256... Et de faire un IsNumeric sur chaque caracteres...
Function WSIsNumeric(Value As Variant) As Boolean
Dim Compteur As Byte
WSIsNumeric = False
if IsNumeric(Value) then
for Compteur =1 to len(value)
if not isnumeric(mid$(value,compteur,1)) then exit function
Next
WSIsNumeric = True
End IF
End Function
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014 7 avril 2005 à 17:39
Bravo, je savais pas pour les E, mais cette fonction pourrait quand même être optimisée :$
6 août 2006 à 22:40
'Vérification du contenu de la zone de texte Utilisateur
If Id_Utilisateur = "" Then
MsgBox " Vous devez saisir un nom d'utilisateur ! ", vbInformation, " Erreur! "
Txt_User.SetFocus
Exit Sub
ElseIf IsNumeric(Id_Utilisateur) = True Then
MsgBox " Le nom de l'utilisateur ne doit comprendre aucun chiffre ! ", vbInformation, " Erreur! "
Txt_User.SetFocus
Exit Sub
Il y a une petit probleme. S'y je met de l'alpha-numérique dans la zone de texte il y a pas de message d'erreur alor que j'en voudrait un.
Svp Quelqu'un pourrait m'aider....
24 nov. 2005 à 21:33
merci a toi
mais perso je vais ajouter a ta fonction juste 2 case pour les codes de + et -
10 avril 2005 à 19:19
10 avril 2005 à 19:17
et plus loint
[ il est certain que cette fonction peut être améliorée/optimisée/modifiée/etc... à vos besoins, mais personnellement, ma fonction répond exactement aux miens]
WSIsNumeric(Value As Variant) As Boolean
Dim Compteur As Byte
WSIsNumeric = False
if IsNumeric(Value) and instr(value,"E")=O and instr(value,"D")=0
WSIsNumeric = True
End IF
end function
Et voila
10 avril 2005 à 14:08
9 avril 2005 à 18:27
Dim Compteur As Byte
WSIsNumeric = False
if IsNumeric(Value) and instr(value,"E")=O and instr(value,"e")=0 and instr(value,"+")=O and instr(value,"-")=0
WSIsNumeric = True
End IF
end function
La, sauf oublie, ca devrais être bon. Si la valeur est concidéré comme bonne par isnuméruc, il nous reste plus que les E, + et - ou il reste encore un truc ?
S'il en reste, il suffit de rajouter un instr.
Je suis toujours pas sur qu'il y ai pas une fonction plus rapide qu'instr pour ca.
9 avril 2005 à 02:38
Ca c'est ta premisse de depart. C'est avec ce mandat que j'ai travaillé.
Tu peux ajouter a cette condition toutes tes exceptions. {if not isnumeric(mid$(value,compteur,1)) then exit function}
Selon les autres commentaires, tu auras du pain sur la planche pour inclure les exceptions. Les chiffres signés ne peuvent avoir un (+,-) qu'au premier caractere de la chaines. Le E que l'on doit tolérer ne doit pas etre a la premiere ni a la derniere position de la chaine, etc etc
Personnellement, j'organiserais mon code afin d'éviter de devoir faire ce genre de test autant que possible.
9 avril 2005 à 02:25
Function WSIsNumeric(Value As String) As Boolean
Dim Compteur As Byte
For Compteur = 1 To Len(Value)
'48 8, 57 9
If (Asc(Mid(Value, Compteur, 1)) < 48 Or Asc(Mid(Value, Compteur, 1)) > 57) And Mid(Value, 1, 1) <> "-" Then
WSIsNumeric = False
Exit Function
End If
Next
WSIsNumeric = True
End Function
Ça prend aussi les négatifs, le byte et bien ... c'est rare un nombre de 255 chiffres.
8 avril 2005 à 23:15
On fait des remarques juste pour voir si on peut la perfectionner (on donc tous apprendre).
pour Gobillot :
d'après l'exmple, j'en déduit qu'on veut tester si s'est numérique,pas currency (monértaire). Donc on veut pas de € et de F.
Quant a + et - au début, ca serais une function ispos ou isneg dans ce cas. Mais rien n'empèche de rajouter 2 instr (je crois d'ailleur qu'il y a mieux comme fonction que instr).
8 avril 2005 à 17:54
8 avril 2005 à 17:52
point, virgule, espace, "+","-", "E", "€" (remplace le "F")
8 avril 2005 à 16:33
8 avril 2005 à 16:30
Function WSIsNumeric(Value As Variant) As Boolean
Dim Compteur As Byte
WSIsNumeric = False
if IsNumeric(Value) and instr(value,"E")=O and instr(value,"e")=0
WSIsNumeric = True
End IF
end function
8 avril 2005 à 00:19
Max12, merci de me dire que ma fonction peut être optimisée, mais alors sois constructif, et indique-nous comment ... ???
7 avril 2005 à 23:16
Tu le passes deja dans le tamis du IsNumeric. Donc, a part les [E,e], y a-t-il d'autres exceptions ?
Autrement il serait plus court de passer en revue chaque caracteres de la chaine plutot que de faire une boucle de 32 à 256... Et de faire un IsNumeric sur chaque caracteres...
Function WSIsNumeric(Value As Variant) As Boolean
Dim Compteur As Byte
WSIsNumeric = False
if IsNumeric(Value) then
for Compteur =1 to len(value)
if not isnumeric(mid$(value,compteur,1)) then exit function
Next
WSIsNumeric = True
End IF
End Function
7 avril 2005 à 17:39