FONCTION ISNUMERIC AMÉLIORÉE (EMPÊCHE LES EXPOSANTS)

cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014 - 7 avril 2005 à 17:39
Reservoir_Dogs Messages postés 3 Date d'inscription dimanche 6 août 2006 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/30616-fonction-isnumeric-amelioree-empeche-les-exposants

Reservoir_Dogs Messages postés 3 Date d'inscription dimanche 6 août 2006 Statut Membre Derniè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.

Svp Quelqu'un pourrait m'aider....
Utilisateur anonyme
24 nov. 2005 à 21:33
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és 7 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 10 avril 2005
10 avril 2005 à 19:19
oups, j'ai le "then" a la fin de la ligne if.
ndjpoyepoy Messages postés 7 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 10 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és 9 Date d'inscription samedi 22 décembre 2001 Statut Membre Dernière intervention 10 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és 7 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 10 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és 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 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és 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Derniè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és 7 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 10 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és 9 Date d'inscription samedi 22 décembre 2001 Statut Membre Dernière intervention 10 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és 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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és 7 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 10 avril 2005
8 avril 2005 à 16:33
ha oui, donc plus besoin de déclarer Compteur dans mon exemple.
ndjpoyepoy Messages postés 7 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 10 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és 9 Date d'inscription samedi 22 décembre 2001 Statut Membre Dernière intervention 10 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és 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 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és 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Derniè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 :$