Limiter saisie deux chiffres après la virgule
Résolu/Fermé
A voir également:
- Limiter saisie deux chiffres après la virgule
- Saisie gestuelle iphone - Guide
- Deux ecran pc - Guide
- Tous les code possible de 0 à 9 (4 chiffres ) liste - Forum Programmation
- Autorisation non accordée d'activer la saisie vocale - Forum Xiaomi
- Saisie vocale sms - Guide
3 réponses
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
17 mai 2010 à 10:13
17 mai 2010 à 10:13
Bonjour,
Question 1 : limiter la saisie à 2 nombres après la virgule :
En utilisant l'évènement "TextBox_Change" Comme ceci :
Question 2 : Transformer la valeur du TextBox de String à "nombre": Ici, comme on parle de nombres décimaux, nous allons transformer le "String" du TextBox en "Double". Lors de l'écriture dans la cellule, au lieu d'un simple : Cells(1, 1) = TextBox1 on ajoute CDbl :
Question 1 : limiter la saisie à 2 nombres après la virgule :
En utilisant l'évènement "TextBox_Change" Comme ceci :
Private Sub TextBox1_Change() If Right(TextBox1, 1) = "." Or Right(TextBox1, 1) = "," Then TextBox1.MaxLength = Len(TextBox1) + 2 End Sub
Question 2 : Transformer la valeur du TextBox de String à "nombre": Ici, comme on parle de nombres décimaux, nous allons transformer le "String" du TextBox en "Double". Lors de l'écriture dans la cellule, au lieu d'un simple : Cells(1, 1) = TextBox1 on ajoute CDbl :
Cells(1, 1).Value = CDbl(TextBox1)
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
17 mai 2010 à 10:01
17 mai 2010 à 10:01
Bonjour,
Tu peux essayer de tronquer le nombre rentré. Par exemple, si l'utilisateur entre 12.13264, quand le texte box n'est plus sélectionné, ce nombre se converti en 12.13
Pour tronquer, il faut créer une fonction qui fait ça. Il y a plusieurs manières de procéder.
Par exemple nombre = int(nombre * 10^2)/10^2 pour avoir deux chiffres après la virgule.
à mettre dans un évènement : TextBox1_Exit
Tu peux essayer de tronquer le nombre rentré. Par exemple, si l'utilisateur entre 12.13264, quand le texte box n'est plus sélectionné, ce nombre se converti en 12.13
Pour tronquer, il faut créer une fonction qui fait ça. Il y a plusieurs manières de procéder.
Par exemple nombre = int(nombre * 10^2)/10^2 pour avoir deux chiffres après la virgule.
à mettre dans un évènement : TextBox1_Exit
merci pour ta réponse mais je cherche à savoir si on peut bloquer la saisie à deux chiffres après la virgule (avec par exemple, messagebox pour avertir l'utilisateur qu'il en rentre de trop).
si cela n'est pas possible, j'avais déjà envisagé cette solution qui responsabilise pas mal l'utilisateur (ce que j'essaye d'éviter le plus).
mais merci encore ...
si cela n'est pas possible, j'avais déjà envisagé cette solution qui responsabilise pas mal l'utilisateur (ce que j'essaye d'éviter le plus).
mais merci encore ...
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
17 mai 2010 à 11:21
17 mai 2010 à 11:21
Je te propose cette solution aussi :
Private Sub TextBox1_Change()
If InStr(1, Replace(TextBox1.Text, ",", "."), ".") * (InStr(1, TextBox1.Text, ".") + 2 < Len(TextBox1.Text)) Then TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
End Sub
Reste à savoir si le séparateur des décimaux dans ton système est "." ou ",". Pour moi c'est le point ".". Il faut adapter selon le cas, ou bien améliorer pour prendre en compte les deux choses.
Private Sub TextBox1_Change()
If InStr(1, Replace(TextBox1.Text, ",", "."), ".") * (InStr(1, TextBox1.Text, ".") + 2 < Len(TextBox1.Text)) Then TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
End Sub
Reste à savoir si le séparateur des décimaux dans ton système est "." ou ",". Pour moi c'est le point ".". Il faut adapter selon le cas, ou bien améliorer pour prendre en compte les deux choses.
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
17 mai 2010 à 11:24
17 mai 2010 à 11:24
Si tu n'es pas sur du type du séparateur des décimaux, n'utilise pas la fonction Replace(), ce qui donnera ceci :
Private Sub TextBox1_Change()
If InStr(1, TextBox1.Text, ".") * (InStr(1, TextBox1.Text, ".") + 2 < Len(TextBox1.Text)) Then TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
End Sub
Private Sub TextBox1_Change()
If InStr(1, TextBox1.Text, ".") * (InStr(1, TextBox1.Text, ".") + 2 < Len(TextBox1.Text)) Then TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
End Sub
merci beaucoup de te tracasser la tête pour moi.
la solution que pijaku m'a donnée fonctionne et a l'air un peu plus claire pour moi. mais si tu juges que ta solution est plus efficace, je l'adopterai sans problème.
de plus, penses tu avoir une solution pour éviter le copier/coller 25 fois (d'après pijaku, il m'y en a pas) ? car cela me désespère de devoir le faire ! lol
merci encore ...
la solution que pijaku m'a donnée fonctionne et a l'air un peu plus claire pour moi. mais si tu juges que ta solution est plus efficace, je l'adopterai sans problème.
de plus, penses tu avoir une solution pour éviter le copier/coller 25 fois (d'après pijaku, il m'y en a pas) ? car cela me désespère de devoir le faire ! lol
merci encore ...
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
17 mai 2010 à 11:59
17 mai 2010 à 11:59
Bonjour
1 - Pour l'instant, tu peux définir une seule méthode pour tous les textbox du UserForm
Private Sub TextBox1_Change()
test Me.ActiveControl
End Sub
Private Sub test(txtObj As Object)
If Len(txtObj) = 0 Then txtObj.MaxLength = 255
If Right(txtObj, 1) = "." Or Right(txtObj, 1) = "," Then txtObj.MaxLength = Len(txtObj) + 2
End Sub
A utiliser avec méfiance. Il faut vérifier que vraiment tous les TextBox ont la même fonction sur ta form.
2 - Sinon, pour la solution de pijaku, elle est astucieuse. Mais elle a un petit défaut :
Quant on écrit "1253.24", c'est vrai, elle bloque les décimales. Cependant, on ne peux plus modifier la partie entière sous cette écriture. On ne peux pas ajouter par exemple un chiffre au début comme "91253.25" qu'après avoir effacé un chiffre décimal. La solution que j'ai proposée tien compte de cet remarque.
1 - Pour l'instant, tu peux définir une seule méthode pour tous les textbox du UserForm
Private Sub TextBox1_Change()
test Me.ActiveControl
End Sub
Private Sub test(txtObj As Object)
If Len(txtObj) = 0 Then txtObj.MaxLength = 255
If Right(txtObj, 1) = "." Or Right(txtObj, 1) = "," Then txtObj.MaxLength = Len(txtObj) + 2
End Sub
A utiliser avec méfiance. Il faut vérifier que vraiment tous les TextBox ont la même fonction sur ta form.
2 - Sinon, pour la solution de pijaku, elle est astucieuse. Mais elle a un petit défaut :
Quant on écrit "1253.24", c'est vrai, elle bloque les décimales. Cependant, on ne peux plus modifier la partie entière sous cette écriture. On ne peux pas ajouter par exemple un chiffre au début comme "91253.25" qu'après avoir effacé un chiffre décimal. La solution que j'ai proposée tien compte de cet remarque.
pour le premier problème, je vais essayer de trouver une solution pour essayer de réduire mon code et de l'optimiser. merci pour ta solution.
pour le second, tu as parfaitement raison, on ne peux pas rajouter de chiffre après avoir dépasser les deux chiffres après la virgule. mais j'ai essayé ton code et il ne fonctionne pas (peut-être une mauvaise manip' de ma part ...). mais bon, à la limite, ce n'est pas trop grave, l'utilisateur pourra effacer et réécrire.
merci pour ton aide commentcamarcheeay
pour le second, tu as parfaitement raison, on ne peux pas rajouter de chiffre après avoir dépasser les deux chiffres après la virgule. mais j'ai essayé ton code et il ne fonctionne pas (peut-être une mauvaise manip' de ma part ...). mais bon, à la limite, ce n'est pas trop grave, l'utilisateur pourra effacer et réécrire.
merci pour ton aide commentcamarcheeay
17 mai 2010 à 10:43
la question 2 est résolue (j'ai cherché trop compliqué) et elle était toute simple quand on connait toutes les fonctions de VBA. un grand merci à toi !
par contre, pour la question 1 : elle fonctionne partiellement car quand j'entre un nombre décimal à plus de deux chiffres après la virgule, cela se bloque et n'affiche pas la suite (ce que je cherche) mais quand je souhaite effacer ce que je viens d'entrer et que je remets un nombre entier (un peu long), cela ce bloque.
voici un exemple :
je veux entrer 1,235 et la saisie se bloque à 1,23 (super c'est ce que je veux) mais quand j'efface 1,23 et que je veux mettre à la place 123456, je ne peux entrer que 1234.
vois-tu où vient le problème ?
encore merci pour tes réponses ...
17 mai 2010 à 11:03
17 mai 2010 à 11:22
merci beaucoup pour ton aide !!!
dernière petite question : quand j'ai plusieurs textbox dans un même userform avec le même type de problème : saisie bloquante d'un décimale à plus de deux chiffres après la virgule, comment dois-je faire pour éviter de recopier-coller le code 25 fois ?
encore merci ...
17 mai 2010 à 11:25
euh ... de rien et à bientôt
17 mai 2010 à 11:28
bonne journée.