Tri ListBox multicolonnes (suite..)

Bonjour,

Il y a quelques semaines, h2so4 m'avait bien aidé pour trier une liste à trois colonnes selon la colonne 2 (index 1) avec ce code.

    With Usf_nouv.ListBox3
        If .ListCount < 2 Then Exit Sub
            Do
                Ok = True
                For i = 0 To .ListCount - 2
                    If .List(i, 1) > .List(i + 1, 1) Then
                        For j = 0 To 2
                            temp = .List(i, j)
                            .List(i, j) = .List(i + 1, j)
                            .List(i + 1, j) = temp
                            Ok = False
                        Next j
                    End If
                Next i
            Loop Until Ok = True
    End With

Mais je suis à nouveau coincé car j'aimerais affiner le tri avec la colonne 1 (index 0)

Clé 1 = colonne 2 (index 1)

Clé 2 = colonne 1 (index 0)

Et vous l'avez deviné, je n'y arrive pas....

Heeelp ...

Bonjour,

une autre méthode qui ne présente que des avantages : créer une feuille temporaire pour faire ton tri.

C'est souvent plus rapide (les algorithmes sont bien optimisés), et plus simple pour modifier les critères de tris.

Private Sub CommandButton1_Click()
    Dim nblig As Long
    Application.ScreenUpdating = False
    nblig = UserForm1.ListBox1.ListCount
    Sheets.Add.Name = "tmp"
    [A1].Resize(nblig, 3) = UserForm1.ListBox1.List
    [A1].Resize(nblig, 3).Sort Key1:=Range("B2"), Order1:=xlAscending, _
                               Key2:=Range("A2"), Order2:=xlAscending, Header:=xlNo
    UserForm1.ListBox1.List = [A1].Resize(nblig, 3).Value
    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True
End Sub

eric

291classeur2.zip (13.09 Ko)

Merci eriiic MAIS, cette solution ne semble pas convenir pour 2 raisons:

1/ Ma ListBox est "alimenté" très fréquemment (double clics dans une autre ListBox) et je souhaite l'actualiser à chaque ajout (ceci ne semble pas incompatible, mais ça ma parait bizarre...)

2/ Le nombre de feuilles de mon classeur joue un rôle important, la feuil1 doit rester la première, et le reste est fréquemment compté, donc je ne préfère pas trop jouer avec ça...

Ceci dit, ta méthode conviendrait surement en l'adaptant, mais je préfèrerais user d'un code attaché à la ListBox...

Et je pense que cette modif du code me paraitra évidente... mais pour l'instant je galère..

Merci en tout cas pour ta réponse et ton exemple

Re,

1) que tu lances un code ou un autre c'est quoi la différence ?

L'écriture et la lecture se faisant en bloc c'est très rapide.

2) la feuille est détruite aussitôt après, pas de raison que ça influe. Au pire tu peux la créer en dernier.

Mais bon, c'est toi qui voit.

eric

1) que tu lances un code ou un autre c'est quoi la différence ?

L'écriture et la lecture se faisant en bloc c'est très rapide.

Oui oui, certainement. Seulement que je n'envisageais pas à cette solution...

2) la feuille est détruite aussitôt après, pas de raison que ça influe. Au pire tu peux la créer en dernier.

Mais bon, c'est toi qui voit.

Je vais essayer demain.

Par curiosité j'ai regardé les temps.

Tri sur 2 colonnes :

  • pour 25 items = 3/100 s
  • pour 1000 items = 4/100 s
Une autre solution par macro pourrait s'approcher de 0 vu qu'on part sur une liste presque totalement triée, mais faut faire le code pour 2 colonnes. Est-ce que ça vaut le coup pour 3/100 s... ?

eric

...mais faut faire le code pour 2 colonnes....

Je dois avouer que j'aimerais bien voir à quoi ressemblerait ce code, car j'ai galéré un moment sans y arriver.....

Bonjour,

Perso ça ne me branche pas de passer du temps là dessus, et google est rempli d'algorithmes de tris en vba.

Mes tests m'ont montré qu'un algorithme de tri en vba n'était que rarement plus rapide. C'est sur des cas particuliers, et souvent sur des petites bases où le gain devient donc négligeable devant le temps de calcul complet.

Par exemple dans ton cas, si on démarre sur une liste de 1000 items non triés on passe de 0 s à 90 s !!! Là où excel passe de 3/100 s à 4/100 s...

Pour moi c'est plus simple de ne plus me prendre la tête et d'utiliser les fonctionnalités d'excel sur les tris qui sont très optimisées, et réalisées dans un langage qui n'a rien à voir avec vba en terme de performance.

Un site où tu as pas mal d'algorithmes de tris différents : http://www.giacomazzi.fr/infor/Tri/PgmVB4.htm

Si tu veux apprendre, les comparer sur différentes tailles de bases et t'amuser à voir le gain que tu peux obtenir...

Si tu bloques attend quelqu'un de plus courageux que moi ou démarre un nouveau topic.

Bon courage

eric

Merci pour toutes ces infos

Rechercher des sujets similaires à "tri listbox multicolonnes suite"