Limiter saisie deux chiffres après la virgule

[Résolu/Fermé]
Signaler
-
 SANA -
Bonjour,

Je suis débutante en VBA Excel et je cherche à limiter la saisie d'un utilisateur dans une textbox (dans un userform) afin qu'il puisse entrer qu'un nombre décimal avec, au maximum, deux chiffres après la virgule.
Est il possible de faire bloquer la saisie lorsque l'utilisateur entre plus de deux chiffres après la virgule ?
Je ne souhaite pas mettre qu'un messagebox pour avertir l'utilisateur mais vraiment bloquer la saisie après deux chiffres après la virgule.

je ne sais pas si cela est faisable en VBA Excel.

pour le moment, j'ai réussi à faire accepter dans ma textbox que le format numérique et l'acceptation d'un séparateur pour la décimal avec possibilité d'entrer soit une virgule, soit un point, qui sera transformé automatiquement en virgule.

autre petite question : comment transformer ma colonne excel avec des valeurs entrées par textbox (donc sous format texte) en format nombre ?

merci d'avance pour votre aide.

bonne journée à tous.

Hellodie45


3 réponses

Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 644
Bonjour,
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)
6
Merci

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

CCM 42674 internautes nous ont dit merci ce mois-ci

merci pour tes réponses.

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 ...
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 644
Oui je vois bien d'où vient le problème. En fait, lorsque tu effaces le contenu du TextBox, son "MaxLength" reste bloqué sur la valeur que l'on vient de lui affecter. Donc il faut dire à la macro : Si le nombre de caractère dans le TextBox est égal à 0 alors on "remets le MaxLength à 255". Soit :
Private Sub TextBox1_Change()
If Len(TextBox1) = 0 Then TextBox1.MaxLength = 255
If Right(TextBox1, 1) = "." Or Right(TextBox1, 1) = "," Then TextBox1.MaxLength = Len(TextBox1) + 2
End Sub
super ça fonctionne !!!

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 ...
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 644
comment dois-je faire pour éviter de recopier-coller le code 25 fois ? Tu ne peux pas. Tu dois en effet, jouer sur l'évènement change de chaque TextBox. Fais chauffer le copier/coller!!

euh ... de rien et à bientôt
merci pour tout !!!

bonne journée.
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
85
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
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 ...
salut svp comment je peut afficher deux chiffre apprés la vergule
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
85
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.
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
85
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
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 ...
Messages postés
666
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
85
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.
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