Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Listes liées sur formulaire Access
Cette nouvelle
astuce tient à démontrer comment
relier facilement des listes déroulantes entre elles.
Source et procédure
Pour comprendre le mécanisme à monter, nous proposons de récupérer une
base de données.
Comme l'indique le volet de navigation sur la gauche de l'écran, cette
base de données est constituée d'une
table et d'un
formulaire.
- Double cliquer sur la table t_sorties pour l'afficher en mode feuille de données,
Cette table recense des activités de sorties sur 997 enregistrements.
Ces idées de sorties sont détaillées sur la raison sociale mais aussi sur le département, la ville et le type d'activité. Pour permettre à l'utilisateur de trouver facilement les idées qui l'intéressent, nous devons lui offrir un système entonnoir. Il doit pouvoir définir son département de sortie, préciser une ville de ce dernier et enfin choisir les activités qui y sont recensées. Ces propositions multiples doivent donc se restreindre et s'affiner au fil des
choix en cascade.
- Fermer la table t_sorties en cliquant sur la croix de son onglet,
- Dans le volet de navigation, double cliquer sur le formulaire f_villes pour l'ouvrir,
Comme vous le constatez, trois listes déroulantes sont déjà présentes pour permettre de construire l'outil que nous avons précédemment détaillé.
Remplir une liste de valeurs uniques
C'est en fonction du choix effectué dans la première de ces listes que les propositions des deux autres doivent s'ajuster. Mais comme vous l'avez vu au travers de la
table t_sorties, de nombreuses idées sont référencées. Et beaucoup d'entre elles appartiennent nécessairement au même département. Cette information est donc répétée à de multiples reprises dans la
table. Et cela va de soi, cette première
liste déroulante ne doit offrir qu'un exemplaire de chaque département. Pour cela, le plus simple est encore d'amorcer une légère
syntaxe Sql exploitant la clause Distinct.
- Tout à fait à gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans la liste des propositions, choisir le mode création,
Nous affichons ainsi le
formulaire dans sa vue en conception. La
feuille de propriétés doit être présente pour les travaux à suivre. Elle est généralement placée sur la droite de l'écran. Si elle n'est pas visible dans votre environnement, vous devez cliquer sur le
bouton Feuille de propriétés dans le
ruban contextuel Création.
- Cliquer sur la première liste déroulante pour la sélectionner,
- Puis, activer l'onglet Autres de sa feuille de propriétés,
Comme vous pouvez le voir, cette première
liste déroulante est nommée
dep. En sélectionnant tour à tour les deux suivantes, vous constatez qu'elles portent les intitulés respectifs
villes et
activites. Ces noms sont importants pour pouvoir créer les interactions qui doivent les articuler. Pour débuter donc, nous devons maintenant charger dynamiquement la première
liste déroulante des départements uniques.
- Cliquer de nouveau sur la première liste déroulante pour la sélectionner,
- Puis, activer l'onglet Données de sa feuille de propriétés,
- Dans sa propriété Contenu, saisir la syntaxe SQL suivante :
SELECT DISTINCT s_dep FROM t_sorties ORDER BY s_dep;
Nous sélectionnons donc les départements uniques (DISTINCT) à partir de la
table t_sorties (FROM). De plus, nous organisons l'extraction croissante sur les départements (ORDER BY). De cette façon, les informations apparaîtront de manière ordonnée dans la liste déroulante.
- Enregistrer les modifications avec le raccourci clavier CTRL + S par exemple,
- Tout à fait à gauche du ruban contextuel Création, cliquer sur la flèche du bouton Affichage,
- Dans la liste des propositions, choisir le mode formulaire,
- Sur le formulaire, cliquer sur la flèche de la première liste déroulante pour la déployer,
Comme vous le constatez, les départements y apparaissent effectivement listés par ordre croissant et sans redondance.
- Revenir sur le formulaire en mode création,
Liste déroulante dépendante
La deuxième
liste déroulante, ne doit proposer que les villes appartenant au département choisi par le biais de la première liste. Nous allons de nouveau construire une petite
syntaxe SQL mais avec une
clause WHERE cette fois. Cette
clause WHERE consiste à émettre une condition pour affiner l'extraction. Cette condition doit être posée sur le champ du département pour répondre à la demande utilisateur.
- Sélectionner la liste déroulante des villes,
- Dans la propriété Contenu de sa feuille de propriétés, saisir la syntaxe suivante :
SELECT DISTINCT s_Ville FROM t_sorties WHERE s_dep=[dep] ORDER BY s_Ville;
Nous sélectionnons les villes uniques (DISTINCT) à partir de la table t_sorties (FROM) pour lesquelles le département correspond bien à celui choisi par l'utilisateur (WHERE). A ce titre, vous notez que le nom du contrôle est inscrit entre crochets dans la syntaxe. Enfin, question de présentation, nous organisons un tri croissant sur ces villes filtrées.
- Enregistrer les modifications (CTRL + S) puis exécuter le formulaire (F5),
- Choisir un département avec la première liste déroulante,
- Puis, déployer la liste déroulante des villes,
Comme vous le constatez, celle-ci est vide. Notre syntaxe est pourtant correcte mais le chargement de la liste ne s'actualise pas au changement de département. Tout cela est une question d'événement à gérer. Au changement détecté, nous devons actualiser les enregistrements. Et pour ce faire, nous proposons de déclencher une toute petite instruction
VBA Access.
- Revenir dans la vue en conception du formulaire,
- Sélectionner de nouveau la première liste déroulante, celle des départements,
- Activer l'onglet Evénement de sa feuille de propriétés,
- Cliquer dans la zone de son événement Sur changement pour l'activer,
- Cliquer alors sur le petit bouton situé à l'extrémité droite de la zone,
- Dans la boîte de dialogue qui suit, choisir Générateur de code et valider par Ok,
Nous basculons ainsi dans l'
éditeur de code VBA Access entre les bornes de la
procédure dep_Change. Le code que nous y ajouterons se déclenchera au changement de valeur opéré dans la
liste déroulante des départements. Ce code doit actualiser les enregistrements dont ceux extraits par les
requêtes associées aux
listes déroulantes.
- Entre les bornes de la procédure, saisir l'instruction VBA suivante :
Private Sub dep_Change()
DoCmd.Requery
End Sub
DoCmd est un objet de programmation. Il s'agit de la contraction de l'expression
Do Command. Sa
méthode Requery permet d'actualiser les requêtes. En quelques sortes, il s'agit d'une méthode similaire au recalcul enclenché sur les feuilles Excel à la moindre modification.
- Enregistrer ce code à l'aide du raccourci clavier CTRL + S,
- Fermer l'éditeur VBA Access en cliquant sur la croix de la fenêtre,
- De retour sur le formulaire, l'exécuter à l'aide de la touche F5 du clavier,
- Choisir un département avec la première liste déroulante,
- Puis, déployer la liste déroulante des villes,
Cette fois, les villes proposées s'actualisent. Il s'agit bien des communes appartenant au département choisi à l'aide de la première
liste déroulante. Et si vous changez de département à l'aide de la première liste, les villes de la deuxième liste déroulante s'ajustent aussitôt.
- Revenir dans la vue en conception du formulaire,
Désormais, par le biais de la troisième
liste déroulante, nous devons proposer seulement les activités recensées dans la ville et le département précédemment choisis. Il s'agit donc de poser une double condition dans la
clause WHERE de la
requête SQL à inscrire pour charger le contenu de cette liste.
- Sélectionner la troisième liste déroulante, celle des activités,
- Dans l'attribut Contenu de sa feuille de propriétés, saisir la syntaxe SQL suivante :
SELECT DISTINCT s_act FROM t_sorties WHERE s_dep=[dep] AND s_Ville=[villes] ORDER BY s_act;
Nous sélectionnons les activités uniques (DISTINCT) à partir de la
table t_sorties (FROM). Mais cette fois, nous recoupons deux conditions. Et c'est l'
opérateur AND qui permet ce croisement premièrement pour la correspondance du département et ensuite pour la correspondance de la ville. Comme précédemment en revanche, cette liste doit s'actualiser non seulement au choix du département mais aussi au choix de la ville.
- Sélectionner la deuxième liste déroulante, celle des villes,
- Activer l'onglet Evénement de sa feuille de propriétés,
- Cliquer sur le petit bouton à l'extrémité de son événement Sur changement,
- Dans la boîte de dialogue, choisir Générateur de code et valider par le bouton Ok,
Nous basculons ainsi entre les bornes de la
procédure événementielle villes_Change.
- Comme précédemment, y inscrire l'instruction suivante :
Private Sub villes_Change()
DoCmd.Requery
End Sub
- Enregistrer les modifications (CTRL + S) et fermer l'éditeur VBA Access,
- Exécuter le formulaire (F5),
- Avec la première liste déroulante, choisir par exemple le département : 07-Ardèche,
- Avec la deuxième liste déroulante, choisir par exemple la ville d'Alba la Romaine,
- Ensuite, déployer la troisième liste déroulante,
Comme vous pouvez le voir, seules subsistent les activités des villes de la seconde liste, attachées au département de la première
liste déroulante. Nous avons donc réussi à construire le mécanisme de
trois listes déroulantes reliées en cascade.
Vous avez peut-être remarqué un défaut dans le champ des activités. L'une d'entre elles apparaît parfois en double car elle est écrite avec deux orthographes différentes : Hotel et Hôtel. Il suffirait d'enclencher une
requête mise à jour classique pour corriger ces défauts.
Une autre anomalie contraignante apparaît. Au choix d'un nouveau département, les deux autres
listes dépendantes conservent la mémoire des choix antérieurs réalisés. Pourtant, la ville conservée dans la seconde liste par exemple, n'appartient plus au nouveau département défini. Pour corriger ce petit dysfonctionnement, il suffit simplement d'effacer ces valeurs au changement dans les listes parentes. Nous allons donc profiter des
procédures événementielles existantes.
- Revenir sur la vue du formulaire en mode conception,
- Sélectionner la deuxième liste déroulante,
- Puis, cliquer sur le petit bouton associé à son événement Sur changement,
Comme la
procédure événementielle existe déjà , nous basculons instantanément dans l'
éditeur de code Visual Basic Access.
- Entre les bornes de la procédure dep_Change, ajouter les deux lignes mentionnées en gras :
Private Sub dep_Change()
DoCmd.Requery
villes.Value = ''
activites.Value = ''
End Sub
- Faire de même entre les bornes de la procédure villes_Change, mais seulement pour les activités à réinitialiser,
Private Sub villes_Change()
DoCmd.Requery
activites.Value = ''
End Sub
- Enregistrer les modifications et fermer l'éditeur VBA Access,
- Exécuter le formulaire,
- Réaliser les choix au travers des trois listes déroulantes,
- Puis, changer de département avec la première liste déroulante,
Comme vous pouvez le voir, cette fois les incohérences disparaissent. Les valeurs affichées par les deux
listes déroulantes sont effacées et leurs contenus se réactualisent parfaitement pour correspondre aux choix faits en amont.