Tri liste de pays par ordre alphabetique dans un objet

Résolu
Jojos54 Messages postés 15 Statut Membre -  
Jojos54 Messages postés 15 Statut Membre -
Bonjour,

j'ai une fonction qui me récupere une liste de pays sans doublon à partir d'une feuille excel. Je recupère cette liste et l'intègre dans une combobox

Cependant je n'arrive pas à trier ma liste par ordre alphabetique

Ci dessous le code actuel qui fonctionne mais sans tri

Private Sub Liste_country2() 'à l'initialisation de l'UserForm
Dim i, As Long 'déclare la variable I (Incrément)
Dim d As Object 'déclare la variable D (Dictionnaire)
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)

Set O = Sheets("work orders temp") 'définit l'onglet O
TC = O.Range("H5:H" & O.Range("H65000").End(xlUp).Row)
Set d = CreateObject("Scripting.Dictionary") 'définit le dictionanire D
For i = 1 To UBound(TC) 'boucle sur toutes les lignes I du tableau de cellules TC (en partant de la seconde)
d(TC(i, 1)) = "" 'alimente le dictionnaire D
Next i 'prochaine ligne de la boucle
Me.ComboBox8.list = d.keys 'alimente la Combobox8 avec la liste des éléments du dictionnaire D sans doublons

end sub

J'ai vu a plusieurs endroit des fonctions de Tri quicksort shellsort, mais je n'arrive pas à les appliquer pour info le lien http://boisgontierjacques.free.fr/pages_site/tableaux.htm#filtrecoltab

Merci de votre aide,

1 réponse

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Private Sub Liste_country2() 'à l'initialisation de l'UserForm
        Dim i As Long 'déclare la variable I (Incrément)
        Dim d As Object 'déclare la variable D (Dictionnaire)
        Dim O As Worksheet 'déclare la variable O (Onglet)
        Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
        Dim TMP
    
        Set O = Sheets("work orders temp") 'définit l'onglet O
        TC = O.Range("H5:H" & O.Range("H65000").End(xlUp).Row)
        Set d = CreateObject("Scripting.Dictionary") 'définit le dictionanire D
        For i = 1 To UBound(TC) 'boucle sur toutes les lignes I du tableau de cellules TC (en partant de la seconde)
            d(TC(i, 1)) = "" 'alimente le dictionnaire D
        Next i 'prochaine ligne de la boucle
        '-----------------------------
            TMP = d.keys 'Table sans doublon
            Call tri(TMP, LBound(TMP, 1), UBound(TMP, 1)) 'tri alphabétique
        '----------------------------
        Me.ComboBox8.List = TMP 'alimente la Combobox8 avec la liste des éléments du dictionnaire D sans doublons
    
    End Sub
    0
    1. Jojos54 Messages postés 15 Statut Membre
       
      Bonjour, merci pour ta réponse,

      Actuellement je n'ai pas la fonction tri,

      J'ai tenté de copié celle-ci dans mon code

      Sub tri(a() As Double, 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


      mais j'ai une incompatibilté de type alors au niveau de la ligne
      Call tri(TMP, LBound(TMP, 1), UBound(TMP, 1)) 'tri alphabétique

      tableau ou type défini par l'utilisateur attendu
      0
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Jojos54 Messages postés 15 Statut Membre
         
        Re,

        remplacez

        Sub tri(a() As Double, gauc, droi) ' Quick sort


        par

        Sub tri(a As Variant, gauc As Integer, droi As Integer)
        0
    2. Jojos54 Messages postés 15 Statut Membre
       
      Donc la fonction tri demarre bien comme il faut cependant j'ai une erreur plus tard lors de l'exécution de la fonction
      type d'argument byref incompatible
      Sub tri(a As Variant, gauc As Integer, droi As Integer) ' Quick sort
      Dim ref
      Dim g, d As Integer
      Dim temp
      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) 'erreur ici sur g
      If gauc < d Then Call tri(a, gauc, d)
      End Sub
      0
    3. Jojos54 Messages postés 15 Statut Membre
       
      bon j'ai redéfini mes variable et ça marche nickel pour info donc juste modifier mon sub tri() en déclarant

      Dim ref
      Dim g As Long
      Dim d As Long
      Dim temp

      Merci de ton aide f89009
      0