Code VBA pour trier Une Combobox

salhi_haithem

XLDnaute Junior
Bonjour tout le monde,

J'ai trouvé ce petit Code qu'est simple et qui me va bien
Ce Code peut remplir la combobox1 avec les données de la colonne A de la feuille "Base" sans Doublons.
j'aimerai ajouter un petit Tri du Grand vers le Petit
et j'aimerai bien qu'il ne m'affiche pas du blanc dans ma combobox
et ca serait parfait

Code:
Private Sub UserForm_Initialize()

Dim i As Integer

For i = 1 To Sheets("Base").Range("A65536").End(xlUp).Row
  ComboBox1 = Sheets("Base").Range("A" & i)
  If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Sheets("Base").Range("A" & i)
Next i

End Sub

et des petits commentaires dans le code ca m'aide beaucoup a comprendre
Et merci bien pour votre aide
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Code VBA pour trier Une Combobox

Bonsoir,

Le code du post #1 est l'exemple de ce qu'il ne faut pas faire pour éliminer les doublons(lent).
Il faut e.g.
-utiliser un dictionnaire,
-transférer le dictionnaire dans un tableau
-trier le tableau
-transférer le tableau dans le combobox

Code:
Private Sub UserForm_Initialize()
  Set f = Sheets("Base")
  Set mondico = CreateObject("Scripting.Dictionary")
  a = f.Range("A1: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

jb
 
Dernière édition:

salhi_haithem

XLDnaute Junior
Re : Code VBA pour trier Une Combobox

Merci Mr BOISGONTIER pour votre aide c'est ce que je veux juste une petite chose
la combobox est chargé par des semaines c-a-dire (Semaine 39, Semaine 40, Semaine 41, Semaine 42 ... )

je veux le tri de plus grand vers le plus petit c-a-dire (Semaine 42 en premier ,puis Semaine 41, et Semaine 40, Semaine 39 ... )
j'ai ce code ci-dessous qui fonctionne bien mais il a des inconvénients
- il affiche les blancs
- il prend 3 seconde pour charger le userform car elle va charger la combobox


ton code il est hyper léger merci une autre fois, autre chose si il y a plus de commentaire dans le code ça m'aide a mieux comprendre et d’apprendre


Code:
' -------------- Charger la Combobox Semaine -----------------
Dim i As Integer, j As Integer
Dim strTemp As String

For i = 2 To Sheets("Base").Range("A65536").End(xlUp).Row
  ComboBox1 = Sheets("Base").Range("A" & i)
  If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Sheets("Base").Range("A" & i)
Next i

' ------------ tri ------------
With Me.ComboBox1
        For j = 0 To .ListCount - 1
            For i = 0 To .ListCount - 1
               If .List(i) < .List(j) Then
                    strTemp = .List(i)
                    .List(i) = .List(j)
                    .List(j) = strTemp
                End If
            Next i
        Next j
End With
 
Dernière édition:

laetitia90

XLDnaute Barbatruc
Re : Code VBA pour trier Une Combobox

bonjour tous :):)
en l'asbence de JB:)

tu inverse le signe >

Code:
Sub Tri(a, ColTri, gauc, droi)
  ref = a((gauc + droi) \ 2, ColTri)
  g = gauc: d = droi
  Do
  Do While a(g, ColTri) > ref: g = g + 1: Loop
  Do While ref > a(d, ColTri): d = d - 1: Loop
  If g <= d Then
   For k = LBound(a, 2) To UBound(a, 2)
   temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
    Next k
   g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call Tri(a, ColTri, g, droi)
  If gauc < d Then Call Tri(a, ColTri, gauc, d)
End Sub
 

salhi_haithem

XLDnaute Junior
Re : Code VBA pour trier Une Combobox

Je reviens vers vous les amis pour un peut d'aide
je cherche a utiliser le même code pour alimenter une deuxième Combobox sans doublons qui dépend de la première Combobox
C'est a dire J'ai la Combobox3 qui fonctionne avec le code de Mr BOISGONTIER bien et qui est alimenté par la colonne AI sans doublons qui charge les semaines.

J'aimerai alimenté la Combobox5 par la colonne J sans doublon sans Blanc mais qui dépend de la valeur sélectionné dans la Combobox3 c'est a dire Remplir combobox selon la valeur d'une l'autre combobox



Et Merci d'avance


Code:
Private Sub UserForm_Initialize()

  Set F = Sheets("Base")
  Set mondico = CreateObject("Scripting.Dictionary")
  a = F.Range("AI2:AI" & F.[AI65000].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.ComboBox3.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
 

Discussions similaires

Réponses
11
Affichages
285
Réponses
6
Affichages
234

Statistiques des forums

Discussions
312 175
Messages
2 085 953
Membres
103 059
dernier inscrit
gib17