Listes déroulantes liées

Comment combiner 2 listes déroulantes, de façon à ce qu’un choix dans la première filtre automatiquement la seconde ?

Dans l’exemple ci-dessous, une liste propose les différentes activités   possibles pour un client (Plongée, Pêche, Cabotage…). La seconde liste n’affiche que les clients liés à cette activité.

Info
Il y a plusieurs manières de réaliser cette synchronisation de listes. Cet article décrit l’approche graphique, avec le moins de programmation possible.

Construction de la 1ère liste déroulante

Pour simplifier, on suppose que la 1ère liste est basée sur des valeurs tapées manuellement, et que le formulaire sur lequel vous travaillez s’appelle « frm Clients »

  1. Ouvrez votre formulaire en mode Création.
  2. Si nécessaire, faites apparaître la boîte à outils, via le menu Affichage / Boîte à outils.
  3. Vérifiez sur la boîte à outils que l’Assistant Contrôle  est activé.
  4. Cliquez sur l’icône Zone de liste modifiable  puis cliquez quelque part sur le formulaire.
  5. 1ère étape de l’assistant, choisissez « Je taperai les valeurs souhaitées« .
  6. 2ème étape : tapez les valeurs les unes sous les autres (par ex. : Cabotage, Pêche, Plongée…)
  7. 3ème étape : tapez le nom de l’intitulé qui précèdera la liste déroulante (par ex. : Activité)
  8. Dans les propriétés de la liste déroulante (accessibles par un clic droit sur celle-ci), nommez votre liste (par ex. : cmbActivites). Vous obtenez quelque chose qui ressemble à :

Construction d’une requête pour la 2ème liste déroulante

La 2ème liste déroulante sera basée sur une requête, qui sera chargée de filtrer les clients.

  1. Créez une requête basée sur la table des clients, comme dans l’exemple ci-dessous.
  2. Pour filtrer les clients par activité, définissez le critère suivant :
    Forms![frm Clients]![cmbActivites]frm Clients désigne le nom du formulaire Clients et cmbActivites désigne le nom de la 1ère liste déroulante, tel que vous l’avez défini plus haut.Note : Ne définissez pas nécessairement ce critère tout de suite : il pourrait perturber la construction de la liste déroulante ci-après. Vous pourrez le rajouter plus loin.
  3. Enregistrez cette requête (par ex. sous le nom rqt Clients par activité).

Construction de la 2ème liste déroulante

  1. Ouvrez votre formulaire en mode Création.
  2. Si nécessaire, faites apparaître la boîte à outils, via le menu Affichage / Boîte à outils.
  3. Vérifiez sur la boîte à outils que l’Assistant Contrôle est activé
  4. Cliquez sur l’icône Zone de liste modifiable  puis cliquez quelque part sur le formulaire.
  5. 1ère étape de l’assistant, choisissez « Je veux que la liste modifiable recherche les valeurs dans une table ou requête« .
  6. 2ème étape : au bas de la boîte, activez le réglage Requêtes et cliquez sur votre requête rqt Clients par activité.
  7. 3ème étape : sélectionnez tous les champs de la requête pour les faire passer à droite de la boîte.
  8. 4ème étape : réglez éventuellement les tailles des colonnes.
  9. 5ème étape : cliquez sur le champ dont la valeur devra être conservée.
  10. 6ème étape : définissez un intitulé quelconque (par ex. : Clients)
  11. Dans les propriétés de la liste déroulante (accessibles par un clic droit sur celle-ci), nommez votre liste (par ex. : cmbClients).

Vous pouvez maintenant rouvrir votre requête rqt Clients par activité et définir le critère cité plus haut.

Mise à jour de la 2ème liste déroulante par la 1ère liste

Si vous testez immédiatement, vous remarquerez qu’un choix dans la 1ère liste déroulante n’a pour l’instant aucune répercussion sur la 2ème liste. Voici la touche finale pour que tout fonctionne :

  1. Faites un clic droit sur la 1ère liste déroulante, puis cliquez sur Propriétés.
  2. Cliquez sur l’onglet Evénements.
  3. Définissez l’événement Après mise à jour sur Procédure événementielle.
  4. Cliquez sur les points de suspension à droite de l’événement.
  5. Tapez la ligne suivante dans la procédure Visual Basic :

Vous aimerez aussi...

