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
3 Réponses :
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>
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
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.
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.
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.