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 ?
La liste déroulante est dotée d'un événement "Sur absence dans liste" (NotInList). Voici comment l'utiliser :
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.
Créez ensuite un formulaire (non basé sur la table tblIntitulés).
Sur le formulaire, placez une liste déroulante, qui sera construite sur la table tblIntitulés.
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é).
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 DAO.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.