IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tri dans listbox


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de Basicnav
    Profil pro
    Inscrit en
    Février 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2008
    Messages : 245
    Points : 193
    Points
    193
    Par défaut Tri dans listbox
    Bonjour,

    je cherche à faire un tri d'une listbox, plus excatement faire le tri alphabétique dans la listbox.
    Est-ce possible, ou dois-je passer par un tri sur ma feuille avant (ce que je voudrait éviter) ?

    J'ai trouvé quelques info, mais ce sont des usines à gaz.

    merci
    on ne parvient jamais à bien jouir de soi sans le recours d'autrui
    JJ Rousseau

    http://funz.labrute.fr/

  2. #2
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour Basicnav le forum c'est faisable
    un exemple sans doublons & dans l'ordre alpha ma listbox se nomme cbx1 a adapter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub es()
    Dim t, z As Variant, l As Object, i As Long, j As Long, temp As String
    On Error Resume Next
    Set l = CreateObject("Scripting.Dictionary")
    t = Range("A2:a" & Range("A65536").End(xlUp).Row)
    For i = LBound(t) To UBound(t)
    l.Add t(i, 1), t(i, 1): Next
    For Each z In l
    If z <> "" Then cbx1.AddItem z
    For i = 0 To cbx1.ListCount - 1
    For j = 0 To cbx1.ListCount - 1
    If cbx1.List(i) < cbx1.List(j) Then
    temp = cbx1.List(i)
    cbx1.List(i) = cbx1.List(j)
    cbx1.List(j) = temp
    End If: Next j: Next i
    End Sub
    SALUTATIONS

  3. #3
    Membre habitué Avatar de Basicnav
    Profil pro
    Inscrit en
    Février 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2008
    Messages : 245
    Points : 193
    Points
    193
    Par défaut
    Bonjour Laetitia,

    j'ai mis en place ton code, mais ma liste est vide...

    De ce fait, j'ai trouvé ce code sur le net (je n'ai aucun mérite)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     Private Sub UserForm_Initialize()
     
                Dim BDF As Worksheet
                Dim l As Range
                Dim t_prem As Range, t_dern As Range
     
     
            Set BDF = Worksheets("Feuil2")
            Set t_prem = BDF.Range("A1")
            Set t_dern = BDF.Range("A65536").End(xlUp)
           Dim tablo()
           ReDim tablo(2, 0)
     
           ListBox1.ColumnCount = 2 '2 colonnes dans la listBox
           ListBox1.ColumnWidths = "0"
       'rend invisible la première colonne
           ListBox1.Clear
       'Mise en tableau des infos
           For Each l In BDF.Range(t_prem, t_dern)
               If l.Value <> "" Then
                 tablo(1, UBound(tablo, 2)) = l.Column
                 tablo(2, UBound(tablo, 2)) = l.Value
                 ReDim Preserve tablo(2, UBound(tablo, 2) + 1)
               End If
           Next
       'Tri du tableau
           For n = LBound(tablo, 2) To UBound(tablo, 2) - 1
             For M = LBound(tablo, 2) To UBound(tablo, 2) - 1
               If tablo(2, M) > tablo(2, n) Then
                 temp1 = tablo(1, n)
                 temp2 = tablo(2, n)
                 tablo(1, n) = tablo(1, M)
                 tablo(2, n) = tablo(2, M)
                 tablo(1, M) = temp1
                 tablo(2, M) = temp2
               End If
             Next M
           Next n
       'Transfert du tableau vers la listbox
           For n = LBound(tablo, 2) To UBound(tablo, 2) - 1
             ListBox1.AddItem tablo(1, n)
             ListBox1.List(ListBox1.ListCount - 1, 1) = tablo(2, n)
           Next n
     
       End Sub
    ça fonctionne très bien !

    Je vais retenter avec ton code parcequ'il est plus court et sans aucun doute plus facile à comprendre pour moi !!!
    on ne parvient jamais à bien jouir de soi sans le recours d'autrui
    JJ Rousseau

    http://funz.labrute.fr/

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bonjour laetitia, Basicnav,

    Tu ne dis pas où se trouve ta liste, dans un userform ou dans une feuille de calculs ?
    Tu as une réponse facile à adapter dans la FAQ par SilkyRoad pour un combo placé dans une feuille de calculs.
    L'adaptation pour une liste dans un userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub UserForm_Initialize()
        Dim i As Integer, j As Integer
        Dim strTemp As String
     
        'Supprime le contenu du ComboBox
        Me.ListBox1.Clear
        'Alimente le ComboBox
        Me.ListBox1.List() = Array("mimi", "nono", "bibi", "fifi", "lolo")
     
     
        'Tri le contenu du ComboBox par ordre alphabétique
        With Me.ListBox1
            For i = 0 To .ListCount - 1
                For j = 0 To .ListCount - 1
                    If .List(i) < .List(j) Then
                        strTemp = .List(i)
                        .List(i) = .List(j)
                        .List(j) = strTemp
                    End If
                Next j
            Next i
        End With
    End Sub
    Bonne journée

    (@laetitia - Pense à indenter ton code, ça le rendra plus lisible )

  5. #5
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour Basicnav ouskel un autre exemple dans propriétées de ta listbox column count tu mets =2
    ma listbox se momme cbx1 . je cache pas la premiere colonne adapte
    eventuellement on peut traiter les doublons!!


    j'ai indenter mon code pour pas me faire gronder par l' ami ouskel


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Option Explicit
    Private Sub UserForm_Initialize()
    Dim t As Variant, t2() As String, x As Long, i As Long, k As Long, temp, j As Long
         t = Worksheets("Feuil2").Range("a1:b" & Range("a65536").End(xlUp).Row)
         x = 1
         For i = 1 To UBound(t)
              If (t(i, 1)) <> "" Then
                   ReDim Preserve t2(1 To 2, 1 To x)
                   For k = 1 To 2
                        t2(k, x) = t(i, k)
                   Next k
                   x = x + 1
              End If
         Next i
         For i = 0 To cbx1.ListCount - 1
              For j = 0 To cbx1.ListCount - 1
                   If cbx1.List(i) < cbx1.List(j) Then
                        temp = cbx1.List(i)
                        cbx1.List(i) = cbx1.List(j)
                        cbx1.List(j) = temp
                   End If
              Next j
         Next i
         cbx1.List = Application.Transpose(t2)
         Erase t, t2
    End Sub
    SALUTATIONS

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour à tou(te)s
    Pourquoi 2 boucles ?
    Pour certain puriste qui n'aime pas les goto, c'est faisable aussi avec un Wend...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub UserForm_Initialize()
    Dim i As Integer, J As Boolean, Temp As Variant
        'Me.ListBox1.Clear ' Pas nécessaire vu qu'a l'initialisarion elle est vide
        'Alimente la listbox
        ListBox1.List() = Array("mimi", "nono", "bibi", "fifi", "lolo") 'Me pas nécessaire.
    Reco:
        J = False
        With ListBox1
            For i = 1 To .ListCount - 1
                If .List(i) < .List(i - 1) Then
                    Temp = .List(i) : .List(i) = .List(i - 1) :  .List(i - 1) = Temp
                    J = True
                End If
            Next i
            If J Then GoTo Reco
        End With
    End Sub
    A+

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Goto Reco, c'est pas une boucle ?
    Je trouve deux boucles plus propre qu'un goto qui ne doit s'utiliser qu'en gestion d'erreurs. Mais nous avons déjà eu cette discussion.
    Quant à Wend, il ne s'agirait pas d'une boucle ?

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour,

    juste une question "liminaire" : comment et par quoi est alimentée cette listbox ?
    (car dans certains cas de figure, c'est en amont, que l'on trie...)

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Re,
    J'ignore d'où tu sort qu'il faut exclure les goto !! au niveau commande MP, c'est exactement la même chose qu'un next ou un wend ou toute commande obligeant le code à revenir sur une adresse définie.
    Avec ma méthode tu ne fait pas une seule instruction de trop, suffit simplement de chronométrer sur un tri important pour constater !!
    Ceci dit, il y a des algo bien plus performant mais je ne les connaîs pas.
    A+

  10. #10
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour les amis une autre variante a tester!!
    je vois que Louis & Ouskel c'est toujours le grand Amour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub UserForm_Initialize()
    Dim t, i As Variant, m As Object, j As Long, temp
      On Error Resume Next
         Set m = CreateObject("Scripting.Dictionary")
           t = Worksheets("Feuil2").Range("A1:A" & Range("A65536").End(xlUp).Row)
              For i = LBound(t) To UBound(t)
                 m.Add t(i, 1), t(i, 1)
                   Next
                     For Each i In m
                           If i <> "" Then cbx1.AddItem i
                        Next
                     For i = 0 To cbx1.ListCount - 1
                   For j = 0 To cbx1.ListCount - 1
                If cbx1.List(i) < cbx1.List(j) Then
              temp = cbx1.List(i)
           cbx1.List(i) = cbx1.List(j)
          cbx1.List(j) = temp
       End If: Next j: Next i
    End Sub
    SALUTATIONS

Discussions similaires

  1. Tri dans listbox
    Par Chris171717 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 05/03/2013, 10h22
  2. [XL-2007] Faire en sorte d'insérer des données triées dans une ListBox.
    Par EtherniTy dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/09/2010, 13h35
  3. Tri dans un webcontrols listbox
    Par slideveloppeur2006 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 13/10/2008, 14h16
  4. Tri dans une listbox
    Par JLDpilot dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/04/2008, 15h28
  5. empecher le tri dans un listbox dynamiquement
    Par firejocker dans le forum MFC
    Réponses: 2
    Dernier message: 01/12/2005, 17h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo