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 confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut Tri dans listbox
    * Bonjour, *

    avec le code suivant je fait un tri alphbetique dans une listbox... malheureusement ce tri ne se fait que sur la première colonne de ma listbox...
    c'est bien la colonne de référence pour le tri, mais le reste des colonnes ne suit pas...

    Comment puis-je adapter ce code pour 6 colonnes... !?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      With ListBox1
        If .ListCount < 2 Then Exit Sub
        Do
          Ok = True
          For i = 0 To .ListCount - 2
            If .List(i) > .List(i + 1) Then
              temp = .List(i)
              .List(i) = .List(i + 1)
              .List(i + 1) = temp
              Ok = False
            End If
          Next i
        Loop Until Ok = True
      End With
    * Merci *

  2. #2
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    bonsoir,

    je penses qu'il te faut aborder la liste comme suit ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim L as Integer, C as Integer, i as Integer,n, Temp
     
    L= Ubound(Listbox1.List)
    c= Ubound(Listbox1.List,2)
    Redim Temp (1 to L, 1 to c)
    "La boucle imbriquée te permet de passer en revue les colonnes"
    For i = 1 l
        if ....then
           For n= 1 to c
    ....
           Next
    next
    Je me poses la question suivante: obtiens tu vraiment un tri cohérent sur ta première colonne avec ton code si différentes lignes ont une valeur identique ?


    PS: n'oublies pas que l'indice de base est 0

  3. #3
    Membre confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut
    c'est à dire qu'en fait il faudrait générer un code qui reprend le principe de l'option tri de excel...

    le tri doit s'effectuer par Nom (colonne A) puis par Prénom (colonne B) puis par classe (colonne C)

    c'est bien ça ?

  4. #4
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    re,

    Oui c'est une idée à laquelle je n'avais pas pensé.
    tu as déjà un support : Excel qui met à ta disposition plein de fonctions.

    tu n'as qu'à envoyer ta liste sur une plage libre. y effectuer le tri proprement et ramener cette valeur.

  5. #5
    Membre confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut
    Peut-être une question bête... mais peut-on utiliser la fonction '.Sort' dans une listbox !?

    :roll

  6. #6
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 56
    Par défaut
    Bonjour,

    -Ne pas trier directement un ListBox (lent) mais trier dans un tableau.
    -Utiliser un tri rapide (Quick Sort) et non pas un tri du type Bubble (très lent)

    Voir en PJ différentes façons de trier un ListBox (tableau ou tableur).

    Ceuzin
    Fichiers attachés Fichiers attachés

  7. #7
    Membre confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut
    Ok je vais regarder ça pour essayer d'adapter... mais je n'ai pas besoin de cliquer quelque part pour faire mon tri, je veux qu'il soit automatique par Nom / Prénom / Classe... à l'ouverture de la listbox

  8. #8
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 56
    Par défaut
    Tri par nom+prénom

    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
     
     
    Private Sub UserForm_Initialize()
     Dim clé() As String, index() As Long, a(), b()
     With Sheets("TriListBox")
       Me.ListBox1.List = .Range("A2:C" & .[A65000].End(xlUp).Row).Value
     End With
     a = Me.ListBox1.List
     ReDim b(LBound(a) To UBound(a), LBound(a, 2) To UBound(a, 2))
     ReDim clé(LBound(a) To UBound(a, 1))
     ReDim index(LBound(a) To UBound(a, 1))
     For i = LBound(a) To UBound(a, 1)
        clé(i) = a(i, 0) & a(i, 1): index(i) = i
      Next i
      Call Tri(clé(), index(), LBound(a), UBound(clé))
      For lig = LBound(clé) To UBound(clé)
         For col = LBound(a, 2) To UBound(a, 2): b(lig, col) = a(index(lig), col): Next col
      Next lig
      Me.ListBox1.List = b
    End Sub
     
    Sub Tri(clé() As String, index() As Long, gauc, droi) ' Quick sort
      ref = clé((gauc + droi) \ 2)
      g = gauc: d = droi
      Do
        Do While clé(g) < ref: g = g + 1: Loop
        Do While ref < clé(d): d = d - 1: Loop
        If g <= d Then
          temp = clé(g): clé(g) = clé(d): clé(d) = temp
          temp = index(g): index(g) = index(d): index(d) = temp
          g = g + 1: d = d - 1
        End If
      Loop While g <= d
      If g < droi Then Call Tri(clé, index, g, droi)
      If gauc < d Then Call Tri(clé, index, gauc, d)
    End Sub
    Ceuzin
    Fichiers attachés Fichiers attachés

  9. #9
    Membre confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut
    Oups je t'ai dit une bétise... j'étais encore sur mon ancien fonctionnement.. en fait le tri doit se faire :

    * après selection de combobox pour un userform
    * après click sur un commandbutton pour un autre userform

    Je suppose donc que je dois juste adapter et déplacer la partie que tu as mis dans 'Initialize' pour la placer dans 'ComboBox_Click' ou 'CommandButton_Click' selon le cas

    Est-ce que c'est bien ça !?

  10. #10
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    bonsoir,

    Citation Envoyé par Chris171717 Voir le message
    Peut-être une question bête... mais peut-on utiliser la fonction '.Sort' dans une listbox !?

    :roll

    non. C'est une méthode qui ne s'applique que sur un objet range.
    Pour t'aider voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim r_dest As Range, n, lbx
     
    'si la liste comporte des entêtes XlGuess
    lbx = listbox1.List
    Set r_dest = Range("x1").Range(Cells(1, 1), Cells(UBound(lbx, 1), UBound(lbx, 2)))
    r_dest = lbx
    r_dest.Sort r_dest.Columns(2), xlDescending
    lbx = r_dest
     r_dest.ClearContents
    listbox1.List = lbx
    tu peux trier pour un groupage des valeurs semblables sur différentes colonnes aussi en procédant ainsi jusqu'à 3 niveaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    r_dest.Sort key1:=r_dest.Columns(1), order1:=xlDescending, key2:=r_dest.Columns(2), _
    Order2:=xlDescending, key3:=r_dest.Columns(3), order3:=xlDescending

  11. #11
    Membre confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut
    NVCfrm

    D'accord, mais du coup comment faire pour trier uniquement dans la listbox... je n'arrive décidément pas à trouver ma solution...
    ____

    sophieceuzin

    ton code fonctionne mais du coup je n'ai plus que nom prénom et classes qui s'affichent dans ma listbox...

  12. #12
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 56
    Par défaut
    Envoie un échantillon du fichier.

    Ceuzin

  13. #13
    Membre confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut
    Voilà

    j'ai inséré ton code dans le userform3 dans le combobox1_click
    Fichiers attachés Fichiers attachés

  14. #14
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 56
    Par défaut
    Il faut supprimer ces lignes (elles transfèrent toute la bd dans la listbox)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     'With Sheets("Retenues")
     '  Me.ListBox1.List = .Range("A2:I" & .[A65000].End(xlUp).Row).Value
     'End With
    Ceuzin

  15. #15
    Membre confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut
    Super Merci beaucoup ça fonctionne parfaitement maintenant...

    a moi d'adapter à mes autres userform...

    Re !

    J'ai parlé un peu vite... ça fonctionne partout SAUF pour mon userform4 où je l'ai intégré dans 3 combobox... ça fonctionne pour la première et la troisième mais pas pour la seconde... j'ai une erreur 'incompatibilité de type' à la ligne

    aurais-tu une idée !?

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    'MISE A JOUR DES VALEURS DEPUIS LA COMBOBOX1
    Private Sub ComboBox1_Click()
     MajLiset Me.ComboBox1, Me.ComboBox2, Me.ComboBox3
     
     'pour trier l'affichage
     Dim Lig
     Dim Col
     Dim clé() As String, index() As Long, a(), b()
     a = Me.ListBox1.List
     ReDim b(LBound(a) To UBound(a), LBound(a, 2) To UBound(a, 2))
     ReDim clé(LBound(a) To UBound(a, 1))
     ReDim index(LBound(a) To UBound(a, 1))
     For i = LBound(a) To UBound(a, 1)
        clé(i) = a(i, 0) & a(i, 1): index(i) = i
      Next i
      Call Tri(clé(), index(), LBound(a), UBound(clé))
      For Lig = LBound(clé) To UBound(clé)
         For Col = LBound(a, 2) To UBound(a, 2): b(Lig, Col) = a(index(Lig), Col): Next Col
      Next Lig
      Me.ListBox1.List = b
     
    End Sub
     
    'MISE A JOUR DES VALEURS DEPUIS LA COMBOBOX2
    Private Sub ComboBox2_Click()
     MajLiset Me.ComboBox1, Me.ComboBox2, Me.ComboBox3
     
    'pour trier l'affichage
     Dim Lig
     Dim Col
     Dim clé() As String, index() As Long, a(), b()
     a = Me.ListBox1.List
     ReDim b(LBound(a) To UBound(a), LBound(a, 2) To UBound(a, 2))
     ReDim clé(LBound(a) To UBound(a, 1))
     ReDim index(LBound(a) To UBound(a, 1))
     For i = LBound(a) To UBound(a, 1)
        clé(i) = a(i, 0) & a(i, 1): index(i) = i
      Next i
      Call Tri(clé(), index(), LBound(a), UBound(clé))
      For Lig = LBound(clé) To UBound(clé)
         For Col = LBound(a, 2) To UBound(a, 2): b(Lig, Col) = a(index(Lig), Col): Next Col
      Next Lig
      Me.ListBox1.List = b
     
    End Sub
     
    'MISE A JOUR DES VALEURS DEPUIS LA COMBOBOX3
    Private Sub ComboBox3_Click()
     MajLiset Me.ComboBox1, Me.ComboBox2, Me.ComboBox3
     
    'pour trier l'affichage
     Dim Lig
     Dim Col
     Dim clé() As String, index() As Long, a(), b()
     a = Me.ListBox1.List
     ReDim b(LBound(a) To UBound(a), LBound(a, 2) To UBound(a, 2))
     ReDim clé(LBound(a) To UBound(a, 1))
     ReDim index(LBound(a) To UBound(a, 1))
     For i = LBound(a) To UBound(a, 1)
        clé(i) = a(i, 0) & a(i, 1): index(i) = i
      Next i
      Call Tri(clé(), index(), LBound(a), UBound(clé))
      For Lig = LBound(clé) To UBound(clé)
         For Col = LBound(a, 2) To UBound(a, 2): b(Lig, Col) = a(index(Lig), Col): Next Col
      Next Lig
      Me.ListBox1.List = b
     
    End Sub
     
    Sub Tri(clé() As String, index() As Long, gauc, droi) ' Quick sort
      Dim ref
      Dim g
      Dim d
      Dim temp
      ref = clé((gauc + droi) \ 2)
      g = gauc: d = droi
      Do
        Do While clé(g) < ref: g = g + 1: Loop
        Do While ref < clé(d): d = d - 1: Loop
        If g <= d Then
          temp = clé(g): clé(g) = clé(d): clé(d) = temp
          temp = index(g): index(g) = index(d): index(d) = temp
          g = g + 1: d = d - 1
        End If
      Loop While g <= d
      If g < droi Then Call Tri(clé, index, g, droi)
      If gauc < d Then Call Tri(clé, index, gauc, d)
    End Sub
    J'ai rien dit...

    J'avais mal placé mon code...

    MErci encore pour l'aide

  16. #16
    Membre confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut
    Bonjour,

    alors je reviens vous voir car j'ai de nouveau un souci avec ce code...

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Private Sub CommandButton3_Click()
      Dim Plage As Range, Est, Add As String, vLi As Integer, Vcol As Byte
      Dim i As Integer
      Dim temp
      Dim Ok As Boolean
     
      With ListBox1
        .Clear
        .ColumnCount = 6
        .ColumnWidths = "120;90;20;255;80;60"
        Set Plage = Range("H2:H" & [H65000].End(xlUp).Row)
        Set Est = Plage.Find(False)
        If Not Est Is Nothing Then
          Add = Est.Address
          Do
            .AddItem Cells(Est.Row, 1)
            For Vcol = 2 To 6
              .List(vLi, Vcol - 1) = Cells(Est.Row, Vcol)
            Next
            vLi = vLi + 1
            Set Est = Plage.FindNext(Est)
          Loop While Not Est Is Nothing And Est.Address <> Add
        End If
        TextBox1 = .ListCount
      End With
     
     
    'pour trier l'affichage
     Dim Lig
     Dim Col
     Dim clé() As String, index() As Long, a(), b()
     a = Me.ListBox1.List
     ReDim b(LBound(a) To UBound(a), LBound(a, 2) To UBound(a, 2))
     ReDim clé(LBound(a) To UBound(a, 1))
     ReDim index(LBound(a) To UBound(a, 1))
     For i = LBound(a) To UBound(a, 1)
        clé(i) = a(i, 0) & a(i, 1): index(i) = i
      Next i
      Call Tri(clé(), index(), LBound(a), UBound(clé))
      For Lig = LBound(clé) To UBound(clé)
         For Col = LBound(a, 2) To UBound(a, 2): b(Lig, Col) = a(index(Lig), Col): Next Col
      Next Lig
      Me.ListBox1.List = b
     
      End Sub
     
     
    Sub Tri(clé() As String, index() As Long, gauc, droi) ' Quick sort
      Dim ref
      Dim g
      Dim d
      Dim temp
      ref = clé((gauc + droi) \ 2)
      g = gauc: d = droi
      Do
        Do While clé(g) < ref: g = g + 1: Loop
        Do While ref < clé(d): d = d - 1: Loop
        If g <= d Then
          temp = clé(g): clé(g) = clé(d): clé(d) = temp
          temp = index(g): index(g) = index(d): index(d) = temp
          g = g + 1: d = d - 1
        End If
      Loop While g <= d
      If g < droi Then Call Tri(clé, index, g, droi)
      If gauc < d Then Call Tri(clé, index, gauc, d)
    End Sub
    Avec ce code je tri donc dans ma listbox, mais ça ne tri que par le nom et pas par le prénom...

    Auriez-vous une idée !?

  17. #17
    Membre confirmé
    Homme Profil pro
    Educateur Animateur
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur Animateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Par défaut
    un petit Up pour savoir si vous avez une idée pour mon souci ci-dessus...

Discussions similaires

  1. [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
  2. Tri dans listbox
    Par Basicnav dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 29/11/2009, 15h20
  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