Sélecteur par listes : version 1

Le but de cet article est de construire un sélecteur de valeurs à l’aide de listes, à la manière des Assistants Access. Cette première version n’est pas forcément hyper pratique, mais on va déjà poser les bases pour aménager plus tard !

Test

Principe

Dans cette version, la liste de gauche est une liste de mois (une chaîne de caractères à chaque fois), et la liste de droite est vide. Le transfert d’une liste à l’autre va se faire en VBA, à l’aide des méthodes AddItem et RemoveItem. Ces méthodes ont déjà été traitées dans l’article Ajouter un élément statique à une liste.

Info
Si votre liste de départ est basée sur une table/requête plutôt que sur des valeurs, consultez la suite de cet article : Sélecteur par listes : version 2.

Etape 1 : construire le formulaire

Construisez un formulaire en mode Création, donc vide. Placez-y les éléments accessoires (le titre par exemple), et surtout les éléments suivants :

  • Une liste des mois disponibles (objet ListBox nommé lstMois).
  • Une liste vide (objet ListBox nommé lstMoisSelectionnes).
  • 4 boutons pour la sélection d’un seul mois (btnSelectionnerUn), la désélection d’un seul mois (btnDeselectionnerUn), la sélection de tous les mois (btnSelectionnerTout), et la désélection de tous les mois (btnDeselectionnerTout). On considère qu’une sélection consiste à faire passer un ou plusieurs mois de gauche à droite, et qu’une désélection… fait l’inverse !
  • 2 boutons pour l’interface générale : btnOK et btnAnnuler.

Lors de la création des listes déroulantes, un Assistant devrait s’afficher. Choisissez l’option « Je taperai les valeurs souhaitées« , puis tapez les mois de l’année pour la première liste, et rien pour la seconde.

Etape 2 : gérer le transfert simple d’une liste à l’autre

Qu’il soit de la gauche vers la droite ou de la droite vers la gauche, le transfert d’un élément est le même. On va donc centraliser ce transfert dans une procédure :

  1. Affichez votre formulaire en mode Création.
  2. Sous Access 2007 ou 2010, cliquez sur l’icône Visualiser le code. Dans les versions antérieures, l’icône s’appelle simplement Code.
  3. Vous accédez au module VBA du formulaire. Recopiez-y cette portion de code :

Il faut maintenant que les boutons « > » et « < » appellent ce code. Ajoutez du coup ceci dans le module :

A ce stade, pour pouvez passer en mode Création et cliquer sur les 2 boutons pour les tester.

Petite amélioration

Pour améliorer l’ergonomie, on va également faire en sorte qu’un double-clic sur un élément d’une liste sélectionne cet élément. Il suffit que l’événement Sur double clic de chaque liste appelle le bouton correspondant. Ajoutez encore ceci au module :

Rappel
Pour que vos boutons fonctionnent, ils doivent avoir été nommés précisément btnSelectionnerUn et btnDeselectionnerUn. De même, les listes s’appellent lstMois et lstMoisSelectionnes.

Etape 3 : gérer le transfert intégral d’une liste à l’autre

On peut maintenant s’occuper des boutons « >> » et « <<« . Le principe est le même : une procédure centralisée pour transférer tous les éléments d’une liste à l’autre, et 2 procédures événementielles associées aux boutons. Ajoutez encore tout ceci au module :

Etape 4 : exploiter la sélection

Il n’y a pas grand chose à faire des mois sélectionnés, pour l’instant ! Mais on va quand même afficher le résultat de la sélection, en ajoutant ce code au module :

On peut imaginer d’autres traitements plus intéressants par la suite : filtrer un formulaire, un état… Ce tutoriel est fait pour donner des idées…  A vos commentaires ! 🙂

Vous aimerez aussi...

26 réponses

  1. lnoiro dit :

    Très chère Mr Hervé Inisan,

    Merci beaucoup pour votre travaille et tous ces tutoriel !!

  2. Hervé Inisan dit :

    Aurélien > Je n’ai pas d’Access 2003 sous la main, mais de mémoire, ItemData() existe bien sur cette version.

    • Est-ce que les objets manipulés sont bien des ListBox ?
    • Est-ce que les noms de tes objets sont valides ?
  3. Aurélien dit :

    Bonjour,
    Tout d’abord merci pour votre article très complet et extrêmement bien détaillé.
    J’ai une petite question, j’ai réalisé un projet du même type sur ACCESS 2007 avec la méthode « ItemData » et je voudrais réutiliser les codes mais cette fois-ci sur ACCESS 2003 (VBA 6.0) et au moment d’exécuter le code j’obtiens un message d’erreur :
    « Erreur de compilation
    Membre de méthode ou de données introuvables »

    Connaissez vous une solution pour contourner ce problème ?

  4. Hervé Inisan dit :

    Christophe > Ça voudrait dire qu’il y quelque part dans ta version un type de données qui est incorrect. Vérifie les types de données des variables, et ceux des listes au cas où.

  5. Christophe dit :

    Bonjour,

    Hum… Je ne comprend pas vraiment pourquoi, mais chez moi quand je veux utiliser le bouton ajouter, il me dit qu’il y a une incompatibilité de type =/

  6. Hervé Inisan dit :

    daniel15 > Dans les propriétés de la liste, onglet Format, on peut arriver à quelque chose avec les propriétés Couleur Fond et Couleur Texte.

  7. daniel15 dit :

    Bonjour, Je cherche à modifier la couleur de sélection d’une ligne dans une liste déroulante.
    Par défaut, la couleur est noire, et le texte devient illisible.
    Connaîtriez-vous le paramètre à modifier ?
    Merci beaucoup
    daniel

  8. Angel dit :

    Bonjour,

    Je suis à la retraite et comme d’autre font des mot croisés moi je me suis lancé dans la création d’une base relationnelle pour gerer la vie cotidienne du retraité Rendez vos courrier dossier comptes photos voiture ext
    Je n’ai aucune connaissance ni formation et la maniére dont vous distilé les informations « bien que derooutante au debut » est très interessante car  » vous ne nous donnez pas le poissons tout cuit mais nous apprenez à le ferrer « 
    Merci
    Cordialement

  9. Hervé Inisan dit :

    Angel > Par exemple :

  10. Angel dit :

    Bonjour,
    J’ai un formulaire de recherche ou je peux rechercher sur 3 critéres CbdNom, CbdCP, CndVille,qui filtre un sous formulaire Resultat
    Comment, sur bouton Clic, après une recherche vider ou remetre à zero les Cbd Nom CP Ville ?
    J’éspére me faire comprendre
    Cordialement

  11. Hervé Inisan dit :

    Jean-Guy > Effectivement, l’exemple donné repose sur des .AddItem avec une seule valeur (donc une seule colonne).

    La version 2 repose sur une table (une requête plutôt), et permet d’afficher plusieurs colonnes. Cet article-ci et l’autre que j’ai donné en lien servent d’ailleurs de base de travail. Version 2 prévue le 30 juin !

  12. Jean-Guy dit :

    Merci de vos réponses, Hervé.

    En attendant, j’ai tapé manuellement les départements. mais j’ai le même problème. En fait, lorsque j’ai tapé les N° et les noms de départements, l’assistant me donnait le choix d’insérer une colonne. Ce que j’ai fait, une pour le numéro et l’autre pour le nom … Eh bien, ça fait pareil que lorsque je me servais du tableau pour remplir la listeBox. Si j’ai bien compris, on doit remplir manuellement une seule et unique colonne pour que la méthode fonctionne, j’ai fait un test avec quelques valeurs, et là, votre tuto fonctionne très bien.

    Vivement la version 2 !!!

    D’autre part, merci également pour le lien de l’autre article.

  13. Hervé Inisan dit :

    Romain, Jean-Guy > J’ai un peu plus de temps ces jours-ci. J’ai commencé la préparation de l’article « Sélecteur par listes : version 2« . Bientôt dans les bacs ! 🙂

  14. Hervé Inisan dit :

    Romain, Jean-Guy > Je n’ai pas encore pris le temps d’écrire la « version 2 » de cet article, basée sur des tables plutôt que sur des valeurs statiques. 🙁

    En attendant, cet autre article présente une autre méthode, à base de cases à cocher. Ça peut peut-être donner des pistes…

  15. Jean-Guy dit :

    Bonjour.

    Je débute vraiment sur access, alors en cherchant des exemples ou tutos, je suis tombé sur le votre qui ressemble à ce que je souhaite faire. Mais j’ai une erreur:

    erreur d’execution 6014: La propriété OrigineSource doit être définie à la valeur « liste valeurs » pour utiliser cette méthode.

    Ce que je comprends bien.

    Pour mon exercice, lieu de choisr les mois de l’année, je selectionne des départements.

    La grande différence est que je rempli ma première liste box par une table ayant une colonne pour les N° de département et une autre pour leur nom, je n’entre pas les valeurs manuellement dans la lisbox.

    Donc je voudrai séléctionner le N° et le nom des départements choisis sur la listbox de sélection.

    Y aurait il un tuto aussi bien fait (moi qui suis novice en la matière) qui me permettrai d’arrivé a mes fins.

    En vous remerciant de votre aide.

  16. romain dit :

    Bonjour,

    C’est exactement ce que je voudrais faire sauf que ma liste source est issue d’une requête (je recherche tous les clients dont le nom contient « * ») pour alimenter en sortie une table. Cela me permettrait de limiter mes recherches en fonction de l’avancement du projet.

    J’ai suivi, la procédure ci-dessous mais ça ne marche pas (notamment à cause des origine source qui ne sont pas sur liste valeurs).

    Merci d’avance pour vos éclaircissements

  17. maxime dit :

    Non j’ai vérifié mais je pense que le problème vient de mes autres fonctions. bonne journée et encore merci

  18. Hervé Inisan dit :

    maxime > Merci pour le retour. Mais a priori, l’état de la sélection n’est pas mémorisé dans l’exemple. Qu’on sélectionne 1 mois ou 12, la liste de droite devrait s’afficher à vide à chaque nouvelle ouverture du formulaire. Il n’y aurait pas un truc en trop dans ta liste de droite ? Notamment : sa propriété Contenu est bien vide ?

  19. maxime dit :

    Hervé> Je voulais faire une remarque sur le code car j’ai remarqué que losrque l’on click sur le bouton annuler le formulaire se ferme. Cependant cette action peut poser problème car si on a préalablement selectionné tous les mois,lors des prochaines réouverture du formulaire ils seront placés à droite. Bref, en ce qui me concerne j’ai retiré le bouton annuler car il ne me servait pas. Mais je poste ce commentaire au cas ou quelqu’un en aurait besoin 😉

  20. Hervé Inisan dit :

    maxime > Super. Content que ça marche !

  21. maxime dit :

    Hervé> Merci beaucoup!!!!! grace à ta remarque j’ai constaté que je n’avais pas choisi « Je taperai les valeurs souhaitées » pour la liste lstMoisSelectionnes et maintenant ca marche!!!!!!

  22. Hervé Inisan dit :

    maxime > En fait, le problème doit venir de la construction de la liste. Comme il est dit dans l’article, au moment de la construction, il faut choisir l’option « Je taperai les valeurs souhaitées ». Ce qui règle correctement la propriété RowSourceType. Sinon, il est possible de la modifier manuellement après : dans les propriétés de la liste, onglet Données, il faut régler « Origine Source » sur « Liste Valeurs« .

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

  23. maxime dit :

    Bonjour, Merci pour ce site vraiment génial!!
    Je rencontre pour la première fois un problème. Lorsque je tente d’ajouter un mois dans la liste lstMoisSelectionnes J’ai un message d’erreur : La propiété RowSourceType doit être définie sur la valeur Liste valeurs pour utiliser cette méthode. j’ai donc essayer de modifier la ligne suivante « lstCible.AddItem lstSource  » mais aucun résultat positif. Pouvez Vous m’aider?

  24. Hervé Inisan dit :

    Philindy26 > Effectivement, AddItem ne date que d’Access 2002. L’équivalent sous Access 2000 est plus lourd, il est présenté sur cet autre article.

  25. Philindy26 dit :

    Je travaille sous Access 2000 et AddItem ne fonctionne pas.
    j’ai une erreur de compilation : Membre de méthode ou de données introuvable.
    Que doit-je remplacer ?
    Merci beaucoup d’avance
    Philindy26

Laisser un commentaire

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