[VBA]Trié listBox

Résolu
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 - 18 avril 2007 à 09:37
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre 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 :)

15 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
19 avril 2007 à 11:49
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
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 avril 2007 à 09:44
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
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
18 avril 2007 à 09:44
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~
  
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 09:59
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
18 avril 2007 à 10:23
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~
  
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 avril 2007 à 11:52
possible surement de trier a l'insertion...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
18 avril 2007 à 15:08
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 :)
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 15:26
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
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
18 avril 2007 à 15:52
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
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 16:15
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
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
18 avril 2007 à 16:31
non elle s'appelle listeBox
mais je vais essayer, merci :)
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 16:33
Re,
Oups désolé ....

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
19 avril 2007 à 00:26
Et c'est quoi le but d'en faire une Function ?
Que va-t-elle retourner comme valeur ta Function ?

MPi
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
19 avril 2007 à 08:24
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 :)
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
19 avril 2007 à 15:18
ok ok !! :)

Merci bien ça marche niquel comme je voulais ;)


Merci à tous pour votre aide et vos réponses :)
0
Rejoignez-nous