Ajouter un élément dans une liste déroulante

J’ai une liste déroulante basée sur une table. Si l’utilisateur tape une valeur qui ne figure pas dans la liste, je voudrais l’ajouter automatiquement dans la table (et dans la liste). Comment faire ?

L’événement NotInList

La liste déroulante est dotée d’un événement Sur absence dans liste (NotInList). Voici comment l’utiliser :

  1. Créez une table comportant un champ Intitulé, de type Texte. Nommez cette table tblIntitulés. Renseignez éventuellement quelques valeurs dans cette table, à titre d’essai.
  2. Créez ensuite un formulaire (non basé sur la table tblIntitulés).
  3. Sur le formulaire, placez une liste déroulante, qui sera construite sur la table tblIntitulés.
  4. Faites apparaître les propriétés de la liste déroulante (par un clic droit sur la liste). Définissez le nom (cmbListe par exemple), et réglez la propriété Limiter à liste sur Oui (sinon, l’événement Sur absence dans liste ne sera pas déclenché).
  5. Enfin, écrivez le code Visual Basic suivant dans l’événement Sur absence dans liste :

Important
L’exemple de code ci-dessus fait appel à la bibliothèque DAO (Microsoft DAO Object Library). Cette bibliothèque doit être associée à votre base de données pour que le programme fonctionne.

Pour plus de détails sur les références, consultez cette page.

Quelques compléments

  • Le code Visual Basic ajoute l’élément nouveau dans la table (via un Recordset), puis définit la variable Response à acDataErrAdded de façon à ce que le message d’erreur d’Access ne se produise pas et que la liste soit mise à jour.
  • L’événement NotInList ne reçoit qu’un seul argument NewData. Ca veut dire que le bout de code ci-dessus n’est pratique que si la table à alimenter ne contient qu’un seul champ (l’intitulé, ici). S’il s’agit d’une table plus complexe, il vaut mieux prévoir un formulaire pour l’alimenter.
  • Pour plus de détails, consultez l’aide en ligne sur l’objet Recordset et sur l’événement NotInList.

Vous aimerez aussi...

13 réponses

  1. Hervé Inisan dit :

    az0te > Un premier article sera en ligne demain, sur ce sujet. Stay tuned!

  2. az0te dit :

    Excusez moi de ma questions je l’ai posé sans même lire les commentaires précedent. Par contre si vous connaitriez une solution qui se trouve ailleur sur internet je suis volontier preneur j’ai passer pas mal de temps a chercher et je bloque.

  3. az0te dit :

    Merci pour ce post qui m’a été très utile pour une partie de mon application. Mais maintenant mon absence dans liste n’est plus si simple dans ma table liée à la liste il y a plusieurs champs à renseigner. D’où ma question, est-il possible de modifier ce code pour l’adapter à mon problème ?
    Merci d’avance.

  4. Hervé Inisan dit :

    Hayet > Je suppose que la fiche Client contient plus d’un champ. Ça veut dire que cet article n’est pas adapté : la technique donnée ici ne permet d’ajouter automatiquement qu’un seul champ dans la table. Ce qu’il faut faire, c’est plutôt :

    1. Prévoir un formulaire Clients pour alimenter la table Clients.
    2. Faire en sorte d’ouvrir ce formulaire pour permettre à l’utilisateur d’ajouter un client.
    3. Éventuellement prévoir d’actualiser la liste en cas de retour sur le formulaire initial.

    Tout ça peut d’ailleurs être un peu simplifié depuis Access 2007. Je vais préparer quelques petits articles sur le sujet…

  5. Hayet dit :

    Bonjour
    J’ai une liste déroulante qui contient la liste de mes clients, et je souhaite rajouter un nouveau client à la liste déroulante.
    Comment faire
    Merci

  6. uls dit :

    C’est super, ça marche. Merci

  7. Hervé Inisan dit :

    uls > Sur le principe, il faudrait mettre quelque chose comme ce qui suit dans l’événement Après MAJ de la liste déroulante :

    … en mettant des True pour activer une zone de saisie, des False pour la désactiver.

    Il faut bien sûr que tu adaptes à ton cas. Dans mon exemple, la liste contient les mots « Trimestre 1 », « Trimestre 2 », etc. (tu n’as pas forcément la même chose). Et j’ai supposé que les zones de saisie s’appellent txtJanvier, txtFevrier, etc.

    Pour faire mieux, on pourrait nommer les zones txtSaisie01, txtSaisie02, … txtSaisie12. Ça permettrait d’avoir moins de code, en traitant les zones par boucle.

  8. uls dit :

    Bonjour,
    En fait mon formulaire renseigne une table des mois de l’année. Mais dans ma liste déroulante, j’ai les quatre trimestres. Je souhaite que lorsqu’un utilisateur sélectionne le 1er trimestre seul les mois janvier, février, mars sont actifs et les autres sont grisés, impossible de renseigner une donnée.

  9. Hervé Inisan dit :

    uls > Est-ce que tu peux préciser la question ?

  10. uls dit :

    Bonjour,
    J’aimerai griser des champs dans mon formulaire en fonction de la sélection dans une liste déroule du formulaire,

  11. JNANSLIJN dit :

    code intéressant

  12. Hervé Inisan dit :

    KingRise > S’il faut affecter le nouvel élément au formulaire de départ (c’est bien ça ?), il faudrait ajouter en fin de code quelque chose comme :

    Me![cmbListe] = NewData

  13. Kingrise dit :

    Bonjour, merci pour ce site qui est très bien organisé.
    J’ai juste une question concernant ce code. Comment faire pour que l’enregistrement nouvellement créé soit automatiquement afficher dans le formulaire (création d’un nouvel enregistrement) pour modifier les autres champs du formulaire ?

Laisser un commentaire

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