Comment ajouter des valeurs à une liste déroulante dans Microsoft Access
Les listes déroulantes dans Microsoft Access sont des contrôles essentiels pour faciliter la saisie de données en affichant une liste de valeurs issues d'une table ou d'une requête. Cependant, il est souvent nécessaire de permettre à l'utilisateur d'ajouter de nouvelles valeurs directement depuis cette liste, surtout lorsque la valeur souhaitée n'existe pas encore dans les données source.
Origine des valeurs dans une liste déroulante
En général, la valeur affichée dans une liste déroulante provient d'un enregistrement d'une table liée ou d'une requête. Comme cette liste est dérivée d'une source de données, il faut prévoir un mécanisme pour ajouter de nouveaux enregistrements dans la table sous-jacente qui alimente la liste.
L'événement NotInList : clé pour l'ajout dynamique
Lorsqu'un utilisateur entre une valeur qui ne figure pas dans la liste déroulante, l'événement NotInList se déclenche, à condition que la propriété LimitToList soit définie sur Oui. Cet événement permet d'intercepter la saisie d'une valeur inconnue et de programmer une procédure qui offre la possibilité d'ajouter la nouvelle valeur dans la source de données.
La procédure événementielle NotInList comporte un argument important, Response, qui informe Access de ce qu'il doit faire après l'exécution de la procédure :
- acDataErrAdded : la procédure a réussi à ajouter la nouvelle valeur dans la source.
- acDataErrDisplay : la procédure n'a pas ajouté la nouvelle valeur et Access affiche le message d'erreur par défaut.
- acDataErrContinue : la procédure affiche un message personnalisé et Access n'affiche pas le message d'erreur par défaut, mais invite l'utilisateur à saisir une valeur correcte.
Exemple pratique : ajouter automatiquement un élément à la liste déroulante
Pour illustrer cette fonctionnalité, créez une table simple, par exemple nommée tblIntitulés, avec un champ texte nommé "Intitulé". Vous pouvez insérer quelques valeurs pour démarrer.
Lire aussi: Modifier Activité Kbis Auto-Entrepreneur
Ensuite, créez un formulaire non basé sur cette table. Placez-y une liste déroulante liée à tblIntitulés. Nommez cette liste déroulante, par exemple cmbListe, et assurez-vous que sa propriété Limiter à liste est réglée sur Oui pour activer l'événement NotInList.
Dans le code VBA associé à l'événement NotInList de cette liste, insérez une procédure pour intercepter la saisie d'une nouvelle valeur et la stockage dans la table :
Private Sub cmbListe_NotInList(NewData As String, Response As Integer) Dim rst As DAO.Recordset If MsgBox("L'élément [" & NewData & "] ne figure pas dans la liste. Voulez-vous l'ajouter ?", vbYesNo) = vbYes Then Set rst = CurrentDb.OpenRecordset("tblIntitulés") rst.AddNew rst!Intitulé = NewData rst.Update rst.Close Set rst = Nothing Response = acDataErrAdded Else Response = acDataErrDisplay End IfEnd SubCette procédure demande à l'utilisateur s'il souhaite ajouter la valeur inconnue. En cas d'accord, elle ouvre un recordset DAO sur la table, ajoute la nouvelle valeur et informe Access du succès. Sinon, Access affiche son message d'erreur.
Comportement de la saisie et affichage immédiat dans une liste déroulante
Il peut arriver que, lors de la frappe d'une lettre dans une liste déroulante, la saisie complète du mot correspondant ne s'affiche pas immédiatement. Ce comportement dépend du paramétrage et de la source des données :
- Si la liste est basée sur une table ou une requête, à l'ouverture du formulaire, la liste ne propose souvent que la première lettre tapée, obligeant l'utilisateur à dérouler manuellement la liste.
- En revanche, si la liste est fondée sur une "liste de valeurs" (saisie manuelle des options dans la propriété appropriée), la saisie affichera immédiatement le mot complet correspond au premier caractère entré, même après la réouverture du formulaire.
Cette différence vient du type et de la gestion de la source de données. En effet, l'affichage immédiat du mot complet (autocomplétion) dans la zone déroulante est plus fluide avec une liste de valeurs statique qu'avec des sources dynamiques.
Lire aussi: INPI et Micro-Entreprise : Démarches
Gestion des listes déroulantes dépendantes et navigation entre plusieurs listes
Dans des cas plus complexes, plusieurs listes déroulantes peuvent être reliées pour filtrer dynamiquement leurs contenus en fonction des choix précédents. Par exemple, un formulaire peut comporter trois listes déroulantes :
- Une liste des départements (liste dep),
- Une liste des villes (villes) filtrée selon le département sélectionné,
- Une liste des activités (activites) filtrée selon la ville et le département choisis.
On utilise des requêtes SQL avec clauses DISTINCT pour ne montrer que des valeurs uniques, et des clauses WHERE pour filtrer sur les sélections précédentes. L'actualisation s’effectue au moyen de l'événement Change de chaque liste, qui déclenche la méthode DoCmd.Requery, ce qui met à jour les contenus.
Pour éviter les incohérences, il est également utile de vider les listes dépendantes lors d'un changement dans la liste parente. Par exemple, changer de département doit effacer la sélection dans la liste des villes et dans la liste des activités pour éviter d'afficher des choix non pertinents.
Ajouter ou modifier dynamiquement les éléments d’une liste déroulante en VBA
Outre l'ajout d’enregistrements dans la source de données, vous pouvez également manipuler directement les éléments d’une liste déroulante via VBA. Pour les listes comportant plusieurs colonnes, il est possible d’ajouter un élément en formatant la chaîne comme suit : "1010;rouge;grand" pour une liste à trois colonnes. Les éléments s’ajoutent en commençant par la colonne la plus à gauche si l'argument contient moins de chaînes que le nombre de colonnes.
Pour ajouter un élément à la fin ou au début de la liste, vous pouvez manipuler sa propriété RowSource ou utiliser une méthode VBA qui insère des éléments selon la position souhaitée.
Lire aussi: Comment Calculer la TVA ?
Conseils pratiques et erreurs fréquentes
- Vérifiez que la propriété Limiter à liste est bien réglée sur Oui pour activer l'événement NotInList.
- Assurez-vous que la liste déroulante utilise une source dynamique (table ou requête), et non une liste de valeurs statique si vous souhaitez ajouter des éléments.
- Contrôlez que le nom de la liste déroulante est bien identifié (par exemple, cmbListe) pour coder correctement les événements.
- Si à l'ouverture du formulaire l'autocomplétion ne fonctionne pas, testez en recréant la liste sur une table fraîche, et observez si le comportement diffère selon la méthode choisie.
Editer une liste déroulante sur un formulaire Access
Avec ces bases et bonnes pratiques, vous serez en mesure d'améliorer l'expérience utilisateur dans vos bases Access en proposant des listes déroulantes interactives et adaptatives.
balises:
