Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Lier des listes sur toutes les lignes
Cette nouvelle
astuce Access va démontrer comment
relier des listes déroulantes sur toutes les lignes d'un
formulaire, soit pour tous les
enregistrements.
Sur l'exemple illustré par la capture, nous travaillons sur un
formulaire tabulaire. Il énumère des idées de sorties. Ces idées sont catégorisées par département et par ville notamment. La seconde
liste déroulante ne propose que les villes du département mentionné par le biais de la première
liste déroulante. Et si vous changez de ligne, le contenu de la seconde
liste déroulante s'adapte automatiquement en fonction du département de la première liste.
Base de données source
Pour la démonstration de cette
astuce, nous proposons de récupérer une base offrant ces données à manipuler.
- Télécharger le fichier listes-deroulantes-liees.rar en cliquant sur ce lien,
- Le décompresser dans le dossier de votre choix,
- Double cliquer sur la base de données résultante pour l'ouvrir dans Access,
- Cliquer sur le bouton Activer le contenu du bandeau de sécurité,
- Dans le volet de navigation sur la gauche, double cliquer sur la table t_sorties,
Ainsi, nous affichons son contenu en
mode feuille de données. Vous pouvez constater que le
champ s_dep offre une
liste déroulante énumérant les départements disponibles. Cette
liste déroulante est proposée sur toutes les lignes de la
table. De la même façon, vous notez que le
champ s_Ville offre une
liste déroulante des villes. Mais à ce stade, son offre n'est pas celle des villes du département défini en amont pour l'
enregistrement en cours. Elle restitue toutes les villes recensées dans la table.
- A gauche du ruban Accueil, cliquer sur le bouton Affichage,
De cette manière, nous basculons dans la vue en conception de la
table t_sorties.
- Cliquer sur le champ s_dep pour le sélectionner,
- En bas de la fenêtre Access, cliquer sur l'onglet Liste de choix,
En consultant la
propriété Contenu, vous remarquez que cette
liste déroulante est remplie par la
requête R_dep qui est listée dans le volet de navigation.
Nous consulterons cette requête pour comprendre.
- Cliquer maintenant sur le champ s_Ville pour le sélectionner,
En consultant sa
propriété Contenu, vous notez que cette liste déroulante est nourrie par la
requête R_villes.
- Fermer la table t_sorties en cliquant sur la croix de son onglet,
- Dans le volet de navigation, cliquer droit sur la requête R_dep,
- Dans le menu contextuel, choisir le mode création,
Nous basculons ainsi dans la vue en conception de la
requête R_dep.
- Cliquer sur un emplacement vide, par exemple à côté de la table schématisée,
De cette manière, la
feuille de propriétés rappelle les propriétés générales de la
requête. Comme vous pouvez le voir, sa
propriété Valeurs distinctes est réglée à Oui. Et comme l'extraction est réalisée sur le
champ s_dep avec un
tri croissant, la
liste déroulante de la
table source ne restitue que les départements uniques dans l'ordre alphabétique.
- Fermer la requête en cliquant sur la croix de son onglet,
- Dans le volet de navigation, cliquer droit sur la requête R_villes,
- Dans le menu contextuel, choisir le mode création,
- Puis, cliquer sur un emplacement vide de la requête,
L'extraction est réalisée sur les
valeurs uniques et triées dans l'ordre croissant sur le champ des villes. Mais en l'absence de liaison avec le choix effectué sur le département par l'utilisateur, cette
requête ne peut adapter son offre. C'est la raison pour laquelle la
liste déroulante des villes reste pour l'instant figée sur la totalité des communes.
Liaison requête et formulaire
C'est sur le
formulaire que le département doit être choisi. Si vous double cliquez sur son nom (t_sorties) dans le volet de navigation, vous l'affichez en mode
formulaire.
A ce stade, il présente fort naturellement les mêmes symptômes que la
table. Les
listes déroulantes ne réagissent pas ensemble.
- Revenir dans la vue en conception de la requête R_villes,
- Dans la vue schématisée de la table, double cliquer sur le champ S_dep,
Nous l'ajoutons ainsi à la
grille de requête.
- Décocher sa case dans la zone Afficher,
Ce champ est en effet destiné à établir le critère de correspondance pour restreindre le choix des villes. Il n'est pas destiné à remplir la
liste déroulante.
- Cliquer droit dans la zone Critères de ce champ S_dep,
- Dans le menu contextuel, choisir la commande Créer,
De cette façon, nous affichons le
générateur d'expression. C'est grâce à lui que nous allons pouvoir établir la liaison entre le département pour l'enregistrement en cours sur le
formulaire et le département servant à filtrer sur la
requête.
- Dans la liste de gauche, déployer complètement l'arborescence des formulaires,
- Puis, cliquer sur le formulaire t_sorties pour le sélectionner,
- Dans la liste du centre, double cliquer sur le contrôle S_dep,
Cette action a pour effet d'établir la correspondance cherchée en témoigne la syntaxe retranscrite dans la partie supérieure du
générateur d'expression :
Formulaires![t_sorties]![s_dep]
Mais nous le savons, ce n'est pas pour autant que la liste des villes va réagir automatiquement.
- Cliquer sur le bouton Ok pour valider la syntaxe,
- Enregistrer la requête (CTRL + S) puis la fermer en cliquant sur la croix de son onglet.
Activer la liste déroulante
Pour que la
liste déroulante dépendante puisse désormais s'adapter au choix effectué dans la
liste parente, les
enregistrements de la requête que nous venons de construire doivent s'actualiser sur
événement. Pour que cet
événement puisse être géré, la
liste déroulante doit être activée. En d'autres termes, elle doit recevoir le
focus. Et c'est là que la principale astuce réside. Une zone de texte est activée par défaut lorsque son enregistrement est pointé. Nous allons donc exploiter celle du nom de l'activité pour passer le
focus à la
liste déroulante des villes.
- Dans le volet de navigation, cliquer droit sur le formulaire t_sorties,
- Dans le menu contextuel, choisir le mode création,
Nous basculons ainsi dans la vue en conception du
formulaire.
- Cliquer sur la zone de texte s_rs pour la sélectionner,
- Activer alors l'onglet Evénement de sa feuille de propriétés,
- Cliquer sur la ligne de son événement Sur réception focus pour l'activer,
Nous l'avons dit, cet événement se déclenche dès lors que l'enregistrement concerné est pointé ou cliqué.
- Cliquer sur le petit bouton situé à l'extrémité droite,
La boîte de dialogue du
choix du générateur apparaît.
- Sélectionner le générateur de code,
Rassurez-vous le
code VBA nécessaire pour cette astuce est trivial.
Nous nous retrouvons effectivement projetés dans l'
éditeur VBA Access, entre les bornes de la
procédure événementielle s_rs_GotFocus. Son
code se déclenchera Ã
réception du focus par la zone de texte.
- Entre les bornes de cette procédure, ajouter la ligne de code VBA suivante :
Private Sub s_rs_GotFocus()
s_Ville.SetFocus
End Sub
La
méthode SetFocus de l'
objet liste déroulante s_Ville permet d'activer cette dernière.
Actualiser la liste dépendante
Maintenant que la
liste déroulante des villes est explicitement désignée, nous allons pouvoir déclencher un code permettant d'actualiser ses données, ou plutôt celles de la
requête qui la remplit. Et ce code doit intervenir au moment où la
liste déroulante reçoit le focus. Puisque nous sommes dans l'
éditeur de code, nous proposons d'y rester pour enchaîner.
- En haut de la feuille de code, déployer la liste déroulante de gauche,
- Dans la liste des propositions, choisir l'objet s_Ville,
Cette action a pour effet de générer la
procédure événementielle s_Ville_BeforeUpdate. Ce n'est pas l'événement qui nous intéresse.
- Toujours en haut de la feuille de code, déployer la liste déroulante de droite,
- Parmi les événements suggérés, cliquer sur l'événement GotFocus,
C'est lui qui se déclenche quand la
liste déroulante est activée.
De cette manière, nous générons la
procédure événementielle s_Ville_GotFocus.
- Entre les bornes de cette procédure, ajouter la ligne de code VBA suivante :
Private Sub s_Ville_GotFocus()
s_Ville.Requery
End Sub
Requery est la
méthode qui permet d'actualiser la source de données, donc les enregistrements de la
requête R_villes.
- Enregistrer les modifications (CTRL + S),
- Puis, fermer l'éditeur de code VBA en cliquant sur la croix de sa fenêtre,
- De retour sur le formulaire, l'enregistrer à son tour (CTRL + S),
- Puis, l'exécuter par exemple avec la touche F5 du clavier,
Désormais et comme vous pouvez l'apprécier, en déployant tour à tour des
listes déroulantes des villes pour plusieurs départements, les contenus s'ajustent et se restreignent parfaitement à l'offre des départements en question. En revanche et pour l'instant, si vous modifiez le département d'une idée de sortie, bien que l'offre des villes s'actualise, l'ancienne valeur est conservée à l'affichage.
De plus, sachez pour l'avoir constaté personnellement que si l'
index de tabulation de la zone de texte qui donne le focus, est placé après celui de la
liste déroulante des villes, l'actualisation peut ne pas se produire naturellement au changement de département. Pour sécuriser la solution, nous proposons de forcer cette actualisation, y compris au changement de valeur par le biais de la première liste.
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans les propositions, choisir le mode création,
- Sur le formulaire en conception, sélectionner la première liste déroulante (s_dep),
- Dans l'onglet Evénement de sa feuille de propriétés, cliquer sur la ligne Après MAJ,
Cet
événement se déclenche juste après une modification opérée dans le contrôle, donc ici, juste après un changement de département dans la
liste déroulante.
- Cliquer sur le petit bouton placé juste à droite,
- Dans la boîte de dialogue qui suit, choisir le Générateur de code et valider par Ok,
Ainsi, nous sommes de retour dans l'
éditeur VBA Access mais cette fois entre les bornes de la
procédure événementielle s_dep_AfterUpdate.
- Entre les bornes de cette procédure, ajouter les deux instructions VBA suivantes :
Private Sub s_dep_AfterUpdate()
s_Ville.Value = ""
s_Ville.Requery
End Sub
Grâce à la
propriété Value de l'
objet s_Ville, nous supprimons tout d'abord le choix mémorisé par la
liste déroulante des villes pour qu'il n'y ait pas de confusion. Ensuite, nous actualisons son contenu comme précédemment grâce à sa
méthode Requery. Elle devrait donc maintenant proposer les villes du département changé.
- Enregistrer les modifications puis fermer l'éditeur de code,
- De retour sur le formulaire, l'enregistrer à son tour,
- L'exécuter avec la touche F5 du clavier,
Désormais, si vous affectez une sortie à un nouveau département, vous constatez l'actualisation cohérente du contenu de la
liste dépendante des villes.