formateur informatique

Listes déroulantes dépendantes en cascade avec Access

Accueil  >  Bureautique  >  Access  >  Access Astuces  >  Listes déroulantes dépendantes en cascade avec Access
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


    Inscription Newsletter
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.

Table Access des activités de sorties triées par villes et par départements

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,
Formulaire Access avec trois listes déroulantes à relier entre elles

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,
Trouver les noms attribués aux contrôles de listes déroulantes sur un formulaire Access

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,
Charger une liste déroulante des valeurs uniques sur un formulaire Access

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,
Déclencher un code VBA au changement de valeur dans une liste déroulante sur une formulaire Access

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,
Choix restreints et dépendants de liste déroulante sur un formulaire Access



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,
Trois listes déroulantes reliées en cascade sur un formulaire Access

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.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn