Ma procédure fonctionne mal...(vérification de saisie dans un formulaire)

Résolu
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009 - 10 avril 2007 à 15:57
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009 - 11 avril 2007 à 01:16
B'jour!

Je suis méga débutant et même les infos que je trouvent à droite, à gauche sur le net me parraissent trop compliquées...

Je suis en train de faire un formulaire et j'aimerai effectuer des vérifications sur le remplissage de celui-ci. En gros, grand classique je suppose, j'aimerais que le code postal saisi par l'utilisateur ne contienne que des entiers. Pour celà, j'ai trouvé une petite procédure qui me permet de vérifier les caractères saisis à partir de leur code ascii. La procédure est la suivante:

Private Sub txtCodePostal_KeyPress(KeyAscii As Integer)    If KeyAscii 8 Or Chr(KeyAscii) m_DecimalChar Then
        Exit Sub
    End If
   
    If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
        KeyAscii = 0
        Beep
    End If
End Sub

Point positif, ça fonctionne! Mais maintenant, j'aimerai bien pouvoir utiliser ce bout de programme sans avoir à faire un copier coller à chaque fois ... Le système de fonction me parrait donc être le bon, non?

Pour celà, j'avais imaginé faire ma fonction:

    Sub fonctionNumerique           If KeyAscii 8 Or Chr(KeyAscii) m_DecimalChar Then
        Exit Sub
    End If
   
    If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
        KeyAscii = 0
        Beep
    End If

puis de l'appeler en cas de besoin de la manière suivante:

Private Sub txtCodePostal_KeyPress(KeyAscii As Integer)
    call fonctionNumerique
End sub

Mais dans ce cas là, la saisie dans le champs n'est pas bloquée, tous les caractères s'affichent MAIS il y a un Beep à chaque caractère.

Donc j'aimerais savoir si quelqu'un peut me donner un coup de main afin que seuls les entiers apparaissent ;)

Merci beaucoup de votre aide :)

David

21 réponses

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
10 avril 2007 à 16:21
Violent Ken
Salut, voilà quelque chose de plus simple :

Option Explicit

Private Sub txtCodePostal_KeyPress(KeyAscii As Integer)
   KeyAscii = FonctionNumerique(KeyAscii)
End Sub<hr />
Private Function FonctionNumerique(nb As Integer) As Integer   If nb < 48 Or nb > 57 Then FonctionNumerique 0 Else FonctionNumerique nb
End Function , ----
By Renfield
@+

Hex Editor VB
3
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
10 avril 2007 à 16:13
Salut,

Je pense que pour ta fonction, il faut que tu lui passes en paramètre ta zone de text à vérifier

A+
Exploreur

 
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
10 avril 2007 à 16:13
Salut, essaye ça:

Public
 Sub numerique(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii 8 Or Chr(KeyAscii) m_DecimalChar Then
        Exit Sub
    End If
   
    If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
        KeyAscii = 0
        Beep
    End If

   End Sub

Private Sub txtCodePostal_KeyPress(KeyAscii As Integer)
Call numerique(KeyAscii)

End Sub

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
10 avril 2007 à 16:18
Salut,

Voici :

Private Sub Text1_KeyPress(keyascii As Integer)


Call Verife(keyascii)
   


End Sub


Private Function Verife(keyascii As Integer) If keyascii 8 Or Chr(keyascii) m_DecimalChar Then
        Exit Function
    End If
   
    If Chr(keyascii) < "0" Or Chr(keyascii) > "9" Then
        keyascii = 0
        Beep
    End If
End Function


A+
Exploreur


 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
10 avril 2007 à 16:18
Post croisé

A+
Exploreur

 
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
10 avril 2007 à 16:21
Bonjour,

Une fonction reçois des paramètres et retourne une valeur.
1) tu n'utilises pas là une fonction, mais une sous-routine .
2) tu ne passes aucun paramètre et ne reçois donc rien en retour de ton appel  !
    paramètre à passer à une fonction  ? peut-être la valeur de keyascii, non ?
    valeur retournée par une fonction ? peut être une booléenne True ou False , non ?
    et si true : au retour de l'appel : keyascii = 0 : beep

Genre, donc : if controlons(keyascii) then beep: keyascii = 0

et ta fonction :
private function controlons(KK as integer)
    controlons = False     If KK 8 Or Chr(KK) m_DecimalChar or isnumeric(chr(KK)) Then exit sub
     controlons = true
End function
Devrait suffire !
Fait à main levée et à contrôler, donc....
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
10 avril 2007 à 16:22
Merci sincèrement de vos réponses.

Vos deux propositions ne sont pas exactement les mêmes vu qu'un des deux propose le mot "function". Sauf erreur de ma part, une "function" ne devrait pas retrouner une valeur?

J'ai toutefois une erreur qui arrive lorsque je lance mon appli, avec l'une ou l'autre des solutions:
erreur de compilation:
type défini par l'utilisateur non défini

Alors est-ce que j'ai oublié une déclaration qqpart?

Merci encore de votre aide!

David

PS: j'étudie la proposition de jmfmarques que je viens de recevoir ;)
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
10 avril 2007 à 16:24
Then exit Function et pas Then Exit Sub, bien sur
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
10 avril 2007 à 16:25
Violent Ken
Pour empêcher la saisie de caractères autres que des chiffres, regarde le bout de code que j'ai posté avant (plus optimisé que de faire des Chr()...)
@+

Hex Editor VB
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
10 avril 2007 à 16:27
ouep violent_ken, je regarde toutes les propositions :D

Y'a une telle réactivité sur ce forum que je suis obligé de tester tout à toute allure :D
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
10 avril 2007 à 16:35
Salut,

Désolé Jmfmarques et Davidguillon, je n'ai pas encore le bon "vocabulaire" pour exprimer ma pensée correctement..

A+
Exploreur

 
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
10 avril 2007 à 16:36
violent_ken, ta solution me convient parfaitement, je m'occuperai d'ajouter le support de la touche d'effacement. Je vais essayer d'y arriver seul :)

Par contre je ne comprends pas exactment la gestion de ta variable "nb" au moment du "Else FonctionNumerique = nb". Je comprends que "FonctionNumerique" prend la valeur de "nb". Or pour moi "FonctionNumerique" est une fonction... pas une variable. Merci de m'expliquer où je me plante :)

Aussi, tu as mis un "Option Explicit" au début du code, cette ligne m'a planté le programme, je l'ai enlevé... et ça fonctionne maintenant! Dois-je la remettre? Si oui... où? et à quoi sert-elle? :p

Merci encore, et merci jmfmarques! Si jamais vous pouvez m'expliquer en quoi le bout de code que j'avais propose (et que vous m'aviez corrigé dans un premier temps) était plus performant que la proposition de violent_ken, j'en serai ravi et me repencherai sur ce code si finalement il y a des avantages non négligeables :) j'aurai sans doute une ou deux autres questions à venir ... J'espère que vous serez toujours là :D

Merciiiii

David
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
10 avril 2007 à 16:47
Violent Ken
Alors :
"Par contre je ne comprends pas exactment la gestion de ta variable "nb" au moment du "Else FonctionNumerique nb". Je comprends que "FonctionNumerique" prend la valeur de "nb". Or pour moi "FonctionNumerique" est une fonction... pas une variable. Merci de m'expliquer où je me plante :)" >  FonctionNumerique est une fonction : elle prend donc des paramètres et renvoie une valeur.If nb < 48 Or nb > 57 Then FonctionNumerique 0 Else FonctionNumerique nb

--> cela signifie : "Si la valeur du KeyAscii passée en paramètre n'est pas entre 48 et 57, alors le retour de la fonction sera 0, sinon le retour de la fonction aura la valeur du KeyAscii que l'on avait passé en paramètre".

"Aussi, tu as mis un "Option Explicit" au début du code, cette ligne m'a planté le programme, je l'ai enlevé... et ça fonctionne maintenant! Dois-je la remettre? Si oui... où? et à quoi sert-elle? :p"
> Option Explicit permet à Visual Studio de n'accepter le code uniquement quand il ne comporte plus d'erreur de syntaxe. Autrement dit, si tu as oublié de déclarer des variables, si tu as fait des erreurs quelque part dans le code de ta form, le 'Option explicit' te le signalera.
C'est plus propre de le mettre (comme çà si çà compile çà veut dire qu'il n'y a pas d'erreurs), mais ce n'est pas indispensable.

Je te conseille de le laisser et de corriger les erreurs qui ont été montrées par VB6. Normalement, il faudrait le mettre tout le temps, en en tête de chaque form, module, classe, usercontrol... Mais bon ;)

@+

Hex Editor VB
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
10 avril 2007 à 16:50
Violent Ken
J'ajouterais également (dsl pour le double post) qu'il est possible de demander à Visual Studio d'ajouter automatiquement 'Option Explicit' dans chaque nouvelle form, classe, module...

Il faut aller dans les options, et cocher "Déclaration des variables obligatoires" dans l'onglet "Editeur".

@+

Hex Editor VB
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
10 avril 2007 à 16:58
Ca c'est de la réponse claire pour débutant comme moi :) Merci beaucoup :)

Je suis en train de rechercher comment mettre sur une meme ligne la condition nécessaire pour que nb soit compris entre 48 et 57 mais que le 127 soit accepté aussi :)

C'est sans doute pas compliqué mais quand on ne sait pas faire... il faut chercher :D

David
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
10 avril 2007 à 17:00
Violent Ken


Option Explicit

Private Sub txtCodePostal_KeyPress(KeyAscii As Integer)
  KeyAscii = FonctionNumerique(KeyAscii)
End Sub<hr />
Private Function FonctionNumerique(nb As Integer) As Integer  If (nb < 48 Or nb > 57) And nb <> 127 Then FonctionNumerique 0 Else FonctionNumerique nb
End Function ,

----

Hex Editor VB
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
10 avril 2007 à 17:08
Ha merci, j'en étais pas loin :)

Là ou j'étais loin c'est sur le 127 :D En fait c'était le 8 et donc ça me permet de faire la différence entre les Chr(KeyAscii) et les KeyAscii :D

Merci encore :)
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
10 avril 2007 à 17:19
Une petite dernière question...

D'après mes recherches que je fais sur le net en ce moment même, j'ai l'impression que le fait que ma fonction soit dans mon code directement ou dans un module n'ait pas d'importance... Or, si je met ma fonction dans un module, mon appli ne la trouve plus. J'ai bien tenté de mettre Module.Fonction dans l'appel de la fonction mais non, ça ne semble pas être la bonne solution :)

Merci encore de votre aide :)

David
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
10 avril 2007 à 17:58
bon je vais tenter de sauver la mise (a peine modeste XD)

voila le code le plus simple que j'ai pu trouver pour ca :

Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim allowedKeys As String
allowedKeys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" & Chr(8)
If InStr(allowedKeys, Chr(KeyAscii)) 0 Then KeyAscii 0
End Sub


allowedKeys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" & Chr(8)

entre les " tu met les caracteres autoriser donc chiffre ou lettres etc (ici toutes les majuscules, minuscules et chiffres sont autoriser ;-))
le chr(8) ses la touche backspace (pour qu'il puisse effacer la saisie ^^)

j'ai jamais trouver plus simple que ca :> suffit de mettre ce code comme ca, les carac autoriser et hop ses nikel ^^ le reste est bloquer lors de la saisie (et le copier coller va pas non plus pour pas fausser ^^)

voila voila en esperant avoir aider (car mettre les codes ascii autoriser c'etais pas mon truc donc j'avais toruver ce bout de code ^^)

Bien a toi
Diablaman
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
10 avril 2007 à 19:04
davidguillon,

Pour que ta fonction soit appelable depuis partout alors qu'elle est dans un Module (donc .bas), il suffit de changer Private en Public.


Il n'est nul besoin, pour l'appeler, de donner le nom du module qui la contient.
0
Rejoignez-nous