113 réponses

  1. AMOUSSOU dit :

    J’AIME LES PROGRAMMEURS

  2. Yannick dit :

    Bonjour,
    Merci pour ces tutoriels! Ils sont très utiles pour les débutants dans mon genre!! J’ai essayé de créer deux listes liées comme vous l’expliquez ici mais rien n’y fait, lorsque je fait passer mon formulaire en « Mode Formulaire » ma deuxième liste reste vide même avec la ligne VBA »Me![cmbClients].Requery ».
    Cela peut-il venir du fait que dans mon cas, les clients peuvent êtres liés à plusieurs activités? Y aurai-t-il une autre méthode à suivre dans ce cas?
    Merci!

    • Hervé Inisan dit :

      La 2ème liste (celle à actualiser) s’appelle bien cmbCLients ?
      Sinon : le filtre se fait dans quel sens :
      – Un client / plusieurs activités ?
      – Une activité / plusieurs clients ?
      – Les 2 ?

      • Yannick dit :

        Merci pour votre retour rapide! Dans mon premier mail je cite la cmbClients mais voici une autre façon de m’expliquer, je pense que ça sera plus clair.
        J’ai dans une même table un champ « Numéro Auto », un champ « NomFamille », un champ « Prenom » et un dernier champ « Aliment » qui se présenterait donc comme ceci (en espérant que la mise en forme se conserve :p):
        1 Dupont Marc Riz
        2 Dupont Sophie Pâtes
        3 Durand Jérémie Poisson
        4 Leblanc Marc Carotte
        5 Dupont Clémence Courgette
        6 Dupond Jérémie Fromage

        J’aimerais, avec un première fenêtre de sélection choisir ma famille, Dupont par exemple, et que dans ma deuxième fenêtre de sélection seuls les prénoms Marc Sophie et Clémence apparaissent (pour ensuite afficher l’aliment, de Clémence par exemple, dans une texte box).
        Mais dans ce cas, Marc existe à la fois chez les Dupont et chez les Leblanc, cela pose-t-il problème selon vous?
        (Dans ce cas bien sur, il faudra que mon code VBA soit du genre « Me![cmbPrenom].Requery »).
        Le filtre se fait donc dans le sens « nom de famille / plusieurs prénoms », sur Access 2007, je ne sais pas si cela change quelque chose.

        Bien cordialement,
        Yannick

        • Hervé Inisan dit :

          A vue de nez, ça ne doit pas poser de problème :
          1. Il faudrait que la première liste (je l’appelle cmbNomFamille) soit basée sur une requête DISTINCT pour n’afficher que les noms différents (sinon, on aura Dupont, Dupont, Durand, Leblanc…).
          En SQL :

          2. La seconde liste sera basée, comme dans l’article, sur une requête avec ce type d’égalité :

          3. Le Requery pour actualiser, comme dit l’article.

          Sans rapport avec la question : je sens que le champ Aliment ne devrait pas être dans la table des personnes. D’une part, il ne caractérise pas une personne mais un autre processus ; d’autre part, il y a probablement une relation 1:n qui va en sortir.

  3. Claire dit :

    Merciiiii! Grâce à votre tuto (que j’ai mis 2 jours à trouver sur l’internet-car je n’utilisais pas les bon mots-clé) j’ai réussi à faire ce que je voulais!

  4. Andre dit :

    Re bonjour

    je m’excuse j’ai oublié une chose importante suite aux commentaires précédents,il faut mettre un refresh et non pas un requery dans le cmb dans l’évènement afterupdate

    Cordialement

    • Hervé Inisan dit :

      Si on parle de la même chose, c’est bien un Requery qu’il faut utiliser pour actualiser la liste (la méthode Refresh n’est pas disponible sur ComboBox).

      • Andre dit :

        Si la fonction refresh existe bien et on y a parfaitement accès avec l’éditeur vba sur l’évènement afterupdate dans les propriétés de la combo .Avec requery je ne sais pas pourquoi la combo n’est pas mise à jour (toujours sur l’évènement afterupdate).
        J’utilise Access 2010 pour info.

        • Hervé Inisan dit :

          Est-ce qu’il ne s’agit pas plutôt du Refresh du formulaire lui-même ?
          (sur ma version 2013, je confirme que ComboBox n’expose pas de méthode Refresh)

          Pour clarifier, est-ce qu’il est possible de poster ici un bout de code VBA d’un AfterUpdate utilisant le Refresh ?

          • Andre dit :

            voilà le code:

            Private Sub CmbSsActivites_AfterUpdate()
            Refresh
            End Sub

            et je viens de vérifier sur ma version access 2013 j’ai bien la même chose.

          • Hervé Inisan dit :

            C’est plus clair effectivement : en l’absence de préfixe devant Refresh, les syntaxes implicites sont les suivantes (elles sont équivalentes) :

            C’est donc la méthode Refresh du formulaire qui est prise en compte (et il n’y a pas de méthode Refresh sur ComboBox).

            Il y a peut-être une confusion : le fait de se placer dans l’événement AfterUpdate de la ComboBox n’implique pas que les méthodes utilisées dans le code sont relatives à cette ComboBox. En fait, tout le code d’un événement VBA est relatif au formulaire (ou à l’état).

            Ceci explique peut-être aussi le comportement de Requery : Requery (tout court) équivaut à Forms![NomDuFormulaire].Requery (ce qui rafraîchit la source du formulaire), tandis que Me![Nom de la liste].Requery rafraîchit la source de la ComboBox.

            Ouala !

  5. André dit :

    Bonjour

    merci pour ce site très intéressant et vos ouvrages.
    J’ai été confronté au problème de liste déroulantes liées.
    Je me permet de vous fournir une façon ou nous n’avons plus besoin de créer une requête mais simplement dans le contenu de la deuxième combo sur le champ concerné il suffit
    de faire créer et aller chercher le combo ([Nomdu2emeCmb]) dans notre formulaire chargé et nous aurons ceci en critère:

    [Formulaires]![NomduFormulaire]![Nomdu2emeCmb]

    il suffit alors de laisser uniquement:

    [Nomdu2emeCmb]

    et ça fonctionne sans requête.

    • Hervé Inisan dit :

      Merci pour le retour, cette variante marche aussi.
      Pour chipoter 🙂 : la requête existe toujours, mais elle est cette fois embarquée dans la seconde liste plutôt que d’être stockée comme requête autonome.

  6. JEHJOUH dit :

    Salut,
    Merci pour ce tutoriel sympa mais malheureusement pour moi ça ne fonctionne pas très bien. En effet, je possède la version Access 2013, quand je rentre l’activité une « pop-up » s’affiche en me disant « Formulaires!THEME!cmbDomaine » pour que je rentre un identifiant quand j’en rentre un il actualise la deuxième liste déroulante ainsi il filtre. En outre le programme fonctionne mais pas correctement.

    • Hervé Inisan dit :

      Est-ce que les 2 noms d’objets sont corrects ? En d’autres termes :
      – est-ce que la liste déroulante qui sert au filtre s’appelle bien « cmbDomaine » ?
      – est-ce que le formulaire s’appelle THEME ?

      • JEHJOUH dit :

        -Oui pour cmbDomaine je l’ai correctement mis
        Mais pour le formulaire aussi, mais en fin de compte je ne sais pas mettre le quel nom de formulaire

        • JEHJOUH dit :

          Par contre moi j’ai associé ma première liste déroulante à une table autrement dit je ne l’ai pas rentré manuellement.

        • Hervé Inisan dit :

          Le formulaire est celui qui contient les 2 listes. C’est son nom qu’il faut reprendre.
          Si Access affiche une boîte de dialogue pour demander « le paramètre », c’est qu’il ne trouve pas l’un des 2 noms (donc l’erreur se trouve à cet endroit).

          • JEHJOUH dit :

            Du coup j’ai tout repris, et ça fonctionne très bien et je vous en remercie beaucoup de votre aide.

          • JEHJOUH dit :

            Désole de vous importuner, lorsque je sélectionne dans ma 1ère liste déroulante mon champs, la deuxième liste filtre et récupère ce qui lui intéresse par rapport à la première jusqu’ici tout fonctionne, mais il y a un petit problème car lorsque à présent je sélectionne à nouveau un autre champs sur la première liste déroulante il ne réactualise pas la liste déroulante 2 car cette dernière contient les anciennes données.

          • Hervé Inisan dit :

            Est-ce que le Requery se déclenche bien ?
            Ajoute par exemple un MsgBox "Test" dessous, pour le vérifier.

          • JEHJOUH dit :

            c’est bon ça marche je tiens à vous remercier pour votre aide

      • bobe48000 dit :

        J’ai le même probleme
        en début ça marche mais ensuite que je ajoute autre fonctionnalité au formulaire le message apparue a nouveau

  7. ATHIAS dit :

    lorsque je clique sur dans ma zone de liste modifiable voici le message qui s’affiche Return Sans GoSub

    • Hervé Inisan dit :

      Il doit manquer un bout de VBA quelque part. La commande Requery (utilisée pour la mise à jour de la liste) est bien tapée dans l’événement Après MAJ, c’est-à-dire à l’intérieur d’un bloc comme celui qui suit ?

  8. Augustin dit :

    Bonjour,
    Merci pour le tuto. La combinaison des 2 listes déroulantes fonctionne correctement chez moi. Seulement je voudrais que quand je change la valeur du champ N°1, l’ancien contenu du champ N°2 soit automatiquement effacé en attendant que je sélectionne une donnée dans la liste 2. Merci.

  9. Laetitia dit :

    Bonjour Hervé, merci pour ces explications.
    J’ai une situation similaire (Access 2007), les listes déroulantes sont bien liées et la 2ème s’actualise sans problème en fonction du choix dans la 1ère liste.
    Par contre, quand je veux afficher la totalité de mes enregistrements (par double affichage, formulaire continu ou feuille de données), l’affichage du choix de la 2ème liste disparait si le choix dans la 1ère liste est différent du dernier saisi), ma feuille de donnée est incomplète en lecture (mais la donnée du champ reste mémorisée).

    Pour reprendre votre exemple :
    Pour un enregistrement donné, je choisis « pêche » comme activité, la 2ème liste affiche bien les clients pêcheurs, et tous les enregistrements avec « pêche » affichent la bonne liste de clients.
    Si je me place sur un enregistrement ayant « plongée » comme activité, la 2ème liste est réactualisée avec les clients plongeurs pour tous les enregistrements contenant « plongée », mais le champ client des autres enregistrements ayant une autre activité (pêche, canotage …) devient vide.

    Le problème n’existe qu’en affichage « multi-enregistrements »

    Apparemment, Access met à jour le contrôle de liste de choix pour tous les enregistrements, y’a-t-il un moyen (VBA ou autre) de ne pas effectuer cette mise à jour pour les enregistrements non modifiés ?

    Merci

    • Hervé Inisan dit :

      Malheureusement non. C’est un « problème » classique d’Access : les événements de mise à jour des enregistrements se déclenchent pour l’ensemble des lignes. Du coup, un objet indépendant aura forcément la même valeur pour toutes les lignes affichées.

  10. Hervé Inisan dit :

    polo > Il y a plusieurs approches pour faire ça. Quel est l’objectif derrière (ça peut aider à choisir) ?

  11. polo dit :

    Bonjour

    je souhaite lié une liste déroulante avec une zone de texte
    exemple je sélectionne le nom de l’auteur dans une liste et son prénom s’affiche dans la zone de texte

    merci

  12. jpblues dit :

    Bonjour,

    Super !!!
    Merci

    Jean-Paul B

  13. Hervé Inisan dit :

    cyrielle > Quelle est l’erreur affichée ? Ou qu’est-ce qui se produit à l’écran ?

  14. cyrielle dit :

    Bonjour
    l ‘ajout du critere Forms![frm Clients]![cmbActivites]
    genere un message d’erreur chez moi.

    Voici ma structure : une table ID_P contenant project et id_project et une table project contenant id_project et id_TR : la clé primaire de la table ID_P est id_project et la cle primaire de la table project est id_TR. bien sur id_project de la table project est cle etrangere et reference id_project de la table ID_P.

    dans ma premiere liste deroulante, je souhaite afficher project

    dans la seconde, je souhaite afficher les TR relatifs au project selectionné: la requette est la suivante :

    SELECT project.ID_TR, ID_P.project
    FROM project, ID_P
    WHERE (((ID_P.id_project)=[project].[id_project]));

    mais lorsque j’ajoute le critere Forms![frm Formular1]![cmbproject ] dans la case critere de la colonne project de ma requete, cela ne marche pas .

    pouvez vous m’aider a resoudre mon probleme ?

    merci d’avance

  15. Hervé Inisan dit :

    Marie > Est-ce que la liste déroulante a des réglages particuliers ? Quelle est sa « source contrôle » ?

  16. Marie dit :

    Je ne veux pas nécessairement qu’il se passe quelque chose en sélectionnant, mais le soucis est justement que je ne peux pas sélectionner !
    En cliquant sur la flèche de la liste déroulante, celle ci s’affiche bien comme il faut, je peux passer ma souris sur les éléments, ils se « noircissent » mais lorsque je clique sur l’un des éléments c’est là que ça marche pas la liste ne prend pas en compte mon clique.

    Désolée si je ne suis pas très claire, je ne connais surement pas vraiment le vocabulaire approprié :s

  17. Hervé Inisan dit :

    Dimitri > Est-ce que tu as vérifié le Requery ? (cf. mon commentaire précédent)

  18. Dimitri dit :

    Bonjour,

    tout d’abord merci pour ce forum qui est très utile. J’ai une question concernant les listes déroulantes :
    – ma 1ere liste recense des motifs de retards (motif général)
    – ma 2ème liste fait apparaître des sous motifs correspondant au premier motif (motif particulier)

    Je rencontre un problème qui est assez dérangeant et je voulais savoir si vous pouviez m’aider : lorsque je sélectionne un premier motif, le sous motif s’affiche bien. Par contre si je veux changer le premier motif, impossible d’avoir de sous motif correspondant : la 2ème liste me propose que les sous motifs du premier motif.

    J’espère avoir été assez clair et que vous pourriez m’apporter une solution.

  19. Hervé Inisan dit :

    Dimitri > Le Requery est bien en place ? Il se déclenche correctement ? Pour tester, tu peux par exemple ajouter ceci après la ligne Requery :

    Si un message s’affiche à l’exécution, c’est bon signe, sinon il y a une erreur dans l’événement. Et si le message s’affiche mais que ça ne marche pas… c’est que l’erreur est ailleurs. 😉

  20. Hervé Inisan dit :

    Marie > Je ne sais pas si on parle de la même chose, mais dans l’article, la seconde liste (celle qui est filtrée par la première) ne fait rien de particulier. Donc, si on y sélectionne un élément, il ne se passe rien ! 🙂 C’est normal (ce n’était pas le sujet de l’article).

    Si cette liste doit provoquer un positionnement dans le formulaire (l’affichage d’une fiche particulière), il faudrait lui ajouter un événement Après MAJ. Si c’est l’objectif, cette autre page peut donner des pistes.

  21. Dimitri dit :

    Bonjour, déjà merci pour votre tuto, il est très pratique et simple.
    J’ai une petite question, un peu comme pour Marie:

    J’ai deux listes déroulantes : la 1ère concerne des motifs et la 2ème des sous motifs. Chaque sous motif est lié à un motif.
    Sur mon formulaire, lorsque je sélectionne mon motif dans le 1er menu, j’ai bien accés à un sous motif dans le 2ème menu. Par contre, si je change mon motif dans le 1er menu, le sous motif ne change pas. Avez vous une idée de ce qui bloque ?

    Merci par avance

  22. Marie dit :

    Oui la liste des agences est correctement filtrée mais je ne peux pas faire de choix, le formulaire ne prend pas en compte mon clic et me sélectionne automatiquement la première agence de ma liste…

  23. Hervé Inisan dit :

    Marie > Donc, si j’ai suivi, la liste des agences est correctement filtrée lorsqu’un client est choisi ? Qu’est-ce qui ne marche pas précisément ensuite ? (tu fais quelque chose de particulier après avoir sélectionné une agence ?)

  24. Marie dit :

    Un client est lié à plusieurs agences !

  25. Hervé Inisan dit :

    Marie > Un client est lié à plusieurs agence, ou au contraire une agence est liée à plusieurs clients ?

  26. Marie dit :

    Bonjour, le dernier commentaire datant d’un petit moment, j’espère que le forum est toujours d’actualité..

    J’ai suivi tout le tutoriel et ça marche plutôt bien, j’ai juste un soucis :
    Lorsque je choisis l’élément de la première liste (à savoir chez moi les clients), les éléments de la 2ème liste (les agences) s’affiche correctement mais j’ai beau cliquer sur le 3ème choix par exemple, c’est à chaque fois le premier élément de cette 2ème liste qui se sélectionne ! En gros, je ne peux pas choisir l’agence que je veux..

    J’espère avoir été claire, merci d’avance !

  27. Hervé Inisan dit :

    taha12 > En fait, ce que tu veux faire ne ressemble pas vraiment au contenu de l’article, puisque tu pars d’une case à cocher, et que tu affiches un sous-formulaire… 😉

    Tu parles de « visibilité » : j’en déduis que le sous-formulaire est construit et positionné sur le formulaire principal, et qu’il faut le rendre visible ou invisible en fonction de la case choisie ?

  28. taha12 dit :

    je vous remercie pour ce tutoriel et j’espère que vous pourrez m’aider.en fait ce que je veux faire ressemble à ce qui est dans ce tuto sauf que dans mon cas je travaille sous Access 2010 avec un sous_formulaire qui doit s’ouvrir sur un formulaire principal et non pas sur une fenêtre indépendante, autrement dit je veux que la visibilité du sous-formulaire soit dépendante d’un choix effectuer par l’utilisateur via une case à cocher et tout ceci pour but de pouvoir saisir la valeur dans telle ou telle table et merciii d’avance pour votre aide

  29. Hervé Inisan dit :

    Baiked > Comme dans beaucoup d’autres cas : est-ce que le Requery est correctement implanté ?

  30. Baiked dit :

    Bonjour,

    Je suis sur access 97 le tuto marche mais juste la première fois…

    J’ai une table avec des pays et des villes.

    Quand j’ouvre mon formulaire je choisi un pays dans mon 1er liste
    Quand je clic sur la deuxieme liste je trouve bien les ville lies a ce pays

    Mais si je change de pays dans la 1er liste alors la 2eme liste reste comme boque sur le premier pays que j’ai choisi.

    Si une personne peut m’eclairer.

    Merci d’avance

  31. Hervé Inisan dit :

    ranok > Pour l’actualisation, est-ce que tu as bien un Requery correct, dans le bon événement ?

    Pour l’affichage des numéros : si tu ne veux pas les voir, il faut qu’à l’étape de dimensionnement des colonnes, tu donnes une taille de 0 (mais bien 0, la colonne complètement « écrasée ») à la première colonne, celle des numéros. C’est alors la 2ème colonne qui s’affichera (les noms par exemple).

  32. ranok dit :

    Bonjour et merci pour votre tutoriel, je m’en suis beaucoup inspiré pour faire mon formulaire.
    Par contre j’ai lancé directement un formulaire à partir d’une table et lorsque je sélectionne le premier champ et que je sélectionne le deuxième, si je viens à modifier la liste du premier champ, la liste du deuxième ne s’actualise pas, je suis obligé soit de fermer mon formulaire ou faire F5. A quoi ça peut être dû?
    Sinon dans mon premier champ, il m’indique des numéros alors que ça devrait être des noms.
    Je précise, je débute dans access.

    Merci d’avance

  33. Hervé Inisan dit :

    Sylvain > Effectivement, c’est bien un problème de filtre : si un enregistrement (quelconque) du formulaire Tabulaire a une liste filtrée, le même filtre est appliqué (visuellement) à toutes les lignes. Les données sont correctement gérées, mais l’affichage donne l’impression de « ne pas correspondre ».

  34. Sylvain dit :

    Effectivement, pour que cela fonctionne, il faut indiquer dans la requête: Forms![Nom_du_formulaire]![Nom_du_sous_formulaire].Form![Nom_de_liste_deroulante]
    En revanche, l’entrée sélectionnée dans la deuxième liste déroulante est bien stockée dans la table mais n’est pas visualisable dans le sous-formulaire lorsque l’on ferme et ré-ouvre le formulaire. C’est ce que vous évoquez à propos du filtre, je suppose. En tout cas merci pour le suivi et bravo pour ce site!

  35. Hervé Inisan dit :

    Pierre > Est-ce qu’il peut s’agir d’un problème de syntaxe ? Le nom du formulaire et de la liste doivent être orthographiés précisément.

  36. Hervé Inisan dit :

    Sylvain > La raison est que le chemin pour pointer vers un sous-formulaire n’est pas le même que celui qui désigne un formulaire. Il faut donc changer ce chemin, dans la requête, pour que celle-ci trouve l’objet concerné, dans le sous-formulaire. Pour ces problèmes de chemins, voir l’article Sous-formulaires : une mise au point.

    Si le sous-formulaire est en mode Tabulaire, il y aura aussi un effet de bord dû à Access (sans rapport avec le problème de chemin) : lorsqu’une liste sera filtrée, toutes les listes seront filtrées (sur toutes les lignes). Mais ça, c’est une autre histoire… 🙂

  37. Sylvain dit :

    J’ai utilisé votre tutoriel qui est très pratique et utile: tout fonctionne mais quand j’utilise le formulaire comme un sous-formulaire dans l’onglet d’un formulaire principal, à chaque fois que je clique sur la première liste, une boîte de dialogue me demande d’entrer une valeur de paramètre correspondant au filtre de la requête devant s’appliquer à la deuxième liste déroulante. La question est donc: pourquoi cela fonctionne comme formulaire mais pas comme sous-formulaire? Que faut-il faire? Merci par avance

  38. pierre dit :

    Bonjour,

    j’ai suivi le tutoriel, tout marche jusqu’à ce que je sélectionne la deuxième liste dans le formulaire : la requête se lance et une fenêtre s’ouvre (comme si j’avais directement cliqué sur la requête) et me demande de saisir la donnée de la première liste alors que je viens de la sélectionner dans la première liste…
    Je ne comprends pas (débutant access),
    Merci pour l’aide,
    Pierre

  39. sycomore dit :

    C est exactement la fonction que je cherchais mais comme je suis un nul je n arrive pas à reproduire l exemple donné dans ma base…
    Ca serait bien de mettre un lien vers un fichier que les gros nuls comme moi puissent vérifier où ils deconnent.
    En tout cas, merci pour cet exemple

  40. Hervé Inisan dit :

    Uls > Si j’ai suivi la question : il faut dans un 1er temps un champ [Sexe] dans la table [tbl Clients], j’imagine. Ensuite, il faut ajouter ce champ sur la grille de requête, et lui ajouter un critère. Le critère peut être « en dur » ou paramétré comme l’activité.

  41. Uls dit :

    Bonsoir,
    Je reviens sur ton exemple. Si je veux filtrer les clients hommes avec le filtre d’activité. Est-ce possible?

  42. Hervé Inisan dit :

    Uls > Merci, et bonne visite !

  43. Uls dit :

    Je trouve vraiment ce site génial

  44. Hervé Inisan dit :

    0francois0 > Est-ce que les noms des différents objets (formulaire, liste déroulante) qui sont à taper manuellement sont correctement orthographiés ? Si Access ne trouve pas un nom, il affiche une boîte pour le demander.

  45. 0francois0 dit :

    Tout d’abord merci pour ce tutoriel.
    J’ai juste un petit souci, tout fonctionne sauf que lorsque je veux sélectionner dans ma deuxième liste, une textbox s’ouvre et me demande de rerentrer ce que j’ai mis dans la première liste.
    Mis à par ca ca marche mais je souhaiterais ne pas avoir à retaper ma première valeur.
    Merci pour les conseils
    François

  46. Hervé Inisan dit :

    codortis > Ça ne va pas être facile à gérer de cette manière. 2 solutions plus adaptées :

    1. Créer une requête différente pour chaque formulaire.
    2. Aller vers une approche « pur VBA » où le filtre de liste va être généré en VBA, au lieu d’être créé manuellement.
  47. codortis dit :

    Comment lier les listes à plusieurs formulaires ?
    J’ai mis dans ma requête: liste2 liste1(where form1 ou form2 ou form3…) mais ça ne marche pas il quand je veux remplir le champs de liste2 il me demande une valeur pour liste1 pour chacun des formulaire (j’ai choisi une valeur liste1 dans le formulaire dans lequel je suis)

  48. you dit :

    Je trouve votre site fantastique

  49. Hervé Inisan dit :

    Stong > Sur un sous-formulaire (notamment affiché en feuille de données), le filtrage de la liste va poser des problèmes d’ergonomie (en gros : l’utilisateur ne comprendra pas bien !). La raison est que le filtre sera déclenché une fois par le formulaire principal, et qu’il va s’appliquer à l’enregistrement en cours du sous-formulaire. Mais du coup, toutes les listes de tous les enregistrements du sous-formulaire seront filtrées en même temps. Et par extension, si ces listes n’ont pas de valeur correspondant au filtre, elles peuvent apparaître vides… jusqu’à ce que le filtre change.

  50. Stong dit :

    Bonjour,

    J’ai bien suivi ce tutoriel, ainsi que les commentaire qui ont suivis, mais je n’arrive pas à mes fins.
    Une petite différence tout de même avec le tutoriel : ma première liste déroulante est dans un formulaire et la seconde dans un sous formulaire.

    Donc je sélectionne mon fournisseur (1ère liste dans le formulaire), j’ai le message qui s’affiche (« Hello ») donc la ligne de commande est lue, mais je n’ai rien dans la seconde liste déroulante (= vide, une seule ligne complètement blanche) dans la sous formulaire.

    J’imagine que c’est au niveau de la requête que ça coince mais je n’en sais trop rien.

    Merci pour votre aide éventuelle.

  51. anaïs dit :

    Mais maintenant, les données affichées après le choix des deux combobox ne sont pas liées.
    Ainsi, le numéro de l’appareil ne corespond plus à sa désignation.

  52. Hervé Inisan dit :

    anais > Ok, ça marche 🙂

  53. anaïs dit :

    Merci beaucoup Hervé pour ton aide, j’ai simplement recommençer mon formulaire pour voir si je n’avais pas fait de fausses manipulations et mon nouveau formulaire à fonctionner.

  54. Hervé Inisan dit :

    anais > Il y a plusieurs approches possibles. Pour une méthode simple, voir ici. Sinon, il faut passer par la « sécurité utilisateur », qui est plus lourde à gérer.

  55. anaïs dit :

    Rebonjour, Hervé.
    Je voudrais savoir comment on réalise une vérifcation de mot de passe avec l’ouverture d’un formulaire. Exactement, quand l’utilisateur clique sur son service, il doit rentrer son code de service et ensuite il tombera sur le formulaire de son service si son code est bon.
    Merci d’avance

  56. anaïs dit :

    Merci beaucoup Hervé pour ta réponse.Je te tiens au courant.

  57. Hervé Inisan dit :

    Anais > La ligne de mise à jour serait plutôt :

    ou encore :

    mais pas le mélange des deux 🙂 D’autre part, j’utiliserais plutôt l’événement AfterUpdate que Click.

  58. Anaïs dit :

    Oui, voici mon code pour la première ComboBox
    Option Compare Database

    Private Sub NomProjet_Concerne_Click()
    Me.Forms![Finition_Formulaire_Fonctionne_Liaison]![NumAppareil].Requery
    End Sub

    Hier, la liaison fonctionnait mais ne fesait pas référence au code ci -dessous qui a pour but de montrer la suite de mon formulaire.

    Private Sub NumAppareil_AfterUpdate(Cancel As Integer)
    Texte43.Visible = True
    Texte56.Visible = True
    Texte58.Visible = True
    Texte60.Visible = True
    Texte62.Visible = True
    Texte64.Visible = True
    Texte66.Visible = True
    Texte68.Visible = True
    Texte78.Visible = True
    Texte81.Visible = True
    Texte83.Visible = True
    Texte85.Visible = True
    Cocher74.Visible = True
    Cocher76.Visible = True
    Étiquette44.Visible = True
    Étiquette57.Visible = True
    Étiquette59.Visible = True
    Étiquette61.Visible = True
    Étiquette63.Visible = True
    Étiquette65.Visible = True
    Étiquette67.Visible = True
    Étiquette69.Visible = True
    Étiquette75.Visible = True
    Étiquette77.Visible = True
    Étiquette79.Visible = True
    Étiquette82.Visible = True
    Étiquette84.Visible = True
    Étiquette86.Visible = True
    End Sub

    Et voici la requête de liaison entre les deux combobox.
    Merci Hervé pour ton aide.

  59. Hervé Inisan dit :

    anais > Le problème de liaison est a un rapport avec les listes déroulantes ?

  60. Anaïs dit :

    D’accord, merci mais c’était simplement pour découvrir ce qu’était Access vu que je fais mon stage de 1 ere BTS IG donc voilà.Merci beaucoup, je l’ai créer aussi sous formulaire.Et là, je rencontre le problème de liaison entre deux formulaires ayant des requêtes comme source.

  61. Hervé Inisan dit :

    anais > L’exemple de filtrage donné dans cet article s’applique aux formulaires Access, mais pas aux pages d’accès aux données, qui se programment différemment. Par ailleurs, j’éviterais d’investir sur les pages d’accès aux données (DAPs) : voir cet autre article du blog.

  62. anaïs dit :

    Merci, oui, j’utilise Access 2003

  63. anais dit :

    oui c’est une page web access 2003

  64. Hervé Inisan dit :

    anais > La page web ?

  65. anaïs dit :

    Merci Hervé, mais NomProjet_Concerne(ou n°1) obtient bien des valeurs, c’est quand on clique dessus que toute ma page web disparaît, à part le titre.

  66. Hervé Inisan dit :

    anais > Si la 1ère liste n’affiche rien, c’est sans doute que sa source de données est incorrecte. Tant qu’elle n’est pas bonne, la 2ème ne marchera pas. Je vérifierais du côté de tous les noms d’objets…

  67. anaïs dit :

    Bonjour, quand je clique sur ma liste déroulante, je rencontre un problème, la n° 1 n’affiche rien et la n°2 ne récupère aucunes valeurs

  68. regis dit :

    ma requete: rqt_produit_par_categorie n’affiche que des champs vide quand je l’ouvre par contre

  69. Hervé Inisan dit :

    Apparemment, on a fait a peu près le tour… Difficile de voir mieux d’ici.

    C’est sûr que les noms (de champs, de tables, de requêtes, de formulaires) sont tous corrects au caractère près ?
    Dans la liste cmbProduit n’affiche rien, elle n’affiche strictement rien, ou elle affiche une liste de produits non filtrées ?

  70. régis dit :

    oui c’est cela

  71. Hervé Inisan dit :

    La source de cmbProduit est bien la requête qui met en place le filtre (qui s’appelle, je crois, rqt_produit_par_categorie) ?

  72. régis dit :

    Oui le message « Hello » s’affiche correctement aprés avoir sélectionnée une catégorie de la liste déroulante cmbcategorie, mais la cmbproduit reste toujours vide

  73. Hervé Inisan dit :

    Si tout est ok, la liste cmbCategorie devrait filtrer (mais pas trier) la liste IdProduit.

    Pour être sûr que le code VBA associé à cmbCategorie s’exécute bien, je mettrais un :

    dedans (par exemple, sous la ligne qui fait le Requery). Si un message s’affiche, c’est que ça passe par cet endroit là. Ce sera déjà une 1ère piste…

  74. régis dit :

    Oui la liste Idproduit déroule les produits, mais en fait je voudrais effectuer le trie categorie sur la cmdcategorie, puis afficher les produits des categories sur Idproduit, je viens de rentrer les paramètres sur Idproduits mais la pareil.. rien ne se passe aprés la sélection de la categorie.. normal..?

  75. Hervé Inisan dit :

    Est-ce, indépendamment de cmbCategorie, la liste IdProduit déroule bien des produits ?

  76. regis dit :

    Merci pour ces aides en effet le nom de mon formulaire n’était pas correct, et j’ai aussi changé la commande de mis à jour, maintenant je n’ai plus le message d’erreur, mais la liste produit ne m’affiche toujours aucun produit (pourtant j’ai rempli mes tables produits et catégorie), ou pensez vous que cela cloche?

  77. Hervé Inisan dit :

    D’après ce que j’ai pu voir sur les captures :

    • Est-ce que le formulaire s’appelle Sortie ou frm Sortie ? (dans la requête, il est question de frm Sortie, mais j’ai l’impression que le formulaire ne s’appelle comme ça).
    • D’autre part, dans l’événement cmbCategorie_AfterUpdate, il ne faut pas mettre à jour la liste qui vient d’être modifiée (cmbCategorie), mais plutôt la liste à filtrer. Le code serait donc plutôt : Me![IdProduit].Requery
    • J’ai cru voir aussi un champ de type TextBox qui s’appelle IdProduit et une liste déroulante qui s’appelle aussi comme ça (ce sont 2 captures différentes, je pense ?).

    J’espère que ça peut dépanner.

  78. régis dit :

    D’accord ce n’est pas possible sur table, je l’ai donc fait sur formulaire mais j’ai encore un problème..
    Lorsque je crée mes deux liste déroulante sur le formulaire ainsi que la requête et le code évènements, j’ai un message d’erreur qui s’affiche lorsque j’ouvre mon formulaire, et la liste déroulante des produits est vide..
    je mets ci joint mes imprime écran avec toute les informations, je pense avoir suivi votre topic correctement, ou se trouve l’erreur?
    http://img145.imageshack.us/my.php?image=listederoulante1qz3.png
    http://img375.imageshack.us/my.php?image=bouton1lj6.png
    http://img145.imageshack.us/my.php?image=bouton2co2.png
    http://img145.imageshack.us/my.php?image=codeby0.png

  79. Hervé Inisan dit :

    La liste déroulante au niveau des tables ne peut servir qu’aux choses suivantes :

    • Permettre d’alimenter un champ de la table (une clef étrangère généralement) en allant chercher sa valeur dans une autre table (la clef primaire de l’autre table).
    • Donner de l’ergonomie aux tables.
    • Définir une relation entre les 2 tables (dans la fenêtre Relations).

    Mais elle s’arrête à ce stade là, on ne peut rien en faire d’autre à ce niveau (notamment la filtrer dynamiquement). Donc il faut effectivement intervenir au niveau du formulaire. Je n’ai pas toutes les infos sur le projet, mais le formulaire complète en principe la table au niveau possibilités (du fait qu’on peut le programmer, et pas la table). Donc on n’a pas de raison de « perdre des infos » (les autres champs de la liste) dans le formulaire…

  80. régis dit :

    Je n’arrive pas à effectuer cela sur formulaire, mais le problème c’est que même si je fais cela sur formulaire cela ne m’avancera à rien puisque j’ai d’autre champs dont ce sert la table, à savoir quantité, prix unitaire, et date, qui me serve ensuite à gérer mes stocks, c’est pour cela que je veux le faire une liste déroulante sur une table et non un formulaire, vous voyez? vous n’avez pas une solution..?

  81. Hervé Inisan dit :

    L’opération de mise à jour de la liste doit être faite au niveau du formulaire. D’autre part, ça ne marchera correctement que sur un formulaire en mode Colonne simple (en tabulaire, il y a des effets de bord dûs à la gestion des enregistrements par Access).

  82. régis dit :

    Non j’ai déjà essayé cela et en fait cela m’affiche tous les produits, cela n’effectue pas le trie de la catégorie choisi.

    Je mets un lien de mes tables avec le résultat de la requête si cela peut éclaircir les choses parce que je ne voit pas la solution..
    http://img441.imageshack.us/img441/
    Merci

  83. Hervé Inisan dit :

    S’il faut lister les produits d’une catégorie, ça ne serait pas plutôt :

    ?

  84. regis dit :

    Bonjour
    je voudrais effectuer la même requête sur une table, c’est à dire que je voudrais réaliser une requete pour effectuer un premier tri, j’entend par la rentrer une catégorie dans une premiere liste déroulante et je veux que la deuxieme liste déroulante (produit) ne m’affiche que les produits dans la catégorie sélectionner auparavant.

    J’ai une table tbleproduit avec idproduit, nomproduit, idcategorie
    une table tblcategorie avec idcategorie, categorie
    une table entree avec idligneentree, idcategorie, idproduit, …

    j’ai saisi la requete suivante mais elle ne fonctionne pas comme je le veux (elle affiche tout les produits en double)
    SELECT tp.idproduit, tp.Nomproduit
    FROM TblProduit AS tp, TableEntree AS te
    WHERE tp.Idcategorie=te.Idcategorie;
    Pouvez vous me dire ce qu’il y a a rectifier, je vous remercie si vous pouvez voir cela.

    Cordialement regis

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *