Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Parcourir les contrôles d'un formulaire
Lorsque des traitements groupés sont à entreprendre sur les
contrôles d'un
formulaire Access, il est intéressant et important de pouvoir
optimiser le code, afin d'éviter de devoir régler les propriétés de chacun à énumérer par les noms respectifs. Ce principe est d'autant plus vrai que le
formulaire fourmille de
contrôles objets. C'est la raison pour laquelle, cette nouvelle
astuce Access tient à démontrer comment
parcourir tous les objets d'un formulaire. Et nous allons le voir, parmi ces objets, il est possible d'isoler seulement un
groupe du même type pour impacter leurs propriétés sans influer sur les autres.
Base de données Access à télécharger
Pour la construction de ce petit
code VBA Access, nous suggérons d'appuyer l'étude sur une
base de données hébergeant un
formulaire avec plusieurs contrôles à régler ensemble.
Sur la gauche de l'écran, le
volet de navigation indique que cette
base de données est constituée d'une
table, d'une
requête et d'un
formulaire.
Le formulaire d'inscription
Si vous double-cliquez sur le
formulaire F_Inscription, vous l'affichez en mode exécution.
Ce
formulaire d'inscription est tout à fait fonctionnel. Si vous renseignez tous les champs et que vous cliquez sur le
bouton Valider, les informations sont insérées dans la
table Utilisateurs. Nous l'avons conçu à l'occasion d'une
astuce Access. Il s'appuie uniquement sur des
actions de macro. Aucun
code VBA n'est interpelé. En
mode création, si vous cliquez sur le
bouton Valider pour le sélectionner, si vous activez l'
onglet Evénement de sa
feuille de propriétés et que vous cliquez sur le bouton associé à son
événement Au clic, vous affichez les
actions de macro qui lui sont associées.
Plusieurs traitements et tests sont entrepris. Mais au milieu de tout cela, c'est la
requête R_Inscription qui est exécutée. Elle réceptionne les informations saisies dans les
champs du formulaire pour les insérer dans la table source, la
table Utilisateurs.
Réinitialiser les champs du formulaire
En bas à droite du
formulaire, vous notez la présence d'un
bouton intitulé
Réinitialiser. Sa vocation est de
vider les zones de saisie mais aussi le potentiel choix émis sur la civilité avec la
liste déroulante. Le principe ne semble pas fort utile. Certes dans cette démonstration, il s'agit d'un prétexte pour
parcourir des contrôles spécifiques sur un
formulaire Access par le
code VBA.
- Fermer l'éditeur de macro si vous l'aviez ouvert,
- Dans le volet de navigation, cliquer droit sur le formulaire F_Inscription,
- Dans le menu contextuel, choisir de l'ouvrir en mode Création,
- Sur le formulaire en conception, cliquer sur le bouton Réinitialiser pour le sélectionner,
- Puis, activer l'onglet Evénement de sa feuille de propriétés,
Elle est généralement placée sur la droite de l'interface. Si vous ne la visualisez pas, vous pouvez la rendre disponible en cliquant sur le
bouton Feuille de propriétés dans le
ruban Conception de formulaires ou
Création selon les versions.
- Cliquer sur le bouton placé à droite de son événement Au Clic,
- Dans la boîte de dialogue qui suit, choisir le générateur de code et valider par Ok,
Nous basculons ainsi dans l'
éditeur VBA Access entre les bornes de la
procédure événementielle Reinitialiser_Click. Son code se déclenchera au clic sur le bouton. Sa vocation est de réinitialiser les zones de saisie :
Private Sub Reinitialiser_Click()
End Sub
Déclarer la variable Objet
C'est désormais d'une
boucle For Each dont nous avons besoin pour passer en revue tous les
contrôles hébergés par le
formulaire. Et comme vous le savez dans ce type de
boucle, l'objet à gauche de l'expression doit être du même type que la collection d'objets à analyser, à placer à droite de l'expression. Dans un premier temps, nous avons donc besoin de
déclarer une variable objet de
type Control au sens large. Elle peut représenter une zone de texte aussi bien qu'une liste déroulante, un bouton ou une case à cocher par exemple. A nous de définir le type pendant l'analyse.
Remarque : Nous pourrions réaliser cette prouesse avec une
macro Access et nous l'avons déjà fait grâce à l'
action DéfinirPropriétés. Mais nous serions obligés de l'exploiter autant de fois que des zones à réinitialiser se présentent. Avec le
VBA Access, un même code optimisé peut traiter quelques unités comme quelques centaines de contrôles.
- Dans les bornes de la procédure, ajouter la déclaration de variable suivante :
Private Sub Reinitialiser_Click()
Dim controle As Control
End Sub
Analyser tous les contrôles du formulaire
C'est grâce à cette variable que nous allons maintenant pouvoir entreprendre le
traitement récursif consistant à passer en revue
tous les contrôles du formulaire tour à tour.
- Sous la déclaration de variable, construire la boucle For Each suivante :
...
For Each controle In Me.Controls
Next controle
...
L'
objet Me désigne l'objet actif au moment de l'appel. Il s'agit donc du
formulaire lui-même. Sa
propriété Controls renvoie la
collection des contrôles qu'il héberge quels que soient leurs types. Et donc, grâce à la
boucle For Each et à la
variable controle, nous les passons tous en revue.
Tester le type de contrôle
Désormais et nous l'avons annoncé, nous devons
réinitialiser le formulaire en
vidant les zones de texte de leurs contenus. Il en va de même concernant la valeur mémorisée par le choix dans la liste déroulante. C'est la
propriété Value en
VBA qui permet d'atteindre le contenu de ces objets. Mais cette
propriété n'existe pas pour tous les contrôles, comme pour les
boutons par exemple. Tous les contrôles passés en revue ne peuvent donc pas être traités de la même façon au risque de faire planter le code. C'est la raison pour laquelle nous proposons de
tester le type de
chaque contrôle passé en revue afin d'exclure ceux qui ne sont pas désirés. Et pour cela, nous avons besoin d'une
instruction conditionnelle.
- Dans les bornes de la boucle, ajouter le test suivant :
...
If controle.ControlType = acTextBox Or controle.ControlType = acComboBox Then
controle.Value = ""
End If
...
C'est donc la
propriété ControlType d'un objet de
type Control qui permet d'obtenir l'information sur la nature de l'élément pointé. Avec les valeurs respectives
acTextBox et
acComboBox, nous nous assurons que l'objet en cours d'analyse par la boucle est soit une zone de texte, soit une zone de liste déroulante. Si la condition est vérifiée, nous vidons le contenu de chaque zone ainsi acceptée (="").
Pour finir, il convient de libérer les ressources. Comme vous le savez, chaque objet déclaré et initialisé, doit être détruit à l'issue.
- Après la boucle, ajouter l'instruction VBA suivante :
Set controle = Nothing
Grâce au
mot clé Set, nous entreprenons la réaffectation de la
variable objet controle. En la réinitialisant à Nothing, nous la détruisons. Donc, nous libérons les ressources utilisées en mémoire.
Vider les contrôles au clic
Il est maintenant temps de tester ce processus de réinitialisation avec optimisation du code, grâce à cette
boucle For Each pour
parcourir tous les contrôles du
formulaire Access.
- Enregistrer les modifications (CTRL + S) puis basculer sur le formulaire Access (ALT + Tab),
- L'enregistrer à son tour puis l'exécuter avec la touche F5 du clavier,
- Choisir une civilité avec la liste déroulante,
- Renseigner un nom et un prénom avec les deux zones de texte qui suivent,
- Inscrire un identifiant composé de 6 chiffres comme : 586523,
- Puis, taper un mot de passe alphanumérique de 5 caractères comme : atr88,
- Dès lors, cliquer sur le bouton Réinitialiser,
Instantanément et comme vous pouvez l'apprécier, le
formulaire est complètement vidé des informations saisies. Ces manipulations étaient un prétexte pour démontrer comment
parcourir tous les contrôles d'un formulaire Access avec un
code optimisé en VBA. En effet, ce code serait strictement identique même si le
formulaire hébergeait des dizaines et des dizaines de contrôles de ce type.