Limiter saisie deux chiffres après la virgule

Résolu/Fermé
Hellodie45 - 17 mai 2010 à 09:48
 SANA - 13 mai 2015 à 00:30
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

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 :
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 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 ...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
17 mai 2010 à 11:03
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
0
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 ...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
17 mai 2010 à 11:25
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
0
merci pour tout !!!

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