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 :

Adapter Tri rapide (quickSort) pour listbox [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 218
    Par défaut Adapter Tri rapide (quickSort) pour listbox
    Bonjour

    J'ai un liste de donnée qui s'affiche dans une listbox

    Mon code fonction, avec la liste non triée, mais lorsque je veux la trier
    à partir d'un bouton, le tri ne fonction pas.

    ou est le problème ?
    merci d'avance

    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
     
    Private Sub UserForm_Activate()
    Dim Tb, Ii, Ij
    Dim TabListBox As Variant
    Dim i, j, k, l As Byte
    Dim temp As String
     
    Tb = TableClient.Range("A2:C" & TableClient.Range("A" & TableClient.Rows.Count).End(xlUp).Row)
     
        With Me.ListBox1
           .ColumnCount = 2
           .ColumnWidths = "45;100"
            For i = LBound(Tb, 1) To UBound(Tb, 1)
     
                If Tb(i, 1) = "Oui" Then  'sélectionne les lignes avec en colonne A de ma table T_client qui correspondent à la valeur "Oui" 
                    .AddItem Tb(i, 2)
                    .List(.ListCount - 1, 1) = Tb(i, 3)
                    j = j + 1
                End If
            Next i
    nd With
     
     
    ' Tri par libellé le plan des comptes clients Correspond à colonne B de ma table
     
    ' je rajoute l'appel à quicksort  'ancien amplement de mon tri par bulle trop long
    '
    Call QUICKSORT(t(), loBound(t), upBound(t))    'Proc récursive
     
     
    End Sub
    Le mode standard
    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
     
    Public Sub QUICKSORT(t() As Long, _
                        ByVal loBound As Long, _
                        ByVal upBound As Long)
     
        Dim med_value As Long
        Dim hi As Long
        Dim lo As Long
        Dim i As Long
     
        If loBound >= upBound Then Exit Sub
        i = Int((upBound - loBound + 1) * Rnd + loBound)
        med_value = t(i)
        t(i) = t(loBound)
        lo = loBound
        hi = upBound
        Do
            Do While t(hi) >= med_value
                hi = hi - 1
                If hi <= lo Then Exit Do
            Loop
            If hi <= lo Then
                t(lo) = med_value
                Exit Do
            End If
            t(lo) = t(hi)
            lo = lo + 1
            Do While t(lo) < med_value
                lo = lo + 1
                If lo >= hi Then Exit Do
            Loop
            If lo >= hi Then
                lo = hi
                t(hi) = med_value
                Exit Do
            End If
            t(hi) = t(lo)
        Loop
        ' Recursive calls
        QUICKSORT t(), loBound, lo - 1
        QUICKSORT t(), lo + 1, upBound
    End Sub

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour, bonjour,

    où est le problème : dans ton code tu tries quoi et quand ?‼

    En clair : trier "rien" après création de la ListBox, effectivement cela ne fonctionne pas
    mais ce n'est pas la faute du code qui n'effectue que ce qu'on lui demande ‼

    Solution la plus simple pour les débutants : trier directement les cellules de la feuille de calculs …

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 218
    Par défaut
    Tout d'abord, méaculpa, j'ai nettoyer mon code.

    J'ai une table dans l'onglet T_client avec 2300 lignes
    Colonne A=Oui
    Colonne B=NO
    Colonne C=Libellé


    Mon code formant ma listbox1, fonctionne bien.
    J'arrive à trier le champ [Libellé] dans la listbox1, mais c'est trop long.

    Alors j'ai trouvé cette méthode de tri très rapide QUICKSORT.

    Pour l'instant j'ai placé donc l'appel [QUICKSORT] là où je triais à bulle (trop long)

    Mon but c'est que l'utilisateur lance le tri par libellé tri à partir d'un bouton [CommandTriNom] dans ma Usform.

    j'ai fait un fichier
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip V0.zip (167,5 Ko, 174 affichages)

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    où est le problème : dans ton code tu tries quoi et quand ?‼

    En clair : trier "rien" après création de la ListBox, effectivement cela ne fonctionne pas
    Pas de réponse ni à ma question ni à ma remarque …
    Citation Envoyé par crissud Voir le message
    Alors j'ai trouvé cette méthode de tri très rapide QUICKSORT.
    Si tu es un adepte sauvage du Copier / Coller sans utiliser de neurone,
    cette procédure, telle quelle, sert à trier des valeurs numériques, des entiers de type Long : est-elle adaptée ?
    On en revient donc à : tu tries quoi ? Et sans oublier quand ? Question de pure logique …

    Sans compter s'il y a des doublons dans la source …
    En plus t'as mal choisi, vraiment moche comme QUICKSORT ! (tri rapide)
    Sur ce forum j'ai pourtant vu bien mieux … Et dire que le tri direct dans la feuille de calcul est le plus rapide ‼
    Citation Envoyé par crissud Voir le message
    Pour l'instant j'ai placé donc l'appel [QUICKSORT] là où je triais à bulle (trop long)
    Si personne d'autre ne fait le boulot à ta place, alors là vraiment je demande à voir le classeur
    avec le tri à bulles car, vu le code ouvrant cette discussion, je doute vraiment de son fonctionnement …

    Mais cela répondrait certainement à : tu tries quoi ? Suffit de lire le code …

    Précision : "tu tries quoi" fait référence à ta ligne de code n°28 appelant la procédure QUICKSORT …

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 218
    Par défaut
    Bonjour,

    Merci de ton retour.

    Trier la table avant de l'afficher dans la listbox1, aurait la contrainte de la re-trier la table par numéro avant la fin de la procédure pour la remettre en l'état d'origine.



    Oui le tri par bulle fonctionne, je l'ai rajouté dans mon fichier V1
    Ceci dit il est peut être mal utilisé.


    Enfin pour en revenir sur mon tri rapide, j'ai avancé depuis ton dernier retour, j'ai repris un code pour un tri Alpha.

    j'ai une erreur 'n'appartient pas à la sélection' sur la ligne
    lib(i) = Tb(i, 3) 'charge la valeur alpha à trier


    dans Tb(i,3) j'ai bien la valeur à trier de la 1ère ligne
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip V1.zip (22 octets, 116 affichages)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 218
    Par défaut
    Merci de m'avoir répondu et me faire pointer du doigt ce qui ne pouvait pas fonctionner

    bon dimanche

    J'ai pu aboutir à un autre code me permettant d'effectuer un tri rapide de 4400 lignes environ.

    Je coche résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Algorithme de Tri Rapide - QuickSort algorithm
    Par LenyEdwarx dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 05/02/2015, 09h29
  2. QuickSort (tri rapid)
    Par chester119 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/01/2008, 21h34
  3. [TP] Tri rapide pour liste simplement chaînée
    Par druzy dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 25/11/2007, 15h52
  4. Tri Rapide sur un CLIST
    Par ensisoft dans le forum MFC
    Réponses: 9
    Dernier message: 13/12/2005, 23h22
  5. Tri rapide
    Par DBBB dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 10/12/2004, 17h54

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