Empecher de saisir des caracteres non numeriques dans un textbox (complet!)

Description

Voici la version "complete" d'une source que j'ai envoyée la semaine derniere

Cette fois le code prend en compte:
- les nombres negatifs ou positifs
- la virgule et le point
- le copier coller

Les instructions qui controlent la saisie de caracteres sont dans une fonction publique placée dans un module. Dans celle-ci, on peut indiquer en paramétre si on permet des nombres negatifs et si on permet la virgule.

Ainsi, chaque textbox d'un projet peut controler ses caracteres avec un minimun de code. De plus, cette structure facilite beaucoup les updates et la lecture de la source.

Le project complet contient:
- un module avec la fonction Controler_KeyPress_Ok
- une form avec deux textbox pour tester (l'un permettant la saisie d'entier positif, l'autre permettant la saisie de nombres réels)

Voici le contenu de la form:

Source / Exemple :


Option Explicit

' Premiere textbox: on controle la saisie de caracteres
' de maniere a ne permettre que des entiers positifs
Private Sub Text1_KeyPress(KeyAscii As Integer)
   ' Si caractere invalide on annule le caractere
   If Not Controler_KeyPress_Ok(KeyAscii, Text1, True, True) Then KeyAscii = 0
positifs
End Sub

' On controle le contenu de la textbox (Indispensable pour le copier-coller)
Private Sub Text1_Validate(Cancel As Boolean)
   If IsNumeric(Text1.Text) Then ' si valide...
      Text1.Text = Format(Text1.Text, "0.000") ' -> ...on aplique le format que le veut (si on en veut un)
   ElseIf Text1.Text <> "" Then
      Text1.Text = "" ' -> on pourrait mettre aussi Text2.Text = "0", ou ne rien mettre ...
      Cancel = True
      MsgBox "Nombre incorrect!", vbExclamation ' -> on peut mettre le msg que l'on veut si on en veut un
   End If
End Sub

'----------

' Deuxieme textbox: on controle la saisie de caracteres
' de maniere a ne permettre que des nombres réels
Private Sub Text2_KeyPress(KeyAscii As Integer)
   If Not Controler_KeyPress_Ok(KeyAscii, Text2, False, False) Then KeyAscii = 0
End Sub

' On controle le contenu de la textbox (Indispensable pour le copier-coller)
Private Sub Text2_Validate(Cancel As Boolean)
   If IsNumeric(Text2.Text) Then
      Text2.Text = Format(Text2.Text, "currency")
   ElseIf Text2.Text <> "" Then
      Text2.Text = "0"
      Cancel = True
      MsgBox "Nombre incorrect!", vbExclamation
   End If
End Sub

Conclusion :


Pour la fonction Controler_KeyPress_Ok voir le zip. Merci.

En ce qui concerne le copier-coller, le seul moyen que j'ai trouver est d'acouppler
a la fonction Controler_KeyPress_Ok, l'evenement 'Validate' d'un textbox

Certains pourraient suggerer de controler le contenu d'un copier-coller lors de l'evenement Keypress.
Mais l'utilisateur peut coller avec shift-insert qui ne declenche pas cet l'evenement, mais l'evenement KeyDown / KeyUp.

On pourrait alors controler le contenu d'un copier-coller lors de l'evenement KeyDown. Mais l'utilisateur peut aussi detourner ce test en utilisant le copier du menu contextuel d'un textbox en cliquant avec le bouton droit de la sourie, frustrant ainsi nos efforts.

Voila pourquoi l'utilisation des deux events:
- Keypress: pour controler la saisie de caracteres
- Validate: pour controler le contenu d'un textbox

Codes Sources

A voir également

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.