• Initiateur de la discussion Initiateur de la discussion maval
  • 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 !

maval

XLDnaute Barbatruc
Bonjour,

J'ai un userform avec une combobox et a l'aide de bouton Option j'ai le choix de voir la colonne "A ou B".
J'aimerai que dans la combobox la liste se fasse par ordre alpha sans toucher aux colonne.

Je joint mon fichier

Je vous remercie d'avance
 

Pièces jointes

Re : Trie Combobox

Bonjour Max ,

et bien , si tu veux pas toucher aux données , un moyen possible est de passer par une variable tableau , puis de lui appliquer un tri,

.

Tu peux déjà écrire le transfert en variable tableau , ensuite reviens pour le tri si tu n'y arrives pas ....
 
Re : Trie Combobox

Un truc que j'ai déjà utilisé ; à toi de l'adapter , mais ça marche bien

Dans ta sub initialize tu mets ta boucle pour faire les ADD du genre :
Code:
Private Sub UserForm_Initialize()
With Worksheets("Formations par personne")
ligF = DerLigneTexte()
nom_P.AddItem ""

For J = 16 To ligF
nm = Worksheets("Formations par personne").Range("b" & J).Value
nom_P.AddItem nm
Next J
Call tri_Nom(nom_P)
End With
End Sub
DERLIGNETEXTE est une fonction qui était pour mon cas , t'en as pas besoin c'est pour l'exemple

Puis tu mets cette sub dans un module fonction
Code:
Sub tri_Nom(nom_P)
n = nom_P.ListCount
ReDim matable(n)

For i = 0 To n - 1
    k1 = nom_P.List(i)
    If k1 > maxi Then
        matable(i) = k1
        maxi = k1
    Else
        k = 0
        While k1 > matable(k)
            k = k + 1
                    Wend
        'décallage
        For z = i To k Step -1
            matable(z + 1) = matable(z)
        Next
        matable(k) = k1
        Application.StatusBar = i
   End If
Next
nom_P.List() = matable

End Sub
 
Re : Trie Combobox

Re max ,
Voici le code à remplacer dans ton userform

Code:
Private Sub UserForm_Initialize()
Dim Tourne As Long
Dim Temp1() As Variant, Temp2() As Variant
Dim Tempo As String
Dim Temoin As Boolean
Set dico1 = CreateObject("Scripting.dictionary")
Set dico2 = CreateObject("Scripting.dictionary")

For n = 6 To Sheets("Liste").Range("B" & Rows.Count).End(xlUp).Row
  a = Sheets("Liste").Range("B" & n)
  b = Sheets("Liste").Range("C" & n)
  dico1(a) = a
  dico2(b) = b
Next
Temp1 = dico1.keys
Temp2 = dico2.keys
  Do
  Temoin = False
  For Tourne = 0 To UBound(Temp1) - 1
    If Temp1(Tourne) > Temp1(Tourne + 1) Then
     Tempo = Temp1(Tourne)
     Temp1(Tourne) = Temp1(Tourne + 1)
     Temp1(Tourne + 1) = Tempo
     Temoin = True
    End If
  Next
  Loop Until Not Temoin
  Do
  Temoin = False
   For Tourne = 0 To UBound(Temp2) - 1
    If Split(Temp2(Tourne), " ")(0) > Split(Temp2(Tourne + 1), " ")(0) Then
     Tempo = Temp2(Tourne)
     Temp2(Tourne) = Temp2(Tourne + 1)
     Temp2(Tourne + 1) = Tempo
     Temoin = True
    End If
   Next
  Loop Until Not Temoin
Set dico1 = CreateObject("Scripting.dictionary")
Set dico2 = CreateObject("Scripting.dictionary")
For Tourne = 0 To UBound(Temp1)
dico1(Temp1(Tourne)) = Temp1(Tourne)
Next
For Tourne = 0 To UBound(Temp2)
dico2(Temp2(Tourne)) = Temp2(Tourne)
Next
 Me.Width = sLarg
Me.Left = (Application.Width - Me.Width) / 2
Me.Top = (Application.Height - Me.Height) / 2

End Sub
 
Re : Trie Combobox

pas grave Salut Nono
Sinon j'ai bien dit aussi de mettre ta Sub dans un module fonction car c'est un peu vieux cette appli (4ans)
mais il me semble que j'avais eu un Pb avec ces histoires de passage de variable /paramètres
mais si l'autre solution te conviens tant mieux c'est le résultat qui compte
 
Re : Trie Combobox

Bonjour Maval et à tous

Voici une autre solution .
à adapter.

Code:
‘===============================
Sub Listes_Suivi() 'liste sans doublons ni blanc entre les noms
Dim J%, i%
Dim Vtemp As Variant

For J = 4 To Range("A65536").End(xlUp).Row
    ComboBox1 = Range("A" & J)
    If ComboBox1.ListIndex = -1 Then
        If Range("A" & J).Value <> "" Then
            ComboBox1.AddItem UCase(Range("A" & J))
        End If
    End If
Next J
'------------------ tri sur combobox ------------------
With ComboBox1
    For i = 0 To .ListCount - 1
        For J = 0 To .ListCount - 1
            'MsgBox .List(i)
            If .List(i) < .List(J) Then
                Vtemp = .List(i)
                .List(i) = .List(J)
                .List(J) = Vtemp
            End If
        Next J
    Next i
End With

End Sub
‘====================================

Je suis un peu à labour, mais je livre quand même.

Salutation

Jean-Paul
 
Re : Trie Combobox

Bonjour,

Le programme d'origine est faux (voir image ci dessous).

Sans titre.jpg

Code:
Dim f, titre, col
Option Compare Text
Private Sub UserForm_Initialize()
  Set f = Sheets("Liste")
  Me.OptionButton1 = True
  titre = "Acteur": AlimComboBox
End Sub

Private Sub OptionButton1_Click()
  titre = "Acteur": AlimComboBox
End Sub

Private Sub OptionButton2_Click()
  titre = "Titre de film": AlimComboBox
End Sub

Private Sub OptionButton3_Click()
  titre = "Genre": AlimComboBox
End Sub

Private Sub OptionButton4_Click()
  titre = "Nationalite": AlimComboBox
End Sub

Sub AlimComboBox()
  col = Application.Match(titre, f.[B5:F5], 0) + 1
  If IsError(col) Then Exit Sub
  Set mondico = CreateObject("Scripting.Dictionary")
  a = f.Cells(6, col).Resize(f.Cells(65000, col).End(xlUp).Row)
  For i = LBound(a) To UBound(a)
    If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
  Next i
  temp = mondico.keys
  Call Tri(temp, LBound(temp), UBound(temp))
  Me.ComboBox1.ListIndex = -1
  Me.ComboBox1.List = temp
End Sub

Private Sub ComboBox1_click()
   bd = Range("b6:F" & [b65000].End(xlUp).Row)
   c = Application.Match(titre, f.[B5:F5], 0)
   Me.ListBox1.Clear
   j = 0
   For i = LBound(bd) To UBound(bd)
     If Me.ComboBox1 = bd(i, c) Then
        Me.ListBox1.AddItem bd(i, 1)
        Me.ListBox1.List(j, 1) = bd(i, 2)
        Me.ListBox1.List(j, 2) = bd(i, 3)
        Me.ListBox1.List(j, 3) = bd(i, 4)
        j = j + 1
     End If
   Next i
End Sub

Private Sub ListBox1_Click()
 Me.TextBox1 = Me.ListBox1
 Me.TextBox2 = Me.ListBox1.Column(1)
 Me.TextBox3 = Me.ListBox1.Column(2)
 Me.TextBox4 = Me.ListBox1.Column(3)
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

http://boisgontierjacques.free.fr/fichiers/Formulaire/FormCascadeDVD.xls

JB
 

Pièces jointes

Dernière édition:
- 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

Discussions similaires

Réponses
37
Affichages
949
Réponses
40
Affichages
2 K
  • Question Question
XL 2016 liste
Réponses
10
Affichages
332
  • Question Question
Microsoft 365 Aide planning
Réponses
17
Affichages
531
Réponses
15
Affichages
847
  • Question Question
Microsoft 365 agrandir la liste
Réponses
21
Affichages
418
Réponses
8
Affichages
357
Retour