Formater une editbox dans la création d'une boite de dialogue [Résolu]

Signaler
Messages postés
8
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
12 janvier 2006
-
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
-
Bonjour,

Je débute en visual basic et j'aurais souhaité savoir comment formater une editbox pour que les caractères rentrés soient exclusivement des nombres.

Actuellement on peut rentre des valeurs comme 23.65.23333 où l'on peut remarquer 2 virgules...Aidez moi svp pour que le text rentré soit uniquement de type numérique.

Merci

15 réponses

Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
22
Moi je préfère cette façons que je trouve un tantinet plus "propre" si je puis m'exprimer ainsi :

(!!! Reprise du code de Bouv qui est très bien !!!)
(Note que tu peux te passer du code en italique... Mais c'est bien de prendre l'habitude...)

'Partie à mettre tout en haut de la page du code
Const cstDecimalChar = " . " 'Ou alors un code pour récupérer la caractère selon le préférences locales de l'utilisateur (cf. au forum et aux sources de VBF)
...
'Procédure événementielle qui s'exécute lorsque l'utilisateur à appuyé (puis relaché) sur une touche
Private Sub Text1_KeyPress(KeyAscii As Integer)
'On active le gestionnaire d'erreurs
On Error GoTo GestionErreurs

'On autorise le BackSpace (touche delete si tu préfère)
If KeyAscii = vbKeyBack Then Exit Sub

'On recherche si la touche est caractère autorisé
If InStr("0123456789" & cstDecimalChar, Chr$(KeyAscii)) = 0 Then
'On bloque les caractères non autorisés
KeyAscii = 0
Else
'Si la touche correspond au symbole decimal
'Et qu'il y en avait déjà un dans le texte
'On annule la saisie
If Chr$(KeyAscii) = cstDecimalChar And _
InStr(MaTextBox.Text, cstDecimalChar) <> 0 Then KeyAscii = 0
End If
'On désactive le gestionnaire d'erreurs.
On Error Goto 0 'Pas très utile... c'est juste pour l'habitude!
Exit Sub
GestionErreurs:
...
End Sub
Le symbole "_" permet d'écrire une seule ligne de code sur 2 lignes physiques afin de rendre l'apparence du code plus "propre". C'est l'antonyme parfait de ":" qui sert à mettre plusieurs instructions de code sur une seule ligne physique. Exemple : A 21: B 12: Me.? A; ""; B

Chr$(ascii) permet d'obtenir le caractère (string) du code ASCII correspondant. Tu dois savoir que chaque caractère (dit ASCII donc) a un code (de 0 à 255 d'où 256 caractères ASCII en tout). Or, la procédure nous donne, dans KeyAscii (key en anglais = clef, touche), non pas le caractère de la touche enfoncé, mais son code ASCII. Tout simplement parce qu'il y a des touches possèdant un code ASCII mais pas un caractère graphique (les 32 premiers caratères ASCII en l'occurrence). Par exemple, la touche "<-----" [delete] n'a pas de caractère mais a bien un code : le 8.
Ces codes de touches peuvent être soit exprimés sous forme de chiffres, soit sous forme de constante VB (qui elles renvoyent le vrai code!). Pourquoi ? Parce que les constantes VB pour les codes de touches (et oui, parce qu'il y a aussi d'autres constantes VB pour d'autres choses!!!) sont plus faciles à mémorisées. Elles commencent toutes par "vbKey" suivient du nom (originel) de la touche. Par exemple : "vbKeyA" pour la touche "A", "vbKeyUp" pour la flêche qui monte, "vbKeyReturn" pour la touche "Entrée", "vbKeyBack" pour la touche "delete", ..., ..., ...

La fonction "InStr" permet de chercher la première occurence d'une chaine de caractère (string) dans une autre. C'est à dire, qu'elle renvoie le "numéro" du premier caractère de la première chaine trouvée dans la seconde... Par exemple : InStr("ab defghij", "c de") = 3
Si la chaine a trouver dans la 1ère n'existe pas (dans la première donc), la fonction renverra 0.
Exemple : InStr("abcdefghij", "t") = 0
Ici, en l'occurrence, on cherche à savoir si le caractère de la touche saisie (Chr$(KeyAscii)) fait parti des caractères réservées ("0123456789" et "."ou ","). Si ce n'est pas un de ces caractères (s'il n'y a aucune occurrence), la fonction renverra "0" et donc, nous seront qu'il ne sagit pas d'un caractère valide.

J'espère avoir été claire et que ces quelques explications (que tu trouveras aussi dans l'aide si tu te donne la peine de regarder) t'auront servies à progresser.

Mais note toute de même qu'il y a d'autres techniques pour arriver à ce résultat... Ce n'est pas la seule méthode!

Bouv : J'espère que tu ne m'en veux pas d'avoir complété tout ça!

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
22
Ah oui, j'allais oublier... Pense aussi, à chaque fois que tu poses une question sur le forum, de nous dire dans quel langage tu programmes ainsi que sa version (VBS, VBA Excel 2000, VB6, VB.NET, ...)

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
22
Utiliser la propriété MaxLenght de la zone de texte...

Text1.Maxlenght = 2
(vérifie quand même l'orthographe car je suis plus très sûr...)

Pour les cours, la meilleur chose reste l'aide livré avec. Pi au passage, le VB livré avec les applications de la suite bureautique Office s'appel "VBA" pour Visual Basic for Application. Autrement dit, tu ne pourras pas faire d'exécutables avec puisqu'il ne s'agit que d'un langage de script déstiné aux applications de Office.

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
Je ne vois pas ce que cela apporte de plus car tu fais 2 fois le meme controle mais de 2 façons différentes. A savoir y a-t-il déjà une partie décimale.
Et je ne vois pas pourquoi tu veux absolument me supprimer cstValidChars.

Par contre, le seul problème qu'il reste à ce genre de code c'est le copier/coller.
En effet, rien ne m'empeche de coller ce que je veux dans la textbox.

J'avais réalisé un controle utilisateur à cet effet pour l'un de mes programmes. La TextBox est Sous-classée afin de detecter l'opération Coller. Si elle se produit, je vide le presse papier avant qu'il ne se colle dans la textbox.

Si j'ai le temps de l'isoler du programme je le posterai.

Bonne prog
++
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
Private Sub MaTextBox_KeyPress(KeyAscii As Integer)
Const ValidChars = "0123456789"
Const DecimalChar = ","
'On autorise le BackSpace
If KeyAscii = 8 Then Exit Sub
'On bloque les caractères non autorisés If InStr(ValidChars & DecimalChar, Chr$(KeyAscii)) 0 Then KeyAscii 0
'Si on saisi le symbole decimal
If Chr$(KeyAscii) = DecimalChar Then
'Et qu'il y en avait deja un
If InStr(MaTextBox.Text, DecimalChar) <> 0 Then
'On annule la saisie
KeyAscii = 0
End If
End If
End Sub

Bonne prog
++
Messages postés
8
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
12 janvier 2006

Merci pour cette réponse rapide ! Par contre j'ai un soucis.
Je pense que je dois utiliser une version de visual basic un peu batarde car je n'ai pas accès à la fonction keypress. En fait j'utilise visual basic à partir du logiciel DIAdem.
C'est un logiciel qui permet d'automatiser la génération de rapport et avec laquelle on peut générer des scripts.
La version de mon script engine est 5,6,0,8820.
Là je suis un peu perdu sur la méthode a appliqué.
Les événements disponibles pour mon EditBox sont EventChange, EventDblClick, EventInitialize, EventMouseDown, EventMouseMove, EventMouseUp et EventRefresh.

Chaque événement est formater comme suit :
Sub EditBox9_EventChange()
Dim This : Set This = EditBox9

End Sub

Sachant également que je ne peux pas modifier le texte ci-dessus et que je dois taper le code voulu à la place du blanc...je ne sais pas si vous avez compris mon problème mais en tout cas il est bien présent...hehe

Merci d'avance
Messages postés
8
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
12 janvier 2006

Merci beaucoup pour toutes ces informations très utiles mais je crois quand fait mon premier soucis est que je ne sais pas sur quelle version de visual basic je travaille...Comme je l'avais mis précédement ça a l'air d'être une version un peu batarde...Sinon je peux essayer de travailler sous visualbasic compris avec microsoft office 2002...
Merci encore de votre aide
Messages postés
8
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
12 janvier 2006

Je vais en fait utiliser la version visual basic inclut dans powerpoint. Merci de votre aide !! Peut être à bientôt lors de mon prochain problème...
Messages postés
8
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
12 janvier 2006

J'ai une nouvelle question concernant le même sujet : Comment peut on faire pour limiter le champs à 2 chiffres après la virgule ? et également quels cours me conseillez vous pour apprendre visual basic ?

Merci

ps: je sais je suis une bille en visual basic à l'heure présente...
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
Non il a demandé 2 chiffres après la virgule. MaxLength compte le nombre total de caractères saisis.

Donc pour optimiser encore un peu :

Const cstDecimalChar As String = "."
Const cstNombreDecimal As Long = 2
Const cstValidChars As String = "0123456789"


Private Sub MaTextBox_KeyPress(KeyAscii As Integer)
On Error GoTo GestionErreurs


If KeyAscii = vbKeyBack Then Exit Sub


If InStr(cstValidChars & cstDecimalChar, Chr$(KeyAscii)) = 0 Then
KeyAscii = 0
ElseIf Chr$(KeyAscii) = cstDecimalChar Then
If InStr(MaTextBox.Text, cstDecimalChar) <> 0 Then KeyAscii = 0
End If


'On controle ici le nombre de decimal
If InStr(MaTextBox.Text, cstDecimalChar) <> 0 And _
Len(MaTextBox.Text) = InStr(MaTextBox.Text, cstDecimalChar) + cstNombreDecimal And _
MaTextBox.SelStart > InStr(MaTextBox.Text, cstDecimalChar) Then KeyAscii = 0

On Error GoTo 0
Exit Sub
GestionErreurs:


End Sub


Désolé j'ai supprimé les commentaires pour faire plus court.

Bonne prog
++
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
22
Oups, en effet bouv, bien vu... désolé! La propriété Maxlenght sert à limiter le nombre maxi de caractères saisissables, donc, en effet, rien à voir avec les décimales!!!

Cependant bouv... je ne peux m'empêcher d'en remettre une couche après avoir apporté une variante avec ceci :

Const cstDecimalChar As String = "."
Const cstNombreDecimal As Long = 2

...
Private Sub Text1_KeyPress(KeyAscii As Integer)
On Error GoTo GestionErreurs
If KeyAscii = vbKeyBack Then Exit Sub
If InStr("0123456789" & cstDecimalChar, Chr$(KeyAscii)) = 0 Then
KeyAscii = 0
ElseIf Chr$(KeyAscii) = cstDecimalChar Then '<=Bien vu en effet!
If InStr(Text1.Text, cstDecimalChar) <> 0 Or _
Len(Val(Text1.Text)-Fix(Val(Text1.Text)) > 2 Then KeyAscii = 0

End If
On Error GoTo 0
Exit Sub
GestionErreurs:

...
End Sub

J'espère que ça fonctionne parce que j'ai même pas testé (c'était juste pour le fun)

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
Messages postés
8
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
12 janvier 2006

Merci énormément pour votre aide ça marche nikel !!
Messages postés
8
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
12 janvier 2006

Euh....en fait j'ai un nouveau soucis....j'arrive pas à trouver la commande pour exécuter mon script depuis une autre application...
Messages postés
8
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
12 janvier 2006

C'est bon en fait j'y suis arrivé j'ai enfin trouvé !!
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
Allez jetter un oeil sur ma source http://www.vbfrance.com/code.aspx?ID=35535

Elle permet de faire bien d'autres choses.

Bonne prog
++