Ajout automatique nom dans menu déroulant

Résolu
nlbmoi Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   -  
Le Pingou Messages postés 12273 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai une base de données dans une feuille de calcul avec des noms ; dans une autre feuille je crée un menu déroulant avec les noms de ma base de données.
Je souhaiterais faire en sorte que si je tape un nom dans ma cellule au menu déroulant différent d'un de ceux de la liste, celui-ci s'ajoute dans ma base de données me permettant ainsi de le retrouver dans mon menu déroulant.
Si quelqu'un peut m'aider.

merci

10 réponses

  1. Le Pingou Messages postés 12273 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    Bonjour,
    Au passage, s'il s'agit juste du nom il faut l'ajouter dans la base de données.

    0
  2. nlbmoi Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   24
     
    Bonjour

    Merci de ta réponse qui convient parfaitement à ce que je souhaite. Pourrais-tu détailler un peu les lignes de code (pour que je puisse comprendre ce que tu as fait et que je le refasse !)
    Merci encore.
    0
    1. Gyrus Messages postés 3360 Statut Membre 526
       
      Bonjour,

      J'ai ajouté quelques commentaires pour la compréhension
      Private Sub Worksheet_Change(ByVal Target As Range)
      'Si la plage modifiée concerne plusieurs cellules, on sort de la procédure
      If Target.Count > 1 Then Exit Sub
      'Si la modification concerne la cellule A1
      If Target.Address = "$A$1" Then
      With Worksheets("Base")
      'Si la valeur de A1 n'est pas une valeur de la plage nommée "Noms"
      If Application.CountIf(.Range("Noms"), Target) = 0 Then
      'On ajoute cette valeur à la plage nommée "Noms"
      .Range("A" & Rows.Count).End(xlUp).Offset(1) = Target
      End If
      End With
      End If
      End Sub

      A noter que la plage nommée "Noms" est une plage dynamique définie par la formule
      =DECALER(Base!$A$1;;;NBVAL(Base!$A:$A))


      A+
      0
  3. nlbmoi Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   24
     
    Je comprends mieux maintenant sauf peut-être la première ligne "Si la plage modifiée concerne plusieurs cellules, on sort de la procédure" : je ne vois pas à quoi ça correspond.
    Est-ce qu'il est possible d'avoir une saisie pré-automatique : par exemple, si ma liste est longue et que je souhaite sélectionner un élément en bas de la liste, peut-on taper la ou les premières lettres et faire en sorte que n'apparaissent que les éléments de la liste commençant par ses lettres ?

    Merci de prendre du temps en tout cas.
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. Gyrus Messages postés 3360 Statut Membre 526
     
    Bonjour,

    La première ligne "Si la plage modifiée concerne plusieurs cellules, on sort de la procédure" permet d'éviter de générer une erreur si l'opérateur effectue une modification sur un ensemble de cellules (sélection d'une plage et effacement par exemple).

    Pour la saisie semi-automatique tu peux utiliser la méthode proposée dans ce lien
    https://www.commentcamarche.net/applis-sites/bureautique/549-creer-des-listes-deroulantes-dans-excel/

    En voici une application.
    https://www.cjoint.com/c/DBskZbAgaP4
    Pour obtenir un fonctionnement satisfaisant, il faut que a liste soit triée. J'ai donc ajouté un tri automatique dans la procédure.

    A+
    0
  6. nlbmoi Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   24
     
    Bonjour

    J'ai testé le fichier que tu as envoyé : lorsque je sélectionne un élément de la liste, j'ai une erreur de compilation et il me surligne xlSortOnValues
    0
  7. Gyrus Messages postés 3360 Statut Membre 526
     
    Essaie avec ce code

    Private Sub Worksheet_Change(ByVal Target As Range)
    'Si la plage modifiée concerne plusieurs cellules, on sort de la procédure
    If Target.Count > 1 Then Exit Sub
    'Si la modification concerne la cellule A1
    If Target.Address = "$A$1" Then
    Application.ScreenUpdating = False
    With Worksheets("Base")
    'Si la valeur de A1 n'est pas une valeur de la plage nommée "l_noms"
    If Application.CountIf(.Range("l_noms"), Target) = 0 Then
    'On ajoute cette valeur à la plage nommée "l_noms"
    .Range("A" & Rows.Count).End(xlUp).Offset(1) = Target
    End If
    'On effectue le tri de la liste
    .Range("l_noms").Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlNo, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
    End With
    End If
    End Sub

    A+
    0
  8. nlbmoi Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   24
     
    Re

    Le code marche nickel.
    J'ai essayé de le mettre à ma sauce pour l'adapter à mon fichier mais ça ne marche pas : je joins mon fichier https://www.cjoint.com/?3BsrFCTaNPC
    SUr mon fichier :
    - j'ai plusieurs listes de choix : une pour les clubs (qui couvrent 2 colonnes dans la 1ere feuille), une pour les arbitres (qui couvrent 2 colonnes dans la 1ere feuille) et une pour les marqueurs (pour les autres, la liste est connue, je n'ai pas besoin de l'ajouter via la première feuille).
    - j'aimerais que la pré-saisie et l'ajout d'un nom dans une liste soit possible quelque soit la ligne dans une même colonne (par ex, comme je vais avoir plusieurs matchs, j'aurais plusieurs lignes et j'aimerais pouvoir faire en sorte que l'ajout dans une liste se vérifie pour chaque ligne saisie)

    Merci beaucoup pour ton aide
    0
    1. nlbmoi Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   24
       
      Merci pour ta réactivité !
      J'ai réussi à tout mettre à jour.
      Il y a juste une attention à avoir : il faut décocher la case "Saisie semi-automatique d'entrées de cellule" dans les options d'Excel sinon la liste de choix se restreint aux données déjà présentes dans la colonne.
      Merci beaucoup pour tout.
      0
  9. Js99
     
    Bonjour, j'ai suivi votre conversation et je travaille sur un fichier pour mon stage qui me pose le même problème.

    Le code a l'air bien mais je m'y connais pas suffisamment pour le modifier tout seul. Je voulais juste savoir si il était possible que lorsque l'utilisateur rentre à la main une nouvelle donnée, un message apparaisse du genre "cette donnée ne fait pas partie de la liste. Souhaitez-vous l'ajouter?" avec "oui" ou "annuler" en boutons.

    Par ce petit message j'espere éviter l'ajout automatique de tout et n'importe quoi dans les listes déroulantes, au moins ca évite les coquilles.

    Comment faire pour intégrer ce message dans le code proposé par Gyrus?

    Merci d'avance
    0
  10. Le Pingou Messages postés 12273 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    Bonjour,
    Juste au passage, vous pouvez compléter le code de Gyrus (salutations) comme suit :
    Juste après la ligne :
    If Application.CountIf(Liste, Target) = 0 Then
    Vous insérez ces 2 lignes de code :
    choix = MsgBox("Cette donnée [" & Target & "] ne fait pas partie de la liste." & Chr(13) & " Souhaitez-vous l'ajouter?", vbYesNo, "Votre choix est nécessaire..!")
    If choix = vbNo Then Exit Sub


    Salutations.
    Le Pingou
    0