3
votes

Comment vérifier si une valeur saisie par un utilisateur dans Textbox est un double numérique?

J'essaie de vérifier si un utilisateur entre une valeur numérique dans une zone de texte, décimales acceptées. Toute aide est très appréciée.

Public Function IsValidKeyAscii(ByVal keyAscii As Integer, ByVal value As 
String) As Boolean
IsValidKeyAscii = (keyAscii = vbKeyDot And InStr(1, value, Chr$(vbKeyDot)) = 
0) Or (keyAscii >= vbKey0 And keyAscii <= vbKey9)
End Function

Private Sub textbox1_KeyDown(KeyCode As Integer, Shift As Integer)
If Not IsValidKeyAscii(KeyCode, textbox1.value) Then KeyCode = 0

End Sub

en utilisant l'événement BeforeUpdate:

Private Sub textbox1_BeforeUpdate(Cancel As Integer)
If IsNumeric(textbox1.Value) = False Then
    MsgBox "only numbers are allowed"
Me!textbox1.Undo
Cancel = True
Exit Sub
End If
Exit Sub

Mon code actuel ne s'exécute pas du tout. Je l'ai également essayé dans l'événement textbox1_BeforeUpdate. Veuillez consulter le code.

Nouveau code:

Private Sub textbox1_AfterUpdate()
If IsNumeric(textbox1.Value) = False Then
Me!textbox1.Undo
    MsgBox "only numbers are allowed"
Exit Sub
End If
Exit Sub


0 commentaires

3 Réponses :


0
votes

Vous pouvez essayer d'utiliser l'événement de focus perdu:

Private Sub TextBox1_LostFocus()
    Dim blnNumber As Boolean
    Dim strNumber As String

    strNumber = TextBox1.Value
    blnNumber = IsNumeric(strNumber)

    If Not blnNumber Then
        Me!TextBox1.Undo
        MsgBox "only numbers are allowed"
    Else
        'And, if you want to force a decimal.
        If InStr(strNumber, ".") < 1 Then
            Me!TextBox1.Undo
            MsgBox "only doubles are allowed"
        End If
    End If
End Sub

Vérifiez également l'élément Textbox1 que vous avez répertorié dans l'accès. Est-ce le nom TextBox1? ou autre chose? Par exemple, dans Excel, il est représenté comme suit: = EMBED ("Forms.TextBox.1", "") même si le nom auquel le code fait référence est TextBox1.

p>


0 commentaires

2
votes

Ecrivez une fonction de validation (qui peut être dans sa propre classe ou module KeyInputValidator ), afin de pouvoir réutiliser cette logique partout où vous en avez besoin, au lieu de la copier / coller pour chaque zone de texte numérique dont vous avez besoin:

    If Not IsValidKeyAscii(KeyCode, TextBox1.value) Then KeyCode = 0

Ensuite, utilisez-le dans le gestionnaire d'événements KeyPress des zones de texte (en supposant qu'il s'agit d'un contrôle de zone de texte MSForms ) pour déterminer s'il faut accepter l'entrée - puisque l'événement fournit un objet MSForms.ReturnInteger , la propriété Value de cet objet peut être définie sur 0 pour "avaler" une touche :

Private Sub TextBox1_KeyDown(KeyCode As Integer, Shift As Integer)

De cette façon, vous n'avez pas besoin d'annuler les entrées, ni d'afficher des avertissements ou des boîtes de message ennuyeux: la valeur dans le champ est garantie être une valeur numérique valide !


EDIT la signature du gestionnaire d'événements ci-dessus est pour un contrôle MSForms . On dirait qu'Access utilise une interface différente:

Private Sub TextBox1_KeyPress(ByVal keyAscii As MSForms.ReturnInteger)
    If Not IsValidKeyAscii(keyAscii.Value, TextBox1.value) Then keyAscii.Value = 0
End Sub

Ici, le KeyCode est passé ByRef , vous pouvez donc le modifier directement . En d'autres termes, cela devient la logique:

Option Explicit
Private Const vbKeyDot As Integer = 46

'@Description("returns true if specified keyAscii is a number, or if it's a dot and value doesn't already contain one")
Public Function IsValidKeyAscii(ByVal keyAscii As Integer, ByVal value As String) As Boolean
    IsValidKeyAscii = (keyAscii = vbKeyDot And InStr(1, value, Chr$(vbKeyDot)) = 0) Or (keyAscii >= vbKey0 And keyAscii <= vbKey9)
End Function


8 commentaires

Remarque: je ne suis pas familier avec Access - la réponse d'Erik devrait certainement être préférée dans ce cas.


@Mathieus, j'ai essayé votre code mais j'obtiens une erreur dans la ligne: "Private Sub TextBox1_KeyPress (ByVal keyAscii As MSForms.ReturnInteger)" Ai-je besoin d'une référence?


@WKI "en supposant qu'il s'agit d'un contrôle de zone de texte MSForms" - on dirait que ce n'est pas le cas alors. Je n'ai pas MS-Access pour tester quoi que ce soit, mais je peux vous assurer que ce code fonctionne parfaitement avec un UserForm ... Je suppose que vous avez un formulaire Access, qui semble utiliser un autre type de contrôles. Vérifiez s'il existe un événement KeyDown ou KeyPress qui peut être géré de la même manière.


@WKI une recherche rapide a montré qu'il semble que les zones de texte Access-forms do ont un événement KeyDown , juste une signature différente. Voir modifier.


Il y a un KeyDown même Laissez-moi essayer et voir!


Je pense que j'y arrive? Code ajouté. Existe-t-il un moyen d'activer dotKey, Backkey et EnterKey?


Je ne pense pas que le retour arrière ou la saisie de clés déclenchent un événement KeyDown (s'ils le font, alors vbKeyBack (ascii 8) et vbKeyReturn (ascii 13) le ferait). Vous pourriez avoir besoin d'une combinaison de gestionnaires KeyDown et Change pour les gérer, et cela devient assez vite compliqué. Notez que le vbKeyDot (ascii 46) est déclaré manuellement ici. Placez un point d'arrêt (F9) dans le gestionnaire d'événements, voyez si le point d'arrêt est atteint lorsque vous appuyez sur telle ou telle touche, regardez la valeur du KeyCode , modifiez la procédure ou la logique de validation en conséquence.


Je vois. Merci pour votre aide.



3
votes

Vous ne devriez pas du tout utiliser VBA pour cette tâche.

Définissez simplement la propriété de format de champ sur Numéro général . C'est le moyen intégré de garantir que les utilisateurs ne peuvent saisir que des chiffres dans un champ.


4 commentaires

Agréable! Je pense que je devrais probablement éviter les questions Access (ou commencer à jouer avec)


@MathieuGuindon S'il vous plaît ne le faites pas. Les questions peuvent avoir de nombreuses réponses, et les vôtres peuvent enseigner à OP une leçon précieuse sur l’autorisation de certains caractères dans un champ. Le mien enseigne simplement à OP d'éviter VBA pour une simple validation d'entrée (Access a beaucoup de fonctionnalités non VBA pour valider l'entrée).


@Erik J'ai mis la validation sur la table, mais les utilisateurs se sont plaints qu'il devrait y avoir un moyen d'annuler le changement. Actuellement, ils ne peuvent le faire qu'en utilisant le bouton Echap, mais ils n'ont généralement aucune idée à quoi sert le bouton Echap.


@WKI Si vous avez une règle de mise en forme ou de validation sur le champ (comme définir le format sur Numéro général ), ce sont des informations très pertinentes pour la question. Cela expliquerait pourquoi votre code ne se déclencherait pas, les règles de validation sont évaluées avant le déclenchement de l'événement BeforeUpdate . Vous pouvez envisager de supprimer la règle de validation sur le contrôle, mais pas sur la table, pour permettre à votre code de fonctionner.