Formater un textbox (n'accepter que des chiffres)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 656 fois - Téléchargée 59 fois

Contenu du snippet

Dans VB, le contrôle ListBox ne possède pas de propriété Format (dommage!).
Si l'on veut que ce contrôle n'accepte que des entrées numériques, il faut jouer sur l'événement 'Change' du contrôle. On peut aussi utiliser le contrôle Masked Edit Control de Microsoft (MSMASK32.OCX)... Mais j'aime pas trop les OCX !
Je propose ici une méthode via API pour formater un TextBox qui n'acceptera que des entrées numériques... (A coller dans un module)

Source / Exemple :


'DECLARATION API
Public Declare Function GetWindowLong Lib "user32" _
   Alias "GetWindowLongA" _
   (ByVal hwnd As Long, _
    ByVal nIndex As Long) As Long

Public Declare Function SetWindowLong Lib "user32" _
    Alias "SetWindowLongA" _
    (ByVal hwnd As Long, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long

'DECLARATION CONSTANTES
Public Const GWL_STYLE As Long = -16&
Public Const ES_NUMBER = &H2000&

Public Sub SetNumber(NumberText As TextBox, Flag As Boolean)
    Dim curstyle As Long, newstyle As Long

    'Récupère le style
    curstyle = GetWindowLong(NumberText.hwnd, GWL_STYLE)

    If Flag Then
       curstyle = curstyle Or ES_NUMBER
    Else
       curstyle = curstyle And (Not ES_NUMBER)
    End If

    'Attribue le nouveau style
    newstyle = SetWindowLong(NumberText.hwnd, GWL_STYLE, curstyle)
    'Rafraîchi
    NumberText.Refresh
End Sub

Conclusion :


Utilisation:
'Appliquer le format numérique
SetNumber Me.MonTextBox, True
'Enlever le format numérique
SetNumber Me.MonTextBox, False

A voir également

Ajouter un commentaire Commentaires
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
Superbe, dommage que la virgule ne puisse être autorisée !
Messages postés
62
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
4 août 2004

Un peu trop long ikariShinji, pour les virugles on peut faire plus court. En se basant sur cette astuce trouvé ici http://www.vbfrance.com/code.aspx?ID=1217

-----
Private Sub txtBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 46, 44 ' 46 -> . | 44 -> ,
If InStr(txtBox.Text, ",") > 0 Or InStr(txtBox.Text, ".") > 0 Then KeyAscii = 0
Case Else
If Not Chr(KeyAscii) Like "[0-9,.]" And KeyAscii <> Asc(vbBack) Then KeyAscii = 0
End Select
End Sub
-----
Messages postés
3
Date d'inscription
mercredi 20 décembre 2000
Statut
Membre
Dernière intervention
19 avril 2002

Je vous invite à voir l'article http://www.vbfrance.com/article.asp?Val=640
Messages postés
18
Date d'inscription
mercredi 13 mars 2002
Statut
Membre
Dernière intervention
2 juin 2005

Merci à toi Néo.balastik pour ce code bien pratique !

Toutefois, ton code empêche du coup la saisie d'un nombre à virgule, voici une solution simple pour régler le problème :

Dim SvgVirgule As Boolean

Private Sub Form_Load()
SetNumber txtBox, True
SvgVirgule = False
End Sub

Private Sub txtBox_KeyPress(KeyAscii As Integer)

' on empêche de saisir une virgule dans un TextBox vide
If txtBox.Text = "" Then
SvgVirgule = False
Exit Sub
End If

' si on supprime la virgule, on doit pouvoir en remettre une
If KeyAscii = 8 Then
If Right(txtBox.Text, 1) "," Then SvgVirgule False
End If

' on vérifie qu'il n'y a pas déjà une virgule
If KeyAscii 46 Or KeyAscii 44 Then
If SvgVirgule = True Then Exit Sub
End If

' si c un point, on le convertit en virgule
If KeyAscii 46 Then KeyAscii 44

' si c une virgule, on la met
If KeyAscii = 44 Then
SetNumber txtBox, False
SvgVirgule = True
End If
End Sub

Private Sub txtBox_KeyUp(KeyCode As Integer, Shift As Integer)
SetNumber txtBox, True
End Sub

( Vous trouverez bientôt une petite application de ce code - convertisseur Euro/Francs - sur mon site )
Messages postés
55
Date d'inscription
vendredi 29 juin 2001
Statut
Membre
Dernière intervention
2 février 2002

sinon ya plus bourrin mais tout autant efficace:

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode < 96 Or KeyCode > 105 And KeyCode <> vbKeyDecimal Then
Text1 = Mid(Text1, 1, Len(Text1) - 1)
Text1.SelStart = Len(Text1)
End If
End Sub

C bof, mais pour ceux qu'on pas envie de se casser le cul ca peut marcher.
REMARQUE: ca marche pas avec les copiers collés
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.