<Retour Grenier>

Début de page Question

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 ?

Pour utiliser ce qui suit, vous avez besoin de savoir taper du code Visual Basic dans un module Access, compiler du code, et exécuter du code.

 

Début de page Réponse

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.
  1. Créez ensuite un formulaire (non basé sur la table tblIntitulés).
  1. Sur le formulaire, placez une liste déroulante, qui sera construite sur la table tblIntitulés.
  1. 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é).
  1. Enfin, écrivez le code Visual Basic suivant dans l'événement "Sur absence dans liste" :
Private Sub cmbListe_NotInList(NewData As String, Response As Integer)
Dim rst As Recordset

If MsgBox("L'élément [" & NewData & "] ne figure pas dans la liste. Voulez-vous l'ajouter ?", vbQuestion + vbYesNo) = vbYes Then
	' Ajouter l'élément à la liste
	Set rst = CurrentDb.OpenRecordset("tblIntitulés")
	rst.AddNew
		rst!Intitulé = NewData
	rst.Update
	rst.Close
	Set rst = Nothing
End If

' Annuler le message d'erreur d'Access
Response = acDataErrAdded
End Sub
 

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.
Pour plus de détails, consultez l'aide en ligne sur l'objet Recordset et sur l'événement NotInList.