formateur informatique

Listes déroulantes reliées sur tous les enregistrements

Accueil  >  Bureautique  >  Access  >  Access Astuces  >  Listes déroulantes reliées sur tous les enregistrements
Livres à télécharger


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


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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.

Listes déroulantes reliées entre elles sur tous les enregistrements du formulaire Access

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.

Requête source pour remplir une liste déroulante de table Access

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,
Requête Access pour afficher seulement les valeurs uniques à charger dans une liste déroulante

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,
Requête Access avec valeurs distinctes pour remplir une liste déroulante de données uniques triées

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.

Formulaire Access tabulaire avec plusieurs listes déroulantes

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,
Ajouter un champ de critère dans la requête Access sans l-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]

Critère de requête Access pour relier des listes déroulantes sur un formulaire

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. Déclencher un code VBA Access quand un contrôle du formulaire est activé

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.

Déclencher un code VBA sur réception du focus par une liste déroulante de formulaire Access

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,
Relier entre elles les listes du formulaire Access sur tous les enregistrements

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.

 
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