Textbox 2 décimales, négatif+gestion séparateur decimal

Bonjour ,

J'ai besoin d'aide pour la problématique suivante.

J'ai trouvé pas mal de solutions mais je n'ai pas su adapter à mon cas.

je voudrais saisir dans une textbox des nombres relatifs entiers ou décimaux.

  • Si nombre négatif doit être unique et au début
  • ne pouvoir insérer qu'une seule fois le séparateur de décimales (point ou virgule)
  • uniquement 2 chiffres après le séparateur de décimales

Le code ci-dessous fonctionne mais il est incomplet.

J'ai ajouté le signe '-' avec les nombres mais ne fonctionne pas (InStr("1234567890-", strpass) .

c-à-d le signe moins ne s'inscrit pas.

Option Explicit
'''pour gestion saisie numerique textbox'''''''''''''''''''''''''''''''''
Const entrees_decimales_permises = "-.,0123456789" & vbCr & vbBack      '
Const entrees_entieres_permises = "0123456789" & vbCr & vbBack          '
Const Point = "."                                                       '
Const Virgule = ","
Const Moins = "-"
Private Function ChainePasOK(strpass As String) As Boolean
    If strpass = "" Then Exit Function
    If Len(Replace(strpass, ".", "")) <> Len(strpass) Then ChainePasOK = True: Exit Function
    If Len(strpass) = 1 And InStr("1234567890", strpass) = 0 Then ChainePasOK = True: Exit Function
    strpass = Replace(strpass, ",", ".")
    If Len(CStr(Val(strpass))) <> Len(strpass) Then ChainePasOK = True
End Function
'-----DECIMAL----------------------------------------------------------------------------------------
Private Sub textbox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   Dim Pos As Long

   If KeyAscii = Asc(Point) Then
      If InStr(TextBox1, Virgule) = 0 Then
         KeyAscii = Asc(Virgule)
      Else
         KeyAscii = 0: Beep
      End If

   ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then        '1
      KeyAscii = 0: Beep

   ElseIf InStr(TextBox1, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
   ElseIf InStr(TextBox1, Moins) > 0 And KeyAscii = Asc(Moins) Then

      KeyAscii = 0: Beep

   ElseIf InStr(TextBox1, Virgule) > 0 Then
      Pos = InStr(TextBox1.Text, Virgule)
      If Len(TextBox1.Text) = Pos + 2 Then
         TextBox1.Text = Left$(TextBox1.Text, Len(TextBox1.Text) - 1): Beep
      End If
   End If

   If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
End Sub

En vous remerciant par avance.

Bon week-end

Edit: Merci beaucoup mais j'ai trouvé la solution. (code corrigé)

Bonjour

pour les chiffres avec virgule

a voir

A+

Maurice

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'TRANSFORMER LE POINT PAR UNE VIRGULE
 If KeyAscii = 46 Then KeyAscii = 44
'ACCEPTER UNIQUEMENT UNE SEULE VIRGULE ET LES CHIFFRES ENTRE 0 ET 9
If InStr("1234567890,", Chr(KeyAscii)) = 0 Or TextBox1.SelStart > 0 And Chr(KeyAscii) = "-" _
    Or InStr(TextBox1.Value, ",") <> 0 And Chr(KeyAscii) = "," Then KeyAscii = 0: Beep
End Sub

Bonsoir Archer ,

Merci beaucoup, mais on peut insérer plusieurs moins et virgule.

Je suis parvenu à corriger le code du post#1, cependant j'ai encore un problème.

Il se trouve que j'ai une autre textbox qui ne doit accepter que des nombres positif (2 chiffres après la virgule).

Merci beaucoup.

edit: désolé j'ai mal testé ton code. En fait on ne peut saisir que des nombres positifs, c'est ce que je cherche à obtenir. Mais comment limiter les décimales à 2 chiffres seulement.

Merci

Bonjour toutes et tous

coucou Archer

@Cp4

à tester :

textbox1.value = round(val(textbox1.value) , 2)

vu ici merci à Dan & Line31

crdlt,

André

Bonsoir Andre13 ,

Merci beaucoup, je suis preneur de toute proposition.

J'ai trouvé une solution ci-dessous

Private Sub textbox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   Dim Pos As Long

''TRANSFORMER LE POINT PAR UNE VIRGULE
 If KeyAscii = 46 Then KeyAscii = 44
''ACCEPTER UNIQUEMENT UNE SEULE VIRGULE ET LES CHIFFRES ENTRE 0 ET 9
If InStr("1234567890,", Chr(KeyAscii)) = 0 Or TextBox2.SelStart > 0 And Chr(KeyAscii) = "-" _
    Or InStr(TextBox2.Value, ",") <> 0 And Chr(KeyAscii) = "," Then KeyAscii = 0: Beep
''''''limite nombre decimales
If InStr(TextBox2, Virgule) > 0 Then
      Pos = InStr(TextBox2.Text, Virgule)
      If Len(TextBox2.Text) = Pos + 2 Then
         TextBox2.Text = Left$(TextBox2.Text, Len(TextBox2.Text) - 1): Beep
      End If
   End If
End Sub

Bonne soirée

bonjour andre

hum le val ne prend pas la virgule il faut mettre Cdbl HI

A+

Maurice

Re,

Merci pour l'info Archer avec le 'Val'

super Cp4 ^^

merci bonne fin de soirée à toi également et à toutes et à tous

Bonsoir a tous

au plus simple

A+

Maurice

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    TextBox1.Value = Round(CDbl(TextBox1.Value), 2)
End Sub

Bonjour Archer ,

Merci beaucoup. Désolé pour mon retard, j'étais un peu malade.

Bonne journée.

Rechercher des sujets similaires à "textbox decimales negatif gestion separateur decimal"