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

[Résolu]
Signaler
Messages postés
81
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
15 septembre 2009
-
Messages postés
81
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
15 septembre 2009
-
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

Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut,

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

A+
Exploreur

 
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
10
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:
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
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


 
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Post croisé

A+
Exploreur

 
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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....
Messages postés
81
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
15 septembre 2009

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 ;)
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Then exit Function et pas Then Exit Sub, bien sur
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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
Messages postés
81
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
15 septembre 2009

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
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut,

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

A+
Exploreur

 
Messages postés
81
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
15 septembre 2009

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
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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
Messages postés
81
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
15 septembre 2009

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
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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
Messages postés
81
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
15 septembre 2009

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 :)
Messages postés
81
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
15 septembre 2009

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
Messages postés
419
Date d'inscription
lundi 30 août 2004
Statut
Membre
Dernière intervention
28 janvier 2008

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
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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.