Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Tester la saisie de lettres
Grâce aux
expressions régulières, le
code VBA Access est capable de vérifier les saisies de l'utilisateur de façon chirurgicale. Ces techniques s'avèrent précieuses sur tout type de
formulaire attendant des informations précises.
Sur l'exemple illustré par la capture, nous débutons simplement dans ce premier volet sur les
expressions régulières. Dans la première zone de texte, dès que l'utilisateur inscrit des
chiffres au milieu des lettres, sa saisie est sanctionnée par un message de refus. En revanche, s'il la corrige en supprimant les chiffres, sa saisie est accueillie par un message de conformité. Et c'est une
fonction VBA qui scrute automatiquement la zone de texte.
Base de données Access à télécharger
Pour la démonstration de cette nouvelle
astuce Access, nous suggérons d'appuyer l'étude sur une
base de données hébergeant ce
formulaire avec ces
zones de texte.
Trois zones de texte vierges sont proposées. Dans ce premier volet, nous allons concentrer l'étude sur la première. Elle ne doit accepter que des
lettres. Bien sûr à ce stade, le
formulaire ne réagit pas encore aux inscriptions.
La fonction de vérification
Pour que la saisie soit vérifiée en temps réel, nous proposons de créer une
fonction que nous connecterons ensuite à la
zone de texte à scruter. Et cette
fonction, si elle est
publique, pourra être utilisée par n'importe quel
formulaire de l'application. C'est la raison pour laquelle, nous allons la créer dans un
module indépendant.
- En haut de la fenêtre Access, cliquer sur l'onglet Créer pour activer son ruban,
- Tout à fait à droite du ruban, cliquer sur le bouton Module,
Nous basculons ainsi dans l'
éditeur VBA Access dans une page de code vierge, effectivement associée à un
module indépendant, comme en atteste l'
explorateur de projet sur la gauche de l'écran.
- Dans cette feuille de code, créer la fonction estLettres comme suit :
Option Compare Database
Public Function estLettres(saisie As Variant) As String
End Function
C'est une
fonction de
type String puisqu'elle doit retourner des informations textuelles, Ã inscrire dans des zones de saisie du formulaire. Le
paramètre saisie correspond à la donnée inscrite dans la zone de texte à scruter par la fonction. Il est typé comme un Variant car rien n'indique que la donnée est un texte.
L'objet d'expression régulière
Pour exploiter les propriétés et méthodes associées aux
expressions régulières, nous devons créer un objet classique dans un premier temps. Mais en instanciant ensuite la
classe RegExp, il héritera des pouvoirs pour manipuler ces chaînes aux séquences remarquables.
- Dans les bornes de la fonction, ajouter la déclaration suivante :
...
Dim expReg As Object
...
Si la saisie n'est pas nulle
Avant d'entrer dans le vif du sujet, nous devons enclencher le
traitement de la fonction, si et seulement si des caractères ont bien été tapés dans la zone de texte. Ce n'est pas le cas par exemple au premier chargement du formulaire ou encore si l'utilisateur décide d'effacer sa saisie.
- A la suite du code, ajouter le test suivant :
...
If IsNull(saisie) = False Then
Else
estLettres = ""
End If
...
C'est donc une
instruction conditionnelle exploitant la
fonction IsNull qui permet de savoir si le contenu de la zone de saisie n'est pas vide.
Dans le cas contraire, nous affectons le nom de la fonction à une chaîne vide (""). Comme vous le savez en effet en
VBA, le résultat du traitement d'une fonction est retourné par le nom de la fonction elle-même. De la sorte, nous ne donnons aucune indication en regard de la zone de texte scrutée quand il n'y a rien à dire.
La classe des expressions régulières
Désormais, nous allons pouvoir
instancier la classe des
expressions régulières grâce à la
fonction VBA CreateObject.
- Dans la première branche de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
If IsNull(saisie) = False Then
Set expReg = CreateObject("VBScript.RegExp")
expReg.Pattern = "^[a-z A-Z]+$"
Else
...
Nous initialisons notre variable objet (Set) en instanciant (CreateObject) la classe des expressions régulières (VBScript.RegExp). Dans l'enchaînement, nous sommes d'ores et déjà en mesure d'exploiter ses propriétés et méthodes avec la
propriété Pattern qui permet de définir la séquence remarquable acceptée à la saisie. Entre crochets, nous indiquons que seules les
lettres de l'alphabet, qu'elles soient en majuscules ou minuscules, sont autorisées, sans oublier l'espace au milieu. Le
symbole + indique que cette inscription est susceptible de se répéter une ou plusieurs fois. L'accent circonflexe (^) détermine que la saisie doit ainsi débuter, soit par des
lettres et le dollar ($) que c'est ainsi qu'elle doit se terminer, soit par des
lettres. En d'autres termes, les chiffres et tout ce qui ne correspond pas à une lettre de l'alphabet ou à un espace, est proscrit.
Tester la saisie
Ensuite, c'est une
méthode précise qui permet de confronter la saisie de l'utilisateur avec la séquence remarquable définie par la
propriété Pattern de l'
expression régulière. Cette méthode se nomme
Test.
- A la suite du code de la branche du If, ajouter les instructions suivantes :
...
If (expReg.Test(saisie)) Then
estLettres = "Saisie acceptée."
Else
estLettres = "* Saisie refusée. Seules les lettres sont acceptées."
End If
...
Nous passons l'inscription de l'utilisateur à la
méthode Test par le biais du paramètre transmis à la fonction (saisie), soit les caractères tapés dans la zone à scruter. Si elle répond favorablement (True), nous affichons un message de succès. Dans le cas contraire (Else), nous refusons la saisie par un message sans équivoque.
Contrôler la saisie avec la fonction
Le
code de la fonction est terminé certes et vous en conviendrez, il est très simple. Mais pour l'instant, à aucun moment nous ne l'exploitons pour scruter les caractères frappés par l'utilisateur dans la première zone de texte du formulaire. Il est maintenant question d'établir la liaison.
- Enregistrer les modifications (CTRL + S) et revenir sur le formulaire en exécution (ALT + Tab),
- En haut de la fenêtre Access, cliquer sur l'onglet Accueil pour activer son ruban,
- A gauche du ruban, cliquer alors sur la flèche du ruban Affichage,
- Dans les propositions, choisir le mode Création,
- Sur le formulaire, cliquer sur la zone de texte à droite de la première zone de saisie,
De cette manière, nous la sélectionnons. C'est elle qui doit guider l'utilisateur pour confirmer ou infirmer sa saisie.
- Activer alors l'onglet Données de sa feuille de propriétés,
- Puis, cliquer sur le petit bouton associé à sa propriété Source contrôle,
Cette action a pour effet de déclencher le
générateur d'expression.
- Dans la zone de saisie, inscrire l'expression suivante :
=estLettres([lettresSeules])
Nous appelons notre
fonction estLettres et nous la faisons agir sur la première zone de texte du formulaire qui est nommée
lettresSeules. Comme vous le savez, dans la
syntaxe Access, les noms de contrôles doivent être mentionnés entre crochets, comme ici.
- Cliquer sur le bouton Ok du générateur pour valider l'expression,
- Puis, enregistrer les modifications (CTRL + S),
- Dès lors, exécuter le formulaire par exemple avec la touche F5 du clavier,
- Dans la première zone, taper un texte avec des chiffres et valider avec la touche Tab,
Comme vous pouvez le voir, la fonction réagit instantanément et refuse l'inscription.
- Transformer la saisie précédente comme suit : ceci est un essai,
- Puis, valider par la touche Tab (Tabulation) du clavier,
Là encore, la fonction réagit parfaitement mais cette fois pour autoriser la saisie.
Il s'agit donc d'un moyen fort efficace pour contrôler l'intégrité des informations entrées sur un formulaire avant de les valider et de les insérer dans une table. Le code complet de la
fonction VBA que nous avons construite est le suivant :
Public Function estLettres(saisie As Variant) As String
Dim expReg As Object
If IsNull(saisie) = False Then
Set expReg = CreateObject("VBScript.RegExp")
expReg.Pattern = "^[a-z A-Z]+$"
If (expReg.Test(saisie)) Then
estLettres = "Saisie acceptée."
Else
estLettres = "* Saisie refusée. Seules les lettres sont acceptées."
End If
Else
estLettres = ""
End If
Set expReg = Nothing
End Function