Aide liste ComboBox

Jo

XLDnaute Nouveau
Bonjour,

Je me permet de poster ce message afin d'avoir votre aide sur la création d'une liste sur combobox mais qui s'alimente sur plusieurs colonnes en enlevant les doublons.
J'ai consulté le site de Jacques Boisgontier qui est vraiment très efficace Http://boisgontierjacques.free.fr/

Je souhaite réaliser une liste dans combobox sans doublons :

Private Sub UserForm_Initialize()
Set f = Sheets("BD")
Set mondico = CreateObject("Scripting.Dictionary")
a = f.Range("A2:A" & f.[A65000].End(xlUp).Row) ' tableau a(n,1) pour rapidité
For i = LBound(a) To UBound(a)
If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
Next i
'--avec tri
temp = mondico.keys
Call Tri(temp, LBound(temp), UBound(temp))
Me.ComboBox1.List = temp
End Sub

Sub Tri(a, gauc, droi) ' Quick sort
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call Tri(a, g, droi)
If gauc < d Then Call Tri(a, gauc, d)
End Sub

Ce code est particulièrement rapide et efficace ...
Le problème c'est que je souhaite faire une liste sans doublon mais qui s'alimente avec beaucoup de bases de données.
Autrement dit, je souhaite faire une seule et même liste d'une seule colonne mais qui va s'alimenter sur plusieurs colonnes (Toujours sans doublon) :

- Combobox avec 1 colonne
- Avec colonne A de la feuille 1
- + colonne A de la feuille 2
- + colonne A de la feuille 3
- Etc ...

Merci beaucoup de votre aide précieuse !
 

Modeste

XLDnaute Barbatruc
Re : Aide liste ComboBox

Bonjour Jo,

Sans fichier exemple, c'est toujours plus difficile de répondre ... ce qu'il faudrait que tu précises à tout le moins, c'est quel volume de données tu dois traiter: le tableau utilisé par JB permet de gagner du temps, mais si tes données sont éparpillées, ça va compliquer la tâche.
On peut supposer que si tu veux faire une liste déroulante, il n'y aura pas 3.000 lignes de données dans chacune de tes 250 feuilles!? (ou alors je commence vraiment à avoir peur!)

Si le volume n'est pas "monstrueux", on pourrait utiliser une boucle, pour explorer chaque feuille, puis à l'intérieur de cette première boucle, en créer une seconde qui lirait le contenu de la colonne A et garnirait le dico, au fur et à mesure.
Une autre solution serait d'utiliser une feuille temporaire, d'y rassembler le contenu de la colonne A de chaque feuille, d'utiliser cette feuille pour alimenter le tableau, puis de reprendre le traitement prévu.

Bref, quelques précisions et un petit fichier exemple devraient faciliter les choses :rolleyes:
 

Jo

XLDnaute Nouveau
Re : Aide liste ComboBox

Bonjour Modeste,

Merci pour ton attention.
J'ai finalement échangé sur un post existant d'un sujet similaire et j'ai eu une aide qui fonctionne parfaitement.
https://www.excel-downloads.com/threads/combobox-sans-doublon.209822/

Voici le code pour ceux qui en auraient besoin :

Private Sub UserForm_Initialize()
Dim temp, m As Object, Ws As Worksheet, i As Long
Set m = CreateObject("Scripting.Dictionary")
For Each Ws In Sheets(Array("1", "2", "3"))
With Ws
t = .Range("a2:a" & .Cells(Rows.Count, 1).End(3).Row).Value
For i = 1 To UBound(t)
m(t(i, 1)) = ""
Next i
End With
Next Ws
temp = m.keys
Call tri(temp, LBound(temp), UBound(temp))
ComboBox1.List = temp
End Sub
Sub tri(a, gauc, droi)
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub

Cela fonctionne parfaitement bien !
D'une rapidité impressionnante, 84 bases traitées d'environ 6000 lignes chacune !
Temps de réponse 2/3 secondes environ.

Encore merci !
 

laetitia90

XLDnaute Barbatruc
Re : Aide liste ComboBox

re joe :)bonjour Modeste :)

Cela fonctionne parfaitement bien !
D'une rapidité impressionnante, 84 bases traitées d'environ 6000 lignes chacune !
Temps de réponse 2/3 secondes environ

si tu cherches la vitesse on peut ameliorer dans ton cas cela devrait être interessant. attention pas toujours vrai!!

a la place de

Code:
Set m = CreateObject("Scripting.Dictionary")

tu mets

Code:
 Set m = New Dictionary

la declaration de variable a la place de

Code:
 m As Object
tu declares

Code:
m As Dictionary

la seule contraite tu es oblige la reference..
Code:
 Microsoft Scripthing Runtime
dans vba outils references tu coches... le fichier une fois sauvegarde garde en memoire

ton code devient

Code:
Private Sub UserForm_Initialize()
 Dim t, temp, Ws As Worksheet, i As Long, m As Dictionary
  Set m = New Dictionary
 For Each Ws In Sheets(Array("1", "2", "3"))
 With Ws
 t = .Range("a2:a" & .Cells(Rows.Count, 1).End(3).Row).Value
 For i = 1 To UBound(t)
 m(t(i, 1)) = ""
 Next i
 End With
 Next Ws
 temp = m.keys
 Call tri(temp, LBound(temp), UBound(temp))
 ComboBox1.List = temp
End Sub

pour voir la vitesse on peut mettre un timer

dans ton cas je declare s en long suffisant

Code:
Private Sub UserForm_Initialize()
 Dim t, temp, Ws As Worksheet, i As Long, m As Dictionary, s As Long
   s = Timer
  Set m = New Dictionary
 For Each Ws In Sheets(Array("1", "2", "3"))
 With Ws
 t = .Range("a2:a" & .Cells(Rows.Count, 1).End(3).Row).Value
 For i = 1 To UBound(t)
 m(t(i, 1)) = ""
 Next i
 End With
 Next Ws
 temp = m.keys
 Call tri(temp, LBound(temp), UBound(temp))
 ComboBox1.List = temp
  
  MsgBox Timer - s
End Sub
 

Modeste

XLDnaute Barbatruc
Re : Aide liste ComboBox

Re-bonjour Jo,
Salut Laetitia :)

@Jo: merci du retour! Je m'inquiétais de ce que le tableau était "écrasé" à chaque changement de feuille, mais si on garnit le dico avant de passer à la feuille suivante, forcément, ça reste tout à fait valable :eek:

@Laetitia: tu aurais une idée sur les raisons qui feraient qu'un autre mode de déclaration des variables donnerait un résultat plus rapide encore?
 

laetitia90

XLDnaute Barbatruc
Re : Aide liste ComboBox

re,tous

dans le cas present je vois pas trop vu que le tablo une seule dimension
le tablo forcement du variant

si toujours 6000 lignes par feuil on pourrait ecrire comme cela

Code:
t = .Range("a2:a6000").Value

mais bon!!!
par contre j'ai remarque que d'ecrire .value2 sur des grands tableau multi dimensions
on arrive a gagner 1 dizieme ou 2 pourquoi!!!! moi pas savoir.... meme si on manipule pas de date

sur des tableaux multi ...

on peut dans certains cas

Code:
t1(1 To 6000, 1 To 10)
ou declarer en string cela va dependre des données
Code:
T2(10) As String

c'est pas simple tout cela!!!
 

Discussions similaires

Réponses
4
Affichages
231

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 413
Messages
2 088 199
Membres
103 763
dernier inscrit
p.michaux