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

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

  • BdD ST.xlsm
    44.9 KB · Affichages: 12
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...

Robert

XLDnaute Barbatruc
Repose en paix
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

  • Aphone_ED_v01.xlsm
    45.2 KB · Affichages: 20

Aphone

XLDnaute Nouveau
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.
 

lorence1978

XLDnaute Nouveau
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
 

ChTi160

XLDnaute Barbatruc
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
 

Robert

XLDnaute Barbatruc
Repose en paix
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 !
 

Dranreb

XLDnaute Barbatruc
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 …
 

Statistiques des forums

Discussions
315 103
Messages
2 116 249
Membres
112 696
dernier inscrit
MagideDupont