Ajouter un élément statique à une liste déroulante

Dans un formulaire, j’ai une liste déroulante indépendante (basée sur une liste de valeurs tapées manuellement, et non pas basée sur une table). Je souhaiterais en VBA ajouter des éléments à cette liste. Comment faire ?

Info
Si votre liste déroulante est alimentée par une table, consultez plutôt cet autre article.

A partir d’Access 2002

Depuis Access 2002, les listes déroulante disposent d’une nouvelle instruction – AddItem – qui permet d’ajouter un élément à une liste déroulante.

A supposer que la liste déroulante ci-dessus se nomme cmbListe, que vous avez créé un bouton de commande nommé btnTest, et que c’est ce bouton qui doit ajouter les éléments « Lundi » et « Mardi » dans la liste (ça en fait des conditions !), vous programmerez l’événement Sur clic du bouton btnTest comme suit :

Avant Access 2002

Access 97 et 2000 ne disposent pas de l’instruction AddItem. Il faut alors redéfinir entièrement la propriété Contenu (en anglais : RowSource) de la liste déroulante. Pour obtenir le même résultat que précédemment (une liste contenant Essai 01, Essai 02, Essai 03, Lundi, Mardi), vous définirez l’événement Sur clic du bouton btnTest comme ceci :

Et si ma liste déroulante comporte 2 colonnes ?

Dans ce cas, la propriété Contenu (RowSource) vaut au départ quelque chose comme :
ABC;Essai 01;DEF;Essai 02;GHI;Essai 03
(ABC, DEF et GHI sont les éléments de la 1ère colonne, tandis que les 'Essai 0x' sont les éléments de la seconde colonne).

Le code Access 2002+ devient alors :

Le code Access 97/2000 devient :

Et si je souhaite supprimer un élément de la liste ?

Z’en avez des questions, dites donc ! En repartant de l’exemple ci-dessus (liste à 2 colonnes), voici deux variantes pour supprimer la 1ère ligne (ABC;Essai) de la liste. On utilise la méhode RemoveItem, apparue uniquement depuis Access 2002, en lui transmettant soit le numéro de la ligne à supprimer, soit la clef qui identifie la ligne :

Notez que la 1ère ligne est numérotée 0.
On peut aussi écrire :

Dans Access 97/2000, pas de RemoveItem. Il faut donc redéfinir à nouveau la propriété RowSource, en « oubliant » un élément. Ce qui donne :

Attention
Les éléments sont ajoutés à la liste à l’exécution du programme, et seulement pendant l’ouverture du formulaire. Concrètement, quand vous refermez le formulaire, la liste déroulante retrouve le nombre d’éléments qu’elle avait en mode Création. C’est normal ! Si vous voulez que la liste conserve définitivement ses éléments, vous devez :

  • soit ajouter ses valeurs en mode Création ;
  • soit la baser sur une table.

Vous aimerez aussi...

6 réponses

  1. bouabdellah dit :

    Merci Hervé
    est que existe une solution en VBA pour récupérée la liste des valeur d’une liste déroulant d’une table pour alimentée la liste d’un formulaire, je précise la liste des valeur pas les élément saisie car la liste de table peut reçois plusieurs valeurs hors liste , je veut un code comme
    Me.cboCommune.RowSource = fld.RowSource « Apres avoir instancie la base et la table » et Merci d’avance

    • Hervé Inisan dit :

      Je ne vois pas l’utilisation de la liste. Si le formulaire est basé sur la table, la liste déroulante de la table devrait être reprise automatiquement sur le formulaire.
      Ou bien il s’agit d’autre chose ?

  2. Georges dit :

    Merci bien les amis

  3. Hervé Inisan dit :

    dominique > Effectivement, la syntaxe est moins cohérente que sous .NET ! On peut effectivement boucler sur les éléments de la liste et invoquer des RemoveItem, mais il est aussi possible de faire ça :

    Me.NomDeLaListe.RowSource = ""

  4. dominique dit :

    Et si je souhaite effacer une liste entière ?

    je pensais que le .cls ou .clear existerait et bien c’est raté.
    Il ne faut quand même pas, j’espère, boucler sur tous les items et faire un RemoveItem ??

    Ah!! quand on a gouté au vb.net et que l’on revient sur Access !!

  5. Florence ziwat dit :

    Merci pour l’info 🙂

Laisser un commentaire

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