Ajout automatique nom dans menu déroulant [Résolu/Fermé]

Signaler
Messages postés
407
Date d'inscription
samedi 26 août 2006
Statut
Membre
Dernière intervention
23 septembre 2020
-
Messages postés
9755
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
10 octobre 2020
-
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

Messages postés
9755
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
10 octobre 2020
1 077
Bonjour,
Au passage, s'il s'agit juste du nom il faut l'ajouter dans la base de données.

Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
491
Bonjour,

Une proposition
https://www.cjoint.com/?DBor6ozzzUy

A+
Messages postés
407
Date d'inscription
samedi 26 août 2006
Statut
Membre
Dernière intervention
23 septembre 2020
19
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.
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
491
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+
Messages postés
407
Date d'inscription
samedi 26 août 2006
Statut
Membre
Dernière intervention
23 septembre 2020
19
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.
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
491
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/faq/8288-liste-deroulante-avec-saisie-semi-automatique-pour-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+
Messages postés
407
Date d'inscription
samedi 26 août 2006
Statut
Membre
Dernière intervention
23 septembre 2020
19
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
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
491
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+
Messages postés
407
Date d'inscription
samedi 26 août 2006
Statut
Membre
Dernière intervention
23 septembre 2020
19
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
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
491
Messages postés
407
Date d'inscription
samedi 26 août 2006
Statut
Membre
Dernière intervention
23 septembre 2020
19
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.
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
Messages postés
9755
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
10 octobre 2020
1 077
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