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 !
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.
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
etbtnAnnuler
.
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 :
- Affichez votre formulaire en mode Création.
- 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.
- Vous accédez au module VBA du formulaire. Recopiez-y cette portion de code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
' --- ' TRANSFERER 1 ELEMENT D'UNE LISTE A L'AUTRE ' --- Private Sub TransfererUn( _ lstSource As ListBox, _ lstCible As ListBox) ' Vérifier qu'un élément est sélectionné If lstSource.ListIndex = -1 Then MsgBox "Sélectionnez un élément au préalable !", vbInformation Exit Sub End If ' Déplacer l'élément dans l'autre liste lstCible.AddItem lstSource ' ... et le supprimer de la liste de gauche lstSource.RemoveItem (lstSource.ListIndex) End Sub |
Il faut maintenant que les boutons « >
» et « <
» appellent ce code. Ajoutez du coup ceci dans le module :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
' --- ' SELECTION D'UN ELEMENT ' --- Private Sub btnSelectionnerUn_Click() TransfererUn Me.lstMois, Me.lstMoisSelectionnes End Sub ' --- ' DESELECTION D'UN ELEMENT ' --- Private Sub btnDeselectionnerUn_Click() TransfererUn Me.lstMoisSelectionnes, Me.lstMois End Sub |
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
' --- ' DOUBLE-CLIC POUR SELECTIONNER UN MOIS ' --- Private Sub lstMois_DblClick(Cancel As Integer) btnSelectionnerUn_Click End Sub ' --- ' DOUBLE-CLIC POUR DESELECTIONNER UN MOIS ' --- Private Sub lstMoisSelectionnes_DblClick(Cancel As Integer) btnDeselectionnerUn_Click End Sub |
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
' --- ' SELECTION DE TOUS LES ELEMENTS ' --- Private Sub btnSelectionnerTout_Click() TransfererTout Me.lstMois, Me.lstMoisSelectionnes End Sub ' --- ' DESELECTION DE TOUS LES ELEMENTS ' --- Private Sub btnDeselectionnerTout_Click() TransfererTout Me.lstMoisSelectionnes, Me.lstMois End Sub ' --- ' TRANSFERER TOUS LES ELEMENTS D'UNE LISTE A L'AUTRE ' --- Private Sub TransfererTout( _ lstSource As ListBox, _ lstCible As ListBox) Dim lngI As Long ' Copier les éléments dans la liste cible For lngI = 0 To lstSource.ListCount - 1 lstCible.AddItem lstSource.ItemData(lngI) Next ' Vider les éléments de la liste source For lngI = lstSource.ListCount - 1 To 0 Step -1 lstSource.RemoveItem (lngI) Next End Sub |
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
' --- ' FERMETURE DU FORMULAIRE ' --- Private Sub btnAnnuler_Click() DoCmd.Close End Sub ' --- ' VALIDATION DU FORMULAIRE ' --- Private Sub btnOK_Click() Dim lngI As Long Dim strListeMois As String strListeMois = "Votre sélection :" & vbCrLf For lngI = 0 To Me.lstMoisSelectionnes.ListCount - 1 strListeMois = strListeMois & Me.lstMoisSelectionnes.ItemData(lngI) & vbCrLf Next MsgBox strListeMois, vbInformation End Sub |
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 ! 🙂
Très chère Mr Hervé Inisan,
Merci beaucoup pour votre travaille et tous ces tutoriel !!
Merci pour le retour ! 🙂
Aurélien > Je n’ai pas d’Access 2003 sous la main, mais de mémoire,
ItemData()
existe bien sur cette version.ListBox
?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 ?
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ù.
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 =/
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.
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
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
Angel > Par exemple :
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
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 !
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.
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 ! 🙂
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…
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.
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
Non j’ai vérifié mais je pense que le problème vient de mes autres fonctions. bonne journée et encore merci
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 ?
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 😉
maxime > Super. Content que ça marche !
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!!!!!!
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…
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?
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.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