XL 2019 Une liste déroulante sans doublon ?

fanou06

XLDnaute Occasionnel
Bonjour,

Est-il possible de créer une liste déroulante (via validation des données) mais empêchant d'entrer par exemple un doublon ?
Merci.
 

Staple1600

XLDnaute Barbatruc
Re

=>fanou06
Aimer comprendre, c'est déjà l'essentiel prémisse
Et si tu comprends ce tu aimes, alors ton CHH devrait produire quelques endomorphines une fois que tu auras étudié ce petit exemple.
;)
 

Marjo2

XLDnaute Occasionnel
Bonsoir @fanou06, Staple,

si tu y arrives : parfait ! 😊 sinon, joins ton fichier
(sans données confidentielles), et je le ferai pour toi.

(ma solution sera en VBA. 😜)


soan
Bonjour @soan ,
N'ayant très peu de temps pour chercher sur ce sujet et Fanou n'ayant pas mis un résultat à sa recherche, peux-tu m'aider stp ? Je cherche à avoir une liste déroulante sans doublon pour la colonne fournisseur puis ensuite choisir par article. Merci d'avance.
 

Pièces jointes

  • Essai.xlsm
    15 KB · Affichages: 19
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonjour Marjo2,

j'ai téléchargé ton fichier, mais il n'y a pas de noms de fournisseurs ! c'est à toi de les mettre afin qu'un contributeur ne perde pas son temps à inventer des données ! et où veux-tu ta liste déroulante ? dans un UserForm ? il n'y en n'a pas dans ton fichier ! alors peut-être que tu n'as pas transmis le bon fichier ? ou peut-être que tu veux un contrôle de liste déroulante directement sur la feuille de calcul ? c'est à toi de mieux préciser ta demande ! de plus, comme je suis déjà débordé, je n'aurai pas le temps de m'en occuper.

autre chose : c'est beaucoup mieux que tu crées une autre discussion, qui sera ton propre sujet. :) en même temps, tu as ces 4 avantages : plus de contributeurs verront ta demande ; tu auras plus de chances de recevoir des réponses ; ton sujet pourra être inscrit automatiquement dans les discussions similaires (en bas de la page web) ; tu pourras marquer un des posts de réponse en tant que solution.

soan​
 

Marjo2

XLDnaute Occasionnel
Bonjour Marjo2,

j'ai téléchargé ton fichier, mais il n'y a pas de noms de fournisseurs ! c'est à toi de les mettre afin qu'un contributeur ne perde pas son temps à inventer des données ! et où veux-tu ta liste déroulante ? dans un UserForm ? il n'y en n'a pas dans ton fichier ! alors peut-être que tu n'as pas transmis le bon fichier ? ou peut-être que tu veux un contrôle de liste déroulante directement sur la feuille de calcul ? c'est à toi de mieux préciser ta demande ! de plus, comme je suis déjà débordé, je n'aurai pas le temps de m'en occuper.

autre chose : c'est beaucoup mieux que tu crées une autre discussion, qui sera ton propre sujet. :) en même temps, tu as ces 4 avantages : plus de contributeurs verront ta demande ; tu auras plus de chances de recevoir des réponses ; ton sujet pourra être inscrit automatiquement dans les discussions similaires (en bas de la page web) ; tu pourras marquer un des posts de réponse en tant que solution.

soan​
Bonjour @soan, Pas de soucis, merci de ton retour, j'avais fait très vite, trop vite. C'était juste de dire qu'en cellule B2 de l'onglet réception cela propose une liste déroulante de la colonne A onglet Table sans doublon.
Bonne journée.
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@Marjo2

moi aussi, j'avais fait trop vite ! 😄 j'avais ensuite compris que les fournisseurs sont ceux de la feuille "TABLE", en A2:A13 ; et cela même si bizarrement, l'intitulé de la colonne est "TARIF ACHAT" et pas "FOURNISSEUR" ; de plus, même si c'est des fournisseurs fictifs, ça n'a vraiment pas l'air de noms de fournisseurs ! exemples : HA ressemble à l'abréviation comptable pour le Journal des Achats ; DE ressemble à l'abréviation de DEUTCH (Allemand) ; SP ressemble à l'abréviation de SPAIN (Espagne) ; pour FRECH, serait-ce ton abréviation de FRENCH (français) ? BRI = BRITAIN (Angleterre) ? et pour DEY et BEAU ? mystère ! 🤔 ainsi, pour des noms de fournisseurs fictifs, tu mets un code de Journal comptable et des abréviations de pays ou de langues ? 🙃 😶 (c'est plutôt un peu surprenant, mais après tout, pourquoi pas ? 😜)

j'ai quand même fait le fichier joint ; sur la feuille "RECEPTION", fais Ctrl e ➯ affichage du formulaire "Liste des Fournisseurs" ; tu peux vérifier que la liste déroulante des Fournisseurs contient la liste des fournisseurs sans doublon ; ce n'est pas exactement ta demande, mais tu peux t'en inspirer pour faire ce que tu attends ; en fait, tu peux utiliser une partie du code VBA pour l'adapter à une règle de validation pour chaque cellule de ta colonne B (de la feuille "RECEPTION"), mais ça fait longtemps qu'j'ai pas manipulé de règles de validation par VBA, alors je te laisse voir ça avec un autre contributeur, et dans une autre discussion que celle-ci. :) bonne chance ! 🍀



code VBA du UserForm "ListFRS" :

VB:
Option Explicit

Private Sub UserForm_Initialize()
  Dim T, d, n&, i&: Application.ScreenUpdating = 0
  Set d = CreateObject("Scripting.Dictionary")
  With Worksheets("TABLE").ListObjects("Tableau2")
    If .DataBodyRange Is Nothing Then Exit Sub
    n = .ListRows.Count: If n = 0 Then Exit Sub
    T = .Parent.[A2].Resize(n)
  End With
  For i = 1 To UBound(T)
    If T(i, 1) <> "" Then d(T(i, 1)) = ""
  Next i
  cbFournisseurs.List = d.Keys
End Sub

pour éviter les doublons, j'ai utilisé la technique du dictionnaire ;
c'est un objet de la bibliothèque "Scripting.Dictionary".



bonne journée à toi aussi. 🍀

soan
 

Pièces jointes

  • Essai.xlsm
    23.4 KB · Affichages: 16
Dernière édition:

Marjo2

XLDnaute Occasionnel
B
@Marjo2

moi aussi, j'avais fait trop vite ! 😄 j'avais ensuite compris que les fournisseurs sont ceux de la feuille "TABLE", en A2:A13 ; et cela même si bizarrement, l'intitulé de la colonne est "TARIF ACHAT" et pas "FOURNISSEUR" ; de plus, même si c'est des fournisseurs fictifs, ça n'a vraiment pas l'air de noms de fournisseurs ! exemples : HA ressemble à l'abréviation comptable pour le Journal des Achats ; DE ressemble à l'abréviation de DEUTCH (Allemand) ; SP ressemble à l'abréviation de SPAIN (Espagne) ; pour FRECH, serait-ce ton abréviation de FRENCH (français) ? BRI = BRITAIN (Angleterre) ? et pour DEY et BEAU ? mystère ! 🤔 ainsi, pour des noms de fournisseurs fictifs, tu mets un code de Journal comptable et des abréviations de pays ou de langues ? 🙃 😶 (c'est plutôt un peu surprenant, mais après tout, pourquoi pas ? 😜)

j'ai quand même fait le fichier joint ; sur la feuille "RECEPTION", fais Ctrl e ➯ affichage du formulaire "Liste des Fournisseurs" ; tu peux vérifier que la liste déroulante des Fournisseurs contient la liste des fournisseurs sans doublon ; ce n'est pas exactement ta demande, mais tu peux t'en inspirer pour faire ce que tu attends ; en fait, tu peux utiliser une partie du code VBA pour l'adapter à une règle de validation pour chaque cellule de ta colonne B (de la feuille "RECEPTION"), mais ça fait longtemps qu'j'ai pas manipulé de règles de validation par VBA, alors je te laisse voir ça avec un autre contributeur, et dans une autre discussion que celle-ci. :) bonne chance ! 🍀



code VBA du UserForm "ListFRS" :

VB:
Option Explicit

Private Sub UserForm_Initialize()
  Dim T, d, n&, i&: Application.ScreenUpdating = 0
  Set d = CreateObject("Scripting.Dictionary")
  With Worksheets("TABLE").ListObjects("Tableau2")
    If .DataBodyRange Is Nothing Then Exit Sub
    n = .ListRows.Count: If n = 0 Then Exit Sub
    T = .Parent.[A2].Resize(n)
  End With
  For i = 1 To UBound(T)
    If T(i, 1) <> "" Then d(T(i, 1)) = ""
  Next i
  cbFournisseurs.List = d.Keys
End Sub

pour éviter les doublons, j'ai utilisé la technique du dictionnaire ;
c'est un objet de la bibliothèque "Scripting.Dictionary".



bonne journée à toi aussi. 🍀

Bonjour @soan, merci j'ai bien compris, ça va le faire dans un premier temps, merci beaucoup. Alors pour le coup les noms de fournisseurs c'est uniquement les 2 premières lettres du véritables fournisseurs :) Fallait pas aller chercher si loin, la prochaine fois j'y mettrai des noms de Padawan :) Très bonne journée
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Marjo,

tu as écrit : « Alors pour le coup les noms de fournisseurs c'est uniquement les 2 premières lettres du véritable fournisseur :) Fallait pas aller chercher si loin... »

merci beaucoup pour l'explication ! 😊



tu as écrit : « j'ai bien compris, ça va le faire dans un premier temps »

voici une bonne nouvelle ! 👍 :)



bonne chance pour la suite de ton projet ! 🍀

soan
 

patricktoulon

XLDnaute Barbatruc
Bonjour @soan , @Marjo2

@soan
il est intéressant quand on rempli des combo ou listbox avec des plages ou tableaux structurés
de savoir que pour y avoir accès ou que l'on soit dans les feuilles , l'accès par la collection range est plus simple
j'entends par la que
pour y avoir accès dans ton events intialise tu met
With Worksheets("TABLE").ListObjects("Tableau2")

et oui en en effet par la collection listobjects on est obligé de préciser la feuille parent

tandis qu'avec la collection range on en a pas besoins car la range "tableau2" il ne peut y en avoir qu'une
exemple
msgbox range("Tableau2").range.address
non seulement tu a ton tableau mais en même temps tu a le databodyrange( sans l’entête)
et tu peux lancer cet ligne de n'importe ou sans préciser le parent



si tant est qu'un dictionnaire pour une liste de moins de 500 items soit nécessaires
ici je n'en vois pas l'utilité

je vous propose donc une version sans listobject , sans dictionnaire mais sans doublons quand même

VB:
Private Sub UserForm_Initialize()
    Dim T, i&, x
    T = Range("Tableau2").Resize(, 1).Value    'on prend la colonne(1) de tableau2 dans  une variable tableau 
    If UBound(T) > 1 Then  'si il y a databodyrange le range le renvoie aussi donc un simple test  du ubound(t) fait l'affaire
        For i = 1 To UBound(T)    'on boucle sur la variable tableau
            x = Application.Match(T(i, 1), T, 0)    'on teste simplement le match qui nous donne la position de l'item dans le tableau(t)
            ' tout simplement si x= la variable(i) incrémenté par la boucle alors  cette chaîne n'est pas encore passé  donc on l'ajoute a la liste
            If x = i and t(i,1)<>"" Then cbFournisseurs.AddItem T(i, 1)
        Next i
    End If
End Sub
et voila plus de dico plus de listobject simplement le value d'un range inséré dans la liste avec test match pour les doublons
;)
a noter que toujours sans listobject j'aurais pu obtenir cette colonne directement par son nom
exemple
MsgBox Range("tableau2[TARIF ACHAT]").Address


 

Discussions similaires

Réponses
4
Affichages
363

Statistiques des forums

Discussions
315 144
Messages
2 116 724
Membres
112 847
dernier inscrit
kevin1023