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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Basicnav
    Profil pro
    Inscrit en
    Février 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2008
    Messages : 245
    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

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 245
    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 !!!

  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
    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 Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    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

  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
    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+

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