tri de listbox

  • Initiateur de la discussion Pilou76
  • Date de début
P

Pilou76

Guest
Bonsoir a tous
Je cherche à faire un tri d'une listbox de 2 colonnes sur la 2ème colonne
J'ai testé:
Dim i As Byte
For i = 0 To ListBox1.ListCount
For j = i + 1 To ListBox1.ListCount - 1
If ListBox1.List(i, 1) > ListBox1.List(j, 1) Then
Temp = ListBox1.List(j)
ListBox1.List(j) = ListBox1.List(i)
ListBox1.List(i) = Temp
End If
Next j
Next i

J'ai du louper quelquechose
Merci de votre aide et bon week-end
 

myDearFriend!

XLDnaute Barbatruc
Bonsoir Pilou76,

La propriété List de ta ListBox représente un tableau à 2 dimensions.
Pour le Tri des tableaux, je te conseille d'aller jeter un oeil du côté de Lien supprimé, je pense que là, tu trouveras ton bonheur...

Si tu obtiens un message d'erreur en cliquant sur ce lien, il convient simplement de réactualiser la page Web pour accéder aux pages Wiki.

Cordialement,
 

Hervé

XLDnaute Barbatruc
Re tout le monde

C'est encore moi :)

Pilou, si tu as plusieurs colonnes dans ta listbox, tu peux utiliser ce code :

Dim i, j, k As Byte
Dim temp As String

With ListBox1
For i = 0 To .ListCount
   
For j = i + 1 To .ListCount - 1
       
If .List(i) > .List(j) Then
           
For k = 0 To .ColumnCount - 1
                temp = .List(j, k)
                .List(j, k) = .List(i, k)
                .List(i, k) = temp
           
Next k
       
End If
   
Next j
Next i
End With


Salut
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Hervé, Pilou, Didier, le Forum

Attention Hervé, on ne sait pas comment Pilou alimente sa ListBox, si c'est par la propriété 'RowSource', inutile d'aller plus en avant sans qu'il change de méthode, car l'accès sera refusé !

Ensuite il parle de sa 2ème colonne qui doit être le critère de tri.

J'ai fait un essai tout simple :

1 UserForm contenant
1 ListBox
1 CommandButton

Et donc ce Code :

Option Explicit

Private Sub UserForm_Initialize()
Dim i As Byte
   
With Me.ListBox1
       
For i = 0 To 100
        Randomize
        .AddItem 'Toto ' & i
        .Column(1, i) = Chr(Int((127 * Rnd) + 1))
       
Next
    .ColumnCount = 2
   
End With
End Sub

Private Sub CommandButton1_Click()
Dim i, j, k As Byte
Dim temp As String

With ListBox1
For i = 0 To .ListCount
   
For j = i + 1 To .ListCount - 1
       
If .List(i, 1) > .List(j, 1) Then
           
For k = 0 To .ColumnCount - 1
                temp = .List(j, k)
                .List(j, k) = .List(i, k)
                .List(i, k) = temp
           
Next k
       
End If
   
Next j
Next i
End With

End Sub


Par contre je trouve une certaine lenteur lorsque l'on procède de la sorte... Par conséquent, toujours sur le même UserForm, j'ajoute :

1 CommandButton (CommandButton2) et lui attribue cet algo :

Private Sub CommandButton2_Click()
Dim i, j, k As Byte
Dim temp As String
Dim TabListBox As Variant

TabListBox = ListBox1.List

For i = 0 To UBound(TabListBox)
   
For j = i + 1 To UBound(TabListBox)
       
If TabListBox(i, 1) > TabListBox(j, 1) Then
           
For k = 0 To Me.ListBox1.ColumnCount - 1 '**** voir remarque !
                temp = TabListBox(j, k)
                TabListBox(j, k) = TabListBox(i, k)
                TabListBox(i, k) = temp
           
Next k
       
End If
   
Next j
Next i

With Me.ListBox1
.Clear
.List() = TabListBox
End With

End Sub

'**** remarque !

Ma première réaction était bien logiquement d'écrire :
For k = 0 To UBound(TabListBox, 2)

Et là, et bien Niet Niet, mon Tableau est construit sur 10 Colonnes de 0 à 9 (valeur Max de Colonnes d'une ListBox sans passer par RowSource) et bien logiquement, l'algo de tri suivant déteste les valeur Null qui s'y trouvent...
Fin Remarque !


Enfin sinon il n'y a pas photo sur la rapidité d'exécution entre le fait de remplacer par un tableau que de travailler sur la ListBox elle-même, on en revient un peu comme au principe du Travail sur les Cellules des Feuilles...

Si notre ami Pilou, veut une 'Maxi Démo Compile' sur l'incrémentation de donnée dans une ListBox, et les autres aussi qui ne la connaissent pas, je vous invite à voir cette démo :

Lien supprimé

Fil de discussion : Lien supprimé

Voilà un Fil bien ficelé je pense ;)

Bon Dimanche à vous tous et toutes
@+Thierry
 
P

pilou76

Guest
Bonjour,
Merci a ceux qui ont répondu à mon problème.
J'ai testé les codes indiqués mais le tri se fait sur la 1ère colonne et non pas sur la 2ème comme je le souhaite.
Ma listbox est alimentée par une feuille ainsi faite
a1 = Paris a2 = Lyon a3= Marseille ......
b1 = 10 b2 = 5 b3 = 12

Je voudrai que ma listbox affiche
Lyon 5
Paris 10
Marseille 12

PS Je ne souhaite pas trier ma colonne Excel B au préalable


Merci d'avance et bonne journée sous ce beau soleil.
 

Hervé

XLDnaute Barbatruc
Bonsoir tout le monde
salut thierry


En reprenant le code de thierry, test ceci :

Private Sub CommandButton1_Click()
Dim TabListBox As Variant
Dim i, j, k As Byte
Dim temp As String

TabListBox = ListBox1.List

For i = 0 To UBound(TabListBox)
   
For j = 0 To UBound(TabListBox)
       
If TabListBox(i, 1) < TabListBox(j, 1) Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
For k = 0 To 1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp = TabListBox(j, k)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TabListBox(j, k) = TabListBox(i, k)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TabListBox(i, k) = temp
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Next k
&nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp;
Next j
Next i

ListBox1.List() = TabListBox


End Sub

Salut
 

Hervé

XLDnaute Barbatruc
re

Thierry,

je reviens sur cette histoire de trie d'une listbox alimenté par rowsource :

ne pourrait-on pas imaginer un code de ce type :

Private Sub UserForm_Initialize()
Dim plage As Range

Set plage = Range('a2:v' & Range('a65536').End(xlUp).Row)

ListBox1.ColumnCount = plage.Columns.Count
ListBox1.RowSource = plage.Address

End Sub
________________________________________________________
Private Sub CommandButton1_Click()
Dim TabListBox As Variant
Dim i, j, k As Byte
Dim temp As String

With ListBox1
TabListBox = Range(.RowSource)

'ici le code pour traiter tablistbox

.RowSource = ''
.List() = TabListBox
End With
End Sub

Tu va me dire : Hervé tu as encore fait une usine à gaz, alors qu'un tableau variant te rempli les memes fonctions.

Et tu auras raison, comme d'hab
:) :) :)

Salut

Message édité par: Hervé, à: 19/06/2005 23:07
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir les Gars, bonsoir le Forum

Je suis mort de rire, mais ça fait du bien après avoir passé les 3/4 de mon après midi, (wouarf après-midi qui finit à 23:20 lol) sur les Bibliothèques et les références VB et les MSDN etc...

Bon alors déjà notre ami pilou ne nous a toujours pas dit avec quelle méthode il alimente sa ListBox... Oui ça vient d'une feuille, ça je pouvais miser 100 € sur ce coup là, mais comment tu rentres ces données dans ta ListBox....

Pour Hervé, je suis écroulé de rire pour trois raisons :
1) tu m'as mis dedans avec dès le départ ta déclaration de Variables ;
Dim i, j, k As Byte
Que j'ai laissée passer et scrupuleusement recopiée ensuite !!! LOL (dire que j'enguirlande tout le monde depuis des années de ne pas faire ça mais ceci :
Dim i as Byte, j As Byte, k As Byte... LOL

2) J'ai cherché comme au jeu des septs erreurs pour comprendre la différence entre le code que je proposais à 09:50 et celui que tu proposes à 21:42 je ne voyais pas la suppression de 'Me.ListBox1.ColumnCount - 1' au profit de ce 1 !!! Wouarf, pourquoi faire ceci, si jamais Pilou augmente le nombre de colonne visible, il va chercher longtemps !!! LOL

3) Alors celle là, Oh no My God LOL!!! Ton Post de 23:04 c'est un gag !!! D'abord le RowSource est souvent déconseillé car non compatible Mac. Mais bon, en mode Design, j'admets que beaucoup de débutants vont chercher la facilité en utilisant la fenêtre propriété...
Mais alors mélanger les deux méthodes en Run Time pour en détruire une et construire l'autre, wouarf wouarrf, moi j'interdis de Duvel pendant un mois celui qui me fait ça dans un développement sérieux !!! Imagine dans un UserForm vraiment compliqué, on devient fou avec un truc comme ça ! LOL

Mais bon je sais que c'est plus par goût de l'aventure Hervé, alors tu es tout excusé, c'est en testant tout qu'on finit par connaître ;)

Enfin j'ai bien rigolé en tout cas !

Bonne Fin d'Après Midi !!! (Re LOL)
@+Thierry
 

ChTi160

XLDnaute Barbatruc
Bonjour le Fil
bonjour le Forum

Arffff @+Thierry je vois qu'ici tu finis la Journée en te marrant et qu'aujourd'hui, tu te lèves et d'entrée on te met en pétard
mais bon tu vas te ressaisir et ton naturel va reprendre le dessus
bonne journée Lol
 
P

pilou76

Guest
Bonsoir,
Merci à tous pour vous etre penché sur mon problème que j'ai pu résoudre grace a votre réponse collégiale.

Pour Thierry,
Le tri d'une listbox, une fois constituée par Rowsource ou Additem, dépend-il encore de sa méthode d'alimentation ?

Merci encore.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Pilou,

Bien sûr Pilou, en Méthode 'RowSource' en géral tout accès est interdit... Regarde ma démo que j'ai mise plus en avant dans ce Fil... Elle te montre les avantage et les inconvénients de toutes les méthodes...

Bonne Soirée
@+Thierry
 

Discussions similaires

Réponses
4
Affichages
213
Réponses
17
Affichages
847

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 458
dernier inscrit
Vulgaris workshop