XL 2016 Affichage d'une ListBox sans doublons, depuis une Combobox

  • Initiateur de la discussion Initiateur de la discussion Aphone
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Aphone

XLDnaute Nouveau
Bonjour,
Je tente depuis quelques temps de créer une base de données de recherche de sous-traitants (entreprises de BTP) selon leur spécialité. Exemple : je sélectionne la famille "VRD", puis le type de tvx "Espaces Verts", cela me renvoie les coordonnées des ST préalablement entrés dans mon tableau "Données"
A ce jour, j'ai réussi tout ce que je voulais sauf une étape :
lorsque je souhaite passer de ma ComboBox1 ('Famille de Tvx') à ma ListBox2 ('Type de Tvx'), il me renvoie des doublons, ce que je veux bien évidemment éviter (lorsqu'il y aura 50 ST en Espaces verts cela sera problématique 😉).
Je vous met en PJ le fichier excel et je vous invite à faire le test avec justement la famille "VRD" pour constater le problème.

Je vous remercie par avance pour votre réponse, et m'excuse d'avance des questions que je poserai, je débute la VBA...

PS: Ne tenez pas compte de la TextBox ('Recherche directe du ST'), elle n'entre pas en compte dans le circuit de recherche qui m'est problématique
 

Pièces jointes

Solution
Bonsoir Aphone, bonsoir le forum,

En pièce jointe ton fichier modifié. Code commenté.
Utilisation d'un Dictionnaire pour les doublons et de variables tableaux pour une lecture beaucoup plus rapide des données. La Recherche est fonctionnelle et elle se fait sur le début des mots dans toues les colonnes...
Bonsoir Aphone, bonsoir le forum,

En pièce jointe ton fichier modifié. Code commenté.
Utilisation d'un Dictionnaire pour les doublons et de variables tableaux pour une lecture beaucoup plus rapide des données. La Recherche est fonctionnelle et elle se fait sur le début des mots dans toues les colonnes...
 

Pièces jointes

Bonjour Robert,

Merci beaucoup pour ta réponse, et surtout pour tous tes commentaires !
Je vais éplucher tout ça pour essayer de comprendre et de le réutiliser par la suite, en tout cas ça marche très bien.

Encore merci,
Bonne continuation,

Aphone.
 
Bonjour Robert,
J'ai utilisé ton fichier pour me créer une combobox sans doublons, mais j'ai du faire quelque chose de travers car le combobox ne contient rien lorsque je la lance.
Pourrais tu me dire où j'ai fauté?

Ma liste se trouve en Sheet("TM"), colonne B, à partir de B3
Par contre j'ai des lignes vides à devoir sauter
Par contre ma ligne A n'est jamais vide jusqu'à la fin et peut donc servir de référence pour le nombre de ligne à traiter

VB:
Public Derlig1 As Long
Option Explicit 'oblige à déclarer toutes les variables
Private O As Worksheet 'déclare la variable O (Onglet)
Private TS As ListObject 'déclare la variable TS (Tableau Structuré)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)

Private Sub UserForm1_Initialize()
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)

Set O = Sheets("TM") 'définit l'onglet O
Set TS = O.ListObjects(1) 'définit le tableau structuré TS
TV = TS.DataBodyRange 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I di tableau des valeurs TV
    D(TV(I, 2)) = "" 'alimente le dictionnaire D avec les données en colonne 2 de TV
Next I 'prochaine ligne de la boucle

Me.ComboBox1.List = Application.Transpose(D.Keys) 'alimente la ComboBox1 avec les éléments du dictionnaire D sans doublon (les clés)
Me.ComboBox1.List = ListSort(Me.ComboBox1.List) 'tri de la liste
End Sub

Function ListSort(liSte) 'tri combobox
Dim First As Integer, Last As Integer
Dim I As Integer, J As Integer
Dim Temp

First = LBound(liSte)
Last = UBound(liSte)
For I = First To Last - 1
    For J = I + 1 To Last
        If liSte(I, 0) > liSte(J, 0) Then
            Temp = liSte(J, 0)
            liSte(J, 0) = liSte(I, 0)
            liSte(I, 0) = Temp
        End If
    Next J
Next I
ListSort = liSte
End Function
 
Bonsoir Lorance

Pas de fichier risque de limiter les Réponses !
De Ce que j'ai compris (sans fichier)
VB:
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I di tableau des valeurs TV
If TV(I, 2) <> "" then 'on teste si non vide'
    D(TV(I, 2)) = "" 'alimente le dictionnaire D avec les données en colonne 2 de TV
End If
Next I 'prochaine ligne de la boucle
Jean marie
 
Bonjour le fil, bonjour le forum,

L'initialisation d'une UserForm, quel que soit son nom se fait toujours via l'instruction UserForm_Initialize ! Enlève le 1 (UserForm
1_Initialize)et tu verras que le code sera lu et qu'il fonctionne !
 
Bonsoir.
Curieux que beaucoup se font avoir ainsi avec cette histoire du nom qui doit toujours être le même du générateur d'évènements commun des UserForm.
Alors que pour les évènements des objets Worksheet, ils prennent pourtant bien toujours
Sub Worksheet_SelectionChange et pas Feuil1_SelectionChange par exemple …
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour