Ordonner des combobox déja remplie

Résolu
jubatail Messages postés 39 Statut Membre -  
jubatail Messages postés 39 Statut Membre -
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

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
    1. jubatail Messages postés 39 Statut Membre
       
      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
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > jubatail Messages postés 39 Statut Membre
         
        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
    2. jubatail Messages postés 39 Statut Membre
       
      merci
      0
    3. jubatail Messages postés 39 Statut Membre
       
      il trouve pas ma variable combo
      0
    4. jubatail Messages postés 39 Statut Membre
       
      it is good
      0