Ajouter un élément dans une liste déroulante – Episode 2

Ces articles pourraient également vous intéresser...

22 réponses

  1. bisko dit :

    Bonjour Hervé

    Tout d’abord merci de bien vouloir m’accompagner dans mes recherches car tu dois avoir d’autres choses plus urgentes à faire. Je suis un papy qui s’essaie à Access et qui compte y arriver. J’ai donc tout repris à zéro.
    Mon problème est simple. J’ai 3 tables : « Clients (N°(auto), Nom, Prenom et Adresse)», « Medicaments (NumMed(auto), Code, Nom, PrixHT) « et « Délivrés (N°(auto),NumClient, DMedicament,Quantite)»
    J’ai créé un formulaire avec sous-formulaire basé sur la table « Clients » pour le premier et la table « Délivrés » pour le second. Le sous-formualire se présente sous la forme d’un cadre avec plusieurs lignes situées les unes à la suite des autres puisque les deux formulaires sont liés par N° de « Clients » et NumClient de « Délivrés ».
    Je recherche un client dans une zone de liste déroulante indépendante et si ce client existe, il apparaît normalement dans les contrôles dépendants « nom, prenom, adresse » du formulaire principal. S’il est inexistant, je le créé grâce à ton conseil via un bouton « Ajouter client » et le client apparaît dans la liste déroulante. Toutefois, je dois refermer le formulaire puis le réouvrir pour que la liste se mette à jour et remplisse les contrôles dépendants « nom, prenom, adresse » du formulaire principal. C’est une bidouille, je l’admets car pas très académique.
    Dans le sous-formulaire, je sélectionne un produit grâce à un contrôle (liste déroulante) dont la source est « IDMedicament » et dont le contenu est un « SELECT Medicaments.NumMed, Medicaments.NOM, Medicaments.CODE, Medicaments.PRIXHT FROM Medicaments ORDER BY Medicaments.NOM;
    Lorsque je recherche un médicament, celui-ci s’affiche dès lors qu’il existe. Par contre, s’il est inexistant, je le créé via le bouton « Ajouter médicament ». Lorsque je reviens sur le sous-formulaire et que je recherche le médicament nouvellement créé avec la liste déroulante du sous-formulaire, j’obtiens la même réponse « Produit inexistant ». Je bidouille alors en choisissant un médicament existant, ce qui active en quelque sorte le liste déroulante puis je recherche de nouveau mon médicament nouvellement créé et Miracle … il apparaît. Tout cela me permet d’affecter à chaque client une liste de médicaments qui lui sont délivrés.
    J’avoue humblement que je fais sûrement partie des n….ls en access mais j’ai vraiment envie de comprendre.
    Merci encore

    • Hervé Inisan dit :

      Dans les 2 listes, le problème a l’air d’être un problème d’actualisation : les données d’une liste ne sont lues qu’à l’ouverture du formulaire. Si les données évoluent parallèlement (ce qui est le cas ici), elles ne s’affichent pas dans la liste. La solution est dans le paragraphe “Actualiser la liste déroulante” de cet article.
      Attention : la 2ème liste se trouve dans un sous-formule, si j’ai suivi ? La syntaxe pour la réactualiser sera donc différente (voir cet autre article).

  2. bisko dit :

    Merci Hervé,

    J’ai fait un « requery » sur chaque champ indépendant selon tes conseils et les valeurs des champs du client nouvellement crée s’affichent. Par contre lorsque je saisis dans le sous formulaire, les produits qu’il achète, rien ne se passe. Le formulaire et le sous formulaire sont pourtant liés par un champ père et fils. Grâce à tes conseils avisés, j’ai réussi à résoudre ce problème après deux semaines de recherche infructueuse. Il me reste cette dernière étape à franchir … Merci beaucoup

  3. bisko dit :

    Merci Hervé,
    Le contact que j’ai créé est bien visible dans la liste déroulante lorsque je reviens sur le premier formulaire. Toutefois les champs indépendants qui figurent sur le formulaire et qui sont destinés à recevoir les différentes valeurs de la liste déroulante à l’aide de l’instruction column(n) restent bloqués sur les valeurs des champs du premier enregistrement de la table. Par contre, si je choisis un contact déjà existant, tout fonctionne. Pour le contact nouvellement créé, je suis obligé de fermer le formulaire principal puis de l’ouvrir afin de voir ma liste fonctionner normalement. Je suis vraiment bloqué sans pouvoir continuer plus en avant. Grande déception

    • Hervé Inisan dit :

      D’accord, on progresse. ;) En fait, il n’y a pas de problème sur l’actualisation de la liste. Ça serait plutôt un problème d’actualisation des champs indépendants.
      Qu’est-ce qui se passe si, une fois de retour sur le formulaire, tu sélectionnes le contact dans la liste ? (les champs indépendants suivent, ou pas ?)
      Deux pistes sinon :

      1. Il faut que la liste déroulante ne soit elle-même pas indépendante.
      2. Si ça ne suffit pas : en traitant chaque champ indépendant comme la liste, ça devrait passer. Du genre :
  4. bisko dit :

    Bonsoir,
    J’ai créé le second formulaire (pour saisir mon contact avec nom, prénom, adresse) et lorsque je reviens sur le premier formulaire, me liste déroulante ne se met jamais à jour. Pourquoi ?
    Merci d’avance à tous ceux qui voudraient me dépanner. Cela fait deux semaines que je me casse la tête

    • Hervé Inisan dit :

      Est-ce que tu as suivi le point “Actualiser la liste déroulante” ?
      Si oui, adapte le code de cette façon, et teste si un message s’affiche lors du retour sur le formulaire. Ça permettra de vérifier que le retour est bien pris en compte :

  5. Hervé Inisan dit :

    Brutus > Ça ne marche pas avec l’autre méthode du fait que le formulaire est ouvert en mode “Boîte de dialogue” (acDialog). Dans ce cas, la boîte de dialogue bloque l’exécution du code VBA appelant (donc le Forms![...] = ... n’est pas traité tout de suite. Ensuite, lorsque le formulaire est fermé, l’exécution reprend, la ligne de VBA peut s’exécuter mais le formulaire n’existe plus (d’où le message d’erreur).

  6. Brutus dit :

    En fait, pour faire apparaître automatiquement dans un 2e formulaire le nom recherché dans la liste déroulante d’un premier formulaire (et qui n’existe pas, donc ça déclenche l’événement NotInList), il faut insérer ce code dans le 2e formulaire :

    Private Sub Form_Load ()
    If Not IsNull(Me.OpenArgs) Then
    Me![Nom] = Me.OpenArgs
    End If
    End Sub

  7. Brutus dit :

    Merci Hervé. Malgré tout, ça ne fonctionne pas.
    Dans le formulaire 1, appelé Lexique, j’ai ce code :

    Option Compare Database

    Private Sub Form_Activate()
    On Error Resume Next
    Me.Modifiable0.Requery
    End Sub

    Private Sub Modifiable0_NotInList(NewData As String, Response As Integer)
    If MsgBox(“Voulez-vous ajouter ” & NewData & ” au Dictionnaire ?”, _
    vbYesNo + vbQuestion + vbDefaultButton2, “Ajout”) = vbYes Then

    DoCmd.OpenForm “Termes”, , , , acFormAdd, acDialog, NewData
    Forms![Termes]![Terme] = NewData
    Response = acDataErrAdded
    Else
    Response = acDataErrContinue
    Modifiable0.Undo
    End If
    End Sub

    la valeur NewData est bien enregistrée (véifiée par un MsgBox à l’ouverture du formulaire 2), mais la valeur n’apparaît pas dans son champ, et à l’enregistrement du formulaire 2 j’ai un message d’erreur 2450, me disant que le formulaire “Termes” n’existe pas… alors que c’est lui qui est ouvert !
    Et le nouveau terme est enregistré dans ma base, avec le champ vide !

    Le code du formulaire 2, nommé Termes, est le suivant :

    Option Compare Database

    Private Sub Form_Open(cancel As Integer)
    ‘Test
    MsgBox Me.OpenArgs
    End Sub

    Private Sub Enregistrer_Click()
    DoCmd.RunCommand acCmdSaveRecord
    DoCmd.Close
    End Sub

    J’ai essayé de remplacer NewData par Me.OpenArgs, ça ne change rien.

    Auriez-vous une idée d’une solution pour passer et écrire ce NewData à sa place dans le 2e formulaire ? Merci.

  8. Hervé Inisan dit :

    Brutus > J’imagine qu’il y a un DoCmd.OpenForm dans l’événement NotInList. A vue de nez, il suffit d’ajouter après :

  9. Brutus dit :

    Bonjour,
    Super, cet exemple fonctionne bien, mais je voudrais faire plus. J’ai un événement not in list qui propose d’ouvrir le 2e formulaire, au lieu de cliquer sur “ajouter”. Je souhaiterais qu’un nom, recherché dans la liste déroulante mais qui n’y figure pas, apparaisse directement dans le 2e formulaire de saisie qui va s’ouvrir, et que je puisse saisir les autres infos concernant la personne (suite à l’événement not in list, le formulaire de saisie s’ouvre bien sur un nouvel enregistrement, mais le formulaire est complètement vierge, j’aimerais que la valeur – présente dans NewData et aussi dans un OpenArgs – soit automatiquement écrite dans mon champ “nom”). Est-ce possible ? Merci.

  10. greg0uld dit :

    Hervé Inisan => Merci Hervé pour ta réponse, je me suis débrouillé autrement afin de rafraîchir mes listes. J’ai créer un bouton de rafraîchissement par combobox avec le code VBA correspondant pour chacune d’elle. Du coup, sa fonctionne parfaitement.
    Merci encore,

    Bonne continuation!

  11. Hervé Inisan dit :

    cyrielle > Ça peut se faire de différentes manières, dont une requête UNION. Un peu délicat à détailler dans un commentaire, mais si j’ai un peu de temps, j’essaierai de poster un article sur le sujet…

  12. Hervé Inisan dit :

    greg0uld > Est-ce que les autres listes existent bien sur le formulaire (et avec ces noms précis) ?

    Au cas où, l’idée serait de supprimer la ligne On Error Resume Next, pour voir où ça peut casser (et de la remettre ensuite).

  13. greg0uld dit :

    Bonjour,

    Ce tuto est super il m’a permis de bien avancer dans mon projet. J’ai cependant une petite question concernant l’actualisation de la combobox. Dans mon formulaire principal d’ajout, j’ai plusieurs combobox à actualiser. Mon code a donc cette forme :
    Private Sub Form_Activate()
    On Error Resume Next
    cboCategory.Requery
    cboTechno.Requery
    cboVoltage.Requery
    cboCapacity.Requery
    End Sub
    Ce code me permet d’actualiser la première liste à sa voir cboCategory mais pas les autres… Que faire ? Erreur dans le code ? (Je suis novice en VBA…)
    Aidez moi svp,
    Merci

  14. cyrielle dit :

    Bonjour,

    Ici, vous proposez une méthode pour ajouter un élementà la liste. Mais comment fait t on pour ajouter ” aucun filtre ” à la liste déroulante ?

    Merci par avance

  15. Hervé Inisan dit :

    Guillaume > Ça veut dire que le bouton “Ajouter” ne fonctionne plus à partir de la deuxième fois ? (plus d’effet ?)

  16. Guillaume dit :

    Bonjour,

    Je d’utiliser cette méthode pour ajouter une personne à une liste déroulante, cela marche parfaitement. Cependant, après avoir ré-ouvert ma base, je ne peux plus ajouter de nouvel utilisateur, seulement modifier la premiere ligne de ma base…
    Une idée d’où peut venir le problème ? (niveau access débutant)

    Merci par avance,

  17. Hervé Inisan dit :

    az0te > Et demain, une petite variante pour Access 2007 et +. Mais l’essentiel est ici. :)

  18. az0te dit :

    Merci beaucoup pour cette article!! il met vraiment d’une grande aide. Et surtout ayant poser la question que hier avoir un post si complet déjà maintenant c’est incroyable !!

Laisser un commentaire

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

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">