Dans un textbox, limiter le nombre de decimal

beberw Messages postés 5 Date d'inscription samedi 16 septembre 2006 Statut Membre Dernière intervention 11 octobre 2006 - 1 oct. 2006 à 14:59
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007 - 1 oct. 2006 à 18:46
j'utilise cette fonction pour limiter en nombre numerique, entier, positif emprunté sur ce site
et je voudrais savoir s'il y a moyen de l'évoluer?
je voudrais inserer dans ce module deux fonctions:
- limiter à ( x) decimal apres la virgule
- remplacer le . par la virgule (ou vice versa suivant le parametre regional de Windows si possible)

Dans la forme
Private Sub .......Text1_KeyPress(index As Integer, KeyAscii As Integer)   If KeyAscii 46 Then KeyAscii 44          'transforme le point par la virgule
   If Not Controler_KeyPress_Ok(KeyAscii, .......Text1(index), True, False) Then
   KeyAscii = 0
   Beep
End If
End Sub

Dans le module
"
' Parametres:
' - KeyAscii     ->  caracteres saisies par l'utilisateur (code Ascii)
' - Est_Positif  ->  Si true n'accepte que des valeurs superieurs ou égales à 0, Si false accepte des valeurs positives ou négatives
' - Est_Entier   ->  Si true n'accepte que des entiers, Si false accepte des valeurs avec virgules
' - Txtbox       ->  control textbox oú l'utilisateur saisie des caracteres

Public Function Controler_KeyPress_Ok(ByVal KeyAscii As Integer, ByVal Txtbox As TextBox, ByVal Est_Positif As Boolean, ByVal Est_Entier As Boolean) As Boolean
      
   Select Case KeyAscii
      ' 48 to 57 => 0 à 9 ;  8 => Backspace ;  13 => Enter ; 3 => Ctrl+C (copier) ; 22 => Ctrl+V (coller) ; 24 => Ctrl+X (couper)
      Case 48 To 57, 8, 13, 3, 22, 24:
         Controler_KeyPress_Ok = True
     
     
      ' 44 => , (virgule) ;  46  => . (point)
     
 
      Case 44, 46:
         If Est_Entier Then    ' si c'est un entier...
            Controler_KeyPress_Ok = False  ' ... on annule la virgule ou le point
         Else                  ' sinon...
                        Controler_KeyPress_Ok InStr(Txtbox.Text, ".") 0 And InStr(Txtbox.Text, ",") = 0   ' ... on annule la virgule ou le point seulement si le caractere est deja present dans le texte
       
         End If
     
      ' 45 => - (signe moins)
      Case 45:
         If Est_Positif Then  ' si c'est un positif...
            Controler_KeyPress_Ok = False                 ' ... on annule le signe moins
         Else                 ' sinon...            Controler_KeyPress_Ok InStr(Txtbox.Text, "-") 0 And Txtbox.SelStart = 0 ' ... on annule le signe moins seulement si il est deja present dans le texte et s'il n'est pas le premier caractere du texte
         End If
     
      ' caracteres non valides
      Case Else:
         Controler_KeyPress_Ok = False
   End Select

  
   ' Si caractere valide et si on permet des nombres negatifs ...
   If Controler_KeyPress_Ok And Not Est_Positif Then
      '... alors on annule le caractere s'il est placé devant un signe moins      If Txtbox.SelStart 0 And InStr(Txtbox.Text, "-") Then Controler_KeyPress_Ok False
   End If
End Function "

1 réponse

Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
1 oct. 2006 à 18:46
Salut, voilà un bout de code que j'utilise pour contrôler la saisie de nombres en Currency, je pense que tu sauras l'adapter, en tous cas, le nombre de décimales y est fixé à 2, pour ce que j'ai pris comme dépasement de capacité, je te laisse le modifier comme bon te semble. Il manque seulement la possibilité de saisir un signe "-" ou "+".

'dans un module au niveau général
Public separateurdecimal As String


Public Function Ctrl_Saisie(tbx As TextBox, v As Integer) As Integer
  If v > 31 And (v < 48 Or v > 57) And v <> 44 And v <> 46 Then
    v = 0
  End If
  If v = 44 Then    If separateurdecimal "." Then v 46
    If InStr(tbx.Text, separateurdecimal) > 0 Then v = 0
  ElseIf v = 46 Then    If separateurdecimal "," Then v 44
    If InStr(tbx.Text, separateurdecimal) > 0 Then v = 0
  End If
  Ctrl_Saisie = v
End Function


'dans la sub Main de ton module ou dans le Load de ta form principale
  If InStr(CStr(3 / 2), ".") Then
    separateurdecimal = "."
  Else
    separateurdecimal = ","
  End If

'dans l'évènement Keypress de ta Textbox (ici c'est Text1 - à remplacer par le nom de ta textbox)
Private Sub Text1_KeyPress(KeyAscii As Integer)
  KeyAscii = Ctrl_Saisie(Text1, KeyAscii)
  If KeyAscii <> 0 Then
    If InStr(Text1.Text, separateurdecimal) > 0 Then
      If Len(Text1) > 16 Then
        MsgBox "La capacité maximale est de : 99 999 999 999 999,99", vbCritical, "Dépassement de capacité"
        KeyAscii = 0
      End If
      If Len(Text1.Text) - InStr(Text1.Text, separateurdecimal) > 1 Then
        MsgBox "Veuillez saisir 2 décimales seulement.", vbCritical, "Dépassement de capacité"
        KeyAscii = 0
      End If
    Else
      If Len(Text1.Text) > 13 And KeyAscii <> Asc(separateurdecimal) Then
        MsgBox "La capacité maximale est de : 99 999 999 999 999,99", vbCritical, "Dépassement de capacité"
        KeyAscii = 0
      End If
    End If
  End If
End Sub


 
0
Rejoignez-nous