Ordonner des combobox déja remplie

Résolu/Fermé
jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017 - 13 sept. 2017 à 09:19
jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017 - 14 sept. 2017 à 13:06
Bonjour,

j'ai ce code ci-dessous qui fonctionne très bien et qui me permet d'initialiser les combobox.

Est ce que c'est possible de rajouter du code pour que la liste dans les comboboxs s'affiche dans un ordre croissant ? je voudrais ordonner la liste !!

voici le code :

For inc = 1 To NbColonne                    'première boucle pour traiter toutes les colonnes
    Set combo = Me.Controls("Label" & inc)              'contrôle de l'objet label
    combo.Caption = NomColonne(inc - 1)                 'Noms des labels = Nom de la colonne
    Set combo = Me.Controls("ComboBox_CAT_" & inc)      'contrôle de l'objet combobox
    combo.Style = 0    'propriété style des comboboxs :(initialement =0) on peut écrire dans les comboboxs, la mettre (=2) après initialisation
    DL = Sheets(NomFeuille).Cells.Find("*", , LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    For i = 4 To DL                         'Deuxième boucle pour traiter toutes les lignes d'une colonne
        If Sheets(NomFeuille).Cells(i, inc + 3).Text <> "N/D" Then            'si la ligne contient "N/D" ne pas incorporé cette valeur
            combo.Value = Sheets(NomFeuille).Cells(i, inc + 3).Text           'la valeur de la combobox est égale a la premiere cellule
                                                                              'de la première colonne et de la première ligne
            If combo.ListIndex = -1 Then combo.AddItem Sheets(NomFeuille).Cells(i, inc + 3).Text  'si 2 cellules sont similaires ne pas les inscrire 2 fois
        End If
    Next i
    'Ordonner les combobox

    combo.Value = ""            'on met les comboboxs à vide à l'ouverture de la fenêtre
    combo.Style = 2             '(=2) on ne peut plus écrire dans les comboboxs, le client peut seulement sélectionner les valeurs proposées
    Set combo = Nothing
Next


merci
julie

1 réponse

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
13 sept. 2017 à 13:54
Bonjour,

code a mettre apres ordonner combo

 Dim t As Variant
    t = Combo.List
    Call TrierPlage(t)
    Combo.List = t

'------------------------------------------------------
sub a ajouter

'
' Tri de Shell - Shell Sort adapté pour tri plage de cellules
'
Sub TrierPlage(plage As Variant, Optional ByVal loBound As Long = -1, Optional ByVal upBound As Long = -1)
    Dim i As Long, j As Long, h As Long, v As Variant, t() As Variant
    
    'mise en tableau de la plage de cellules
    t = Application.Transpose(plage)
    'debut de tableau
    If loBound = -1 Then
        loBound = LBound(t())
    End If
    'fin de tableau
    If upBound = -1 Then
        upBound = UBound(t())
    End If

    h = loBound
    Do
        h = 3 * h + 1
    Loop Until h > upBound
      
    Do
        h = h / 3
        For i = h + 1 To upBound
            v = t(i): j = i
            Do While t(j - h) > v
                t(j) = t(j - h): j = j - h
                If j <= h Then
                    Exit Do
                End If
            Loop
            t(j) = v
        Next i
    Loop Until h = loBound
    plage = Application.Transpose(t())
End Sub
0
jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017
13 sept. 2017 à 14:22
merci au final j'ai trouvé toute seule :)
Voici le code que j'ai utilisé mais le souci cest que j'ai du le copier coller 20 fois car j'ai 20 combobox !!!

For i = 0 To Me.ComboBox_CAT_1.ListCount - 1
        For j = 0 To Me.ComboBox_CAT_1.ListCount - 1
            If Val(ComboBox_CAT_1.List(i)) < Val(ComboBox_CAT_1.List(j)) Then
                strtemp = ComboBox_CAT_1.List(CInt(i))
                ComboBox_CAT_1.List(i) = ComboBox_CAT_1.List(j)
                ComboBox_CAT_1.List(j) = strtemp
                End If
        Next j
Next i


En effet il est plus court et le votre je comprends pas trop désolé ...
Peut être une iddée pour le réaliser directement dans toutes les comboboxs ?
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017
Modifié le 13 sept. 2017 à 15:41
Re,

copier coller 20 fois
Une seule fois suffit, remplacez ComboBox_CAT_1 par combo et mettez le code juste apres
'ordonner combobox

        For j = 0 To combo.ListCount - 1
            If Val(combo.List(i)) < Val(combo.List(j)) Then
                strtemp = combo.List(CInt(i))
                combo.List(i) =combo.List(j)
                combo.List(j) = strtemp
            End If
        Next j


le code que je vous ai mis est simple
Dim t As Variant
    t = Combo.List    'trsf de la liste combobox dans un tableau
    Call TrierPlage(t)   'appel de la sub de tri avec le tableau en parametre
    Combo.List = t     'trsf du tableau trie dans la combobox

Sub TrierPlage() tri  Shell rapide , vous trouverez les explications ici
 [https://fr.wikipedia.org/wiki/Tri_de_Shell]
0
jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017
14 sept. 2017 à 11:52
merci
0
jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017
14 sept. 2017 à 11:58
il trouve pas ma variable combo
0
jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017
14 sept. 2017 à 13:06
it is good
0