[VBA]Trié listBox [Résolu]

Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Dernière intervention
26 janvier 2011
- - Dernière réponse : aurelien2723
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Dernière intervention
26 janvier 2011
- 19 avril 2007 à 15:18
Salut!

J'utilises Excel2002SP2.
J'aimerais tout simplement trié les enregistrement de ma liste box par ordre alphabétique.
J'ai vu plusieurs fois sur le forum qu'il fallait mettre la propriété "sorted"à true, or je n'ai pas cette propriété dans les éléments de ma listBox...
Comment faire svp?

Merci :)
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Dernière intervention
23 août 2018
3
Merci
Tu n'as donc pas besoin de créer une Function, puisque le contrôle sera trié de toutes façons. Par contre, tu pourrais utiliser la Sub pour trier un Listbox ou un Combobox, puisque ces 2 contrôles sont identiques au niveau du tri. Il s'agit donc de passer un "Control" en paramètre.

Le code que j'utilise est le même que celui que Mortalino a écrit, ou presque. Je mets plutôt -2 sur la première boucle et -1 sur la 2e

Private Sub CommandButton1_Click()
    Trier ComboBox1
End Sub

Private Sub CommandButton2_Click()
    Trier ListBox1
End Sub

Sub Trier(Ctl As Control)
    Dim I As Integer, J As Integer
    Dim strTemp As String
   
    For I = 0 To Ctl.ListCount - 2
        For J = I + 1 To Ctl.ListCount - 1
            If Ctl.List(I) > Ctl.List(J) Then
                strTemp = Ctl.List(J)
                Ctl.List(J) = Ctl.List(I)
                Ctl.List(I) = strTemp
            End If
        Next
    Next
   
End Sub

Attention toutefois de passer le nom d'un contrôle valide. Ou sinon, tu pourrais ajouter une gestion d'erreur...

MPi

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cs_MPi
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
0
Merci
Salut,

Si tu as Excel et que tu ne veux pas passer par l'intermédiaire d'un tableau dynamique pour le trier et renvoyer le tri dans la listbox, le plus simple serait d'utiliser une colonne non occupée de ta feuille Excel, d'y envoyer les éléments de ta listbox, de trier la colonne et de récupérer le résultat trié dans ta listbox
Commenter la réponse de jmfmarques
Messages postés
6812
Date d'inscription
vendredi 16 décembre 2005
Dernière intervention
21 décembre 2011
0
Merci
Salut,

la propriété Sorted n'existe effectivement pas en VBA, la solution serait de lire tes Items de ta liste en partant de la fin vers le début et de trier par code.

@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
Commenter la réponse de mortalino
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
6 avril 2012
0
Merci
Salut,
Un petit code qui interprète ce que [auteurdetail.aspx?ID=615490 jmfmarques] te propose:
Dim i As Integer
   Dim NumElem As Integer
   'récupère le nombre d'élément
   NumElem = ListBox1.ListCount - 1
   'boucle pour remplir la colonne A
   For i = 0 To NumElem
       ActiveSheet.Range("A" & i + 1).Value = ListBox1.List(i)
   Next
   'Selection des cellules dans la feuille
   Call ActiveSheet.Range("A1:A" & NumElem + 1).Select
   'Tri par ordre alphabétique
   Call Selection.Sort(Selection, xlAscending)
   'Efface le contenu de la list
   Call ListBox1.Clear
   'Rempli la list avec les éléméts triés
   For i = 0 To NumElem
       Call ListBox1.AddItem(ActiveSheet.Range("A" & i + 1).Value)
   Next , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
Messages postés
6812
Date d'inscription
vendredi 16 décembre 2005
Dernière intervention
21 décembre 2011
0
Merci
Ma méthode

    Dim i As Integer, j As Integer, Temp As String
    
For i = 0 To ListBox.ListCount - 1
    For j = i + 1 To ListBox.ListCount
        If ListBox1.List(i) > ListBox1.List(j) Then
            Temp = ListBox1.List(j)
            ListBox1.List(j) = ListBox1.List(i)
            ListBox1.List(i) = Temp
        End If
    Next j
Next i


~ <small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
Commenter la réponse de mortalino
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
possible surement de trier a l'insertion...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Dernière intervention
26 janvier 2011
0
Merci
Salut!

Merci pour vos réponses :) !
la méthode de [auteurdetail.aspx?ID=647037 mortalino] me semble pas mal :)

J'aurais aimé faire une fonction qui prend en argument la listBox à trier, est-ce possible?
J'ai testé mais le débugger me renvoi "incompatibilité de type" :(

Merci :)
Commenter la réponse de aurelien2723
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
6 avril 2012
0
Merci
Salut,
Essaie ceci
   Private Sub TrieListe(ByRef Li As MSForms.ListBox)
Dim i As Integer, j As Integer, Temp As String
   
For i = 0 To Li.ListCount - 1
   For j = i + 1 To Li.ListCount
       If Li.List(i) > Li.List(j) Then
           Temp = Li.List(j)
           Li.List(j) = Li.List(i)
           Li.List(i) = Temp
       End If
   Next j
Next i

End Sub , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Dernière intervention
26 janvier 2011
0
Merci
Mon but est d'en faire une fonction.

J'arrive pas à appeler cette fonction avec a listebox comme argument :

Private Sub BTrierListe_Click()
    trieListeBox (ListeProduit1)
End Sub

Function trieListeBox(ByRef listeBox As MSForms.ListBox)
    Dim i As Integer, j As Integer, Temp As String
    For i = 0 To listeBox.ListCount - 1
        For j = i + 1 To listeBox.ListCount
            If listeBox.List(i) > listeBox.List(j) Then
                Temp = ListBox1.List(j)
                listeBox.List(j) = listeBox.List(i)
                listeBox.List(i) = Temp
            End If
        Next j
    Next i
End Function
Commenter la réponse de aurelien2723
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
6 avril 2012
0
Merci
Salut,
Essaie de changer le nom de ta variable de type  MSForms.ListBox
Elle s'ppelle ListBox et comme c'est déjà un mot de VB peu être que cela vietn de la.

@+: Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Dernière intervention
26 janvier 2011
0
Merci
non elle s'appelle listeBox
mais je vais essayer, merci :)
Commenter la réponse de aurelien2723
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
6 avril 2012
0
Merci
Re,
Oups désolé ....

@+: Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Dernière intervention
23 août 2018
0
Merci
Et c'est quoi le but d'en faire une Function ?
Que va-t-elle retourner comme valeur ta Function ?

MPi
Commenter la réponse de cs_MPi
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Dernière intervention
26 janvier 2011
0
Merci
rien... c'est vrai. enfin si, la listBox trié ;)
mais certainement que le passage par référence suffit (connait pas trop la politique de VB dans ce dommaine... :S)

Mais le but est surtout de l'écrire qu'une fois, parceque je serais ammener plusieurs fois à triés des listBox.

Mais bon au pire je ferais avec. :)

Si quelqu'un a une solution svp.

Merci :)
Commenter la réponse de aurelien2723
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Dernière intervention
26 janvier 2011
0
Merci
ok ok !! :)

Merci bien ça marche niquel comme je voulais ;)


Merci à tous pour votre aide et vos réponses :)
Commenter la réponse de aurelien2723

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.