Arrondir directement la valeur d'une zone de texte

[Résolu]
Signaler
Messages postés
44
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
14 mars 2012
-
 Utilisateur anonyme -
Bonjour,

J'ai une question concernant la valeur d'une zone de texte.
J'ai paramétré ma zone de texte en key press. Cette zone n'autorise que des caractères numériques avec qu'un seul chiffre après la virgule. Voici le code :
....
If InStr("1234567890,", Chr(KeyAscii)) 0 Or InStr(Valeur.Value, ",") <> 0 And Chr(KeyAscii) "," Then
KeyAscii = 0:
End if
.....
J'aimerai que l'utilisateur ne puisse que saisir 2 chiffres après la virgule.
Comment puis je procéder?

Merci

16 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour,
Du bâclé car j'ai sommeil ===>>

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   nbdec = 2 '==============ici le nb de décimales admises
   pos = InStr(TextBox1.Text, ",")
   If pos > 0 And Chr(KeyAscii) "," Then KeyAscii 0: Exit Sub
   If Not IsNumeric(Chr(KeyAscii)) And Chr(KeyAscii) <> "," Then KeyAscii = 0: Exit Sub
   If pos = 0 Then Exit Sub
   If Len(Mid(TextBox1.Text & Chr(KeyAscii), pos + 1)) > nbdec Then KeyAscii = 0
 End Sub

Pour du plus mieux et plus complet dans le genre, voire le source de mon frère jumeau jmfmarques.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
14815
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 août 2021
156
Bonjour,

En utilisant Split peut être.

If ubound(Split(MaTxtBox.Text,","))>1 then
'Trop de ,
ElseIf ubound(Split(MaTxtBox.Text,","))=1 Then
If Len(Split(MaTxtBox.Text,",")(1))>2 Then
'Trop de chiffre
End If
End If


---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
44
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
14 mars 2012

Ok Merci Henry.

Par contre, c'est étonnant car quand je met que le nombre de chiffres après la virgule ne doit pas etre supérieur à 2, il m'autorise jusqu'à 4 décimales... Bizare..
Et quand je paramètre que le nombre de décimale ne doit pas être supérieur à 1, alors il m'autorise 2 décimales...

Tu as une idée sur ce bug???

Merci bcp
Messages postés
14815
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 août 2021
156
Bonjour,

Quel code utilises-tu ?
Quelles entrées (texte) as-tu testée ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site

Salut,

Alors reprenons la façon de faire de talined:
Pourquoi faire:
If InStr("1234567890,", Chr(KeyAscii)) 0 Or InStr(Valeur.Value, ",") <> 0 And Chr(KeyAscii) "," Then 
KeyAscii = 0: 
End if 

Alors que:
If InStr("1234567890,", Chr(KeyAscii)) 0 then keyscii 0

Suffit?
La seule contrainte c'est qu'on peux insérer plusieurs virgules...
Mais tout dépend si on reflechit à un format (par exemple) "1,255,25"



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
44
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
14 mars 2012

Acive :

Oui mais c'est cette contrainte d'une seule virgule que je veux insérer également...
c'est ca mon souci..

Nhenri : voici le code que j'ai utilisé directement dans une zone de texte :
.......
Private Sub ZT_Calcul_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If InStr("1234567890,", Chr(KeyAscii)) 0 Or InStr(ZT_calcul.Value, ",") <> 0 And Chr(KeyAscii) "," Then
KeyAscii = 0:
End If

'If UBound(Split(ZT_Calcul.Text, ",")) > 1 Then
KeyAscii = 0
If UBound(Split(ZT_Calcul.Text, ",")) = 1 Then
If Len(Split(ZT_Calcul.Text, ",")(1)) > 1 Then
KeyAscii = 0

End If
End If
................

Et la ca bloque bizarement à 2 décimales alors que je lui dis de bloquer la saisie au bout d'une décimale..
Messages postés
44
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
14 mars 2012

OK Merci bien, c'est presque parfait! :)

En fait, on peut insérer une virgule pour le premier caractère. Ca a l'air tout bete à résoudre mais quand j'écris que si la zone de texte = "," alors on efface, ca ne fait rien.

Je te laisse dormir..

Bonne soirée
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   nbdec = 2 '==============ici le nb de décimales admises
   pos = InStr(TextBox1.Text, ",")
   If pos > 0 And Chr(KeyAscii) "," Then KeyAscii 0: Exit Sub
   If Not IsNumeric(Chr(KeyAscii)) And Chr(KeyAscii) <> "," Then KeyAscii = 0: Exit Sub

   toto = TextBox1.Text & Chr(KeyAscii)
   If pos > 0 And Len(Mid(toto, pos + 1)) > nbdec Or toto "," Then KeyAscii 0
 End Sub


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
voilà encore une autre manière.
Celle-ci te protège en plus de copier/coller non conformes ===>>
Private Sub TextBox1_Change()
  Static anc As String
  nbdec = 2 '==============ici le nb de décimales admises
  pos = InStr(TextBox1.Text, ",")
  toto = TextBox1.Text
  If Not IsNumeric(toto) Or toto Like "*[A-z]*" Then
      If toto <> "" Then TextBox1.Text anc Else anc ""
  Else
    If pos > 0 Then
      If Len(Mid(toto, pos + 1)) > nbdec Then
        TextBox1.Text = anc
      Else
        anc = toto
      End If
    End If
  End If
End Sub





____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient

Ou tout bêtement:
Dim St As String
If InStr(1, TextBox1.Text, ",") > 0 Then
   St = "0123456789"
Else
   St = "0123456789,"
End If
If InStr(St, Chr(KeyAscii)) 0 Then keyscii 0

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Encore (en limitant les chiffres après la virgule):
Dim St As String
Dim Rt As Integer
Rt = InStr(1, TextBox1.Text, ",")
If Rt > 0 Then
   St = "0123456789"
Else
   St = "0123456789,"
End If
If (Rt > 0 And Len(TextBox1.Text) > Rt + 1) Or InStr(St, Chr(KeyAscii)) 0 Then KeyAscii 0



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
44
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
14 mars 2012

Merci beaucoup, c'est vrai qu'il est simple.

Je voudrais rajouter de ne pas autoriser la saisie de la virgule comme premier et seul caractère.
Je dois rajouter une variable ou je peux faire autrement?

Merci

If (Chr(KeyAscii) = "," And Len(Textbox1.Text) = 0) Or (Rt > 0 And Len(Textbox1.Text) > Rt + 1) Or InStr(St, Chr(KeyAscii)) = 0 Then KeyAscii = 0



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Et tu peux faire aussi:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1.Text = Format(TextBox1.Text, "### ###.00")
End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
44
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
14 mars 2012

D'accord merci beaucoup!

ET c'est possible d'utiliser ce dernier format pour paramétrer une date de la même maniere ( dans une zone de texte avec Keypress)?

Car j'ai tenté avec l'un de tes codes que tu m'avais donné mais je n'y arrive pas..

Encore merci acive

Pour les formats de dates regarde ce qu'ils disent chez MSDN DANS CE LIEN

Et puis il ne faudrait pas le faire à l'évènement keypress car à chaque touche appuyée il formate le texte, ça va gêner la saisie.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique