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 :

Trier un tableau() as integer sans Sort - Deux méthodes testées


Sujet :

Macros et VBA Excel

  1. #1
    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 Trier un tableau() as integer sans Sort - Deux méthodes testées
    Bonjour,
    Je souhaite effectuer le tri d'un tableau() à une dimension en VBA.
    Je crois bien avoir vu passer une méthode sur le forum utilisant Sort.
    Me trompe-je ? ou cette méthode ne s'applique-t-elle qu'à un tableau à deux dimensions ?
    Je n'ai pas trouvé de réponse ni dans la FAQ (parmi les 125 propositions à "tri*" comme mot clé... les 8 à "trier" ou les 16 à "Sort") non plus qu'en recherche sur ce forum.
    Je sollicite donc votre mémoire...

    Je connais la méthode proposée par SilkyRoad dans le chapitre "Comment trier le contenu d'un ComboBox par ordre alphabétique ?"
    Ce n'est donc pas celle-ci que je souhaiterais utiliser.
    Merci de votre réponse

  2. #2
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Salut Ousk

    Tu es certain que l'on peut appliquer la méthode Sort à un tableau dynamique en VBA ? Il me semble, d'après ce que j'ai pu lire à gauche à droite, que cela est possible en VB.NET mais pas en VBA
    .
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Oukel'n'or,

    Je me dis que vous avez sûrement regardé ici, mais après tout, on ne sait jamais :

    http://silkyroad.developpez.com/vba/tableaux/#LXIV-D

  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
    Bonsoir Jacques-Jean, et merci.
    En effet, c'est le même principe que pour les combobox. Mais pour 352 tableaux... plutôt long comme méthode. Je crois que je vais finir par me résoudre à utiliser sort sur un range temporaire dans lequel je collerai chaque tableau.
    Hello fring,
    Possible que j'ai vu ça ailleurs. Je vais poser la question sur Général VBA... à tout hasard. Mais il me semble que ça fonctionnait pour un tableau à deux dimensions, pas pour une seule... ce qui m'irait aussi.
    Sais-tu si Sort existe dans VB* ? J'ai un trou. D'ailleurs, je m'aperçois qu'à répondre ici sans plus pratiquer, j'ai plein de trous partout Ça me rend tout morose
    Merci à tous les deux
    Bonne soirée

  5. #5
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Je ne pourrais pas te répondre pour VB*, je n'ai que VBA
    Pour les trous, ne t'inquiète pas, même en pratiquant j'en ai constamment
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  6. #6
    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
    PS - Si je cherche une méthode la plus rapide possible, c'est qu'à chaque intervention de l'utilisateur, la procédure de tri devra être exécutée.
    Je viens de me souvenir du tri dicotomique et je l'ai retrouvé ici http://www.developpez.net/forums/d41...-dichotomique/. Bon ça va, un trou de bouché.
    Ouf !

    Edit
    Je viens de voir ta réponse, fring, et tu crois que ça va me rassurer ?

    Edit (re)
    Il ne s'agit pas d'un tri mais d'une recherche... C'est le titre qui m'a trompé.
    Bon, je poursuis mes recherches.

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonsoir,

    Tu peux utiliser des algorithmes classiques comme QuickSort, bien adapté aux tableaux de grande taille en désordre complet, ou ShellSort très efficace sur des tableaux présentant déja un ordonnancement relatif.

    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
    Public Sub QuickSort(Table() As Long, LeftIndex As Long, RightIndex As Long)
        Dim i As Long, j As Long, P As Long, T As Long
        If RightIndex > LeftIndex Then
            P = LeftIndex
            i = LeftIndex
            j = RightIndex
            Do
                If Table(i) >= Table(j) Then
                    T = Table(i)
                    Table(i) = Table(j)
                    Table(j) = T
                    P = i + j - P
                End If
                If P = i Then j = j - 1 Else i = i + 1
            Loop Until i = j
            If LeftIndex < i - 1 Then QuickSort Table, LeftIndex, i - 1
            If RightIndex > j + 1 Then QuickSort Table, j + 1, RightIndex
        End If
    End Sub
    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
    Private Sub ShellSort(Table() As Long, LeftIndex As Long, RightIndex As Long)
        Dim i As Long, j As Long, inc As Long, P As Long
        inc = 1
        Do While inc <= RightIndex - LeftIndex
            inc = 3 * inc + 1
        Loop
        Do
            inc = inc \ 3
            For i = LeftIndex + inc To RightIndex
                P = Table(i)
                j = i
                Do While Table(j - inc) > P
                    Table(j) = Table(j - inc)
                    j = j - inc
                    If j <= inc Then Exit Do
                Loop
                Table(j) = P
            Next
        Loop While inc > 1
    End Sub
    Pense à adapter le type de donnée du tableau transmis.

    Bonne soirée,

    Tirex28/

  8. #8
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut Tri par permutations
    Bonjour.

    Moi j'utilise cet algo qui est assez efficace : un système de permutations :
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    Public Sub subTrier(ByRef Liste As Variant, ByVal bCrois As Boolean)
    'trie une liste de type non défini, par ordre croissant si bCrois; sinon décroissant
    'utilise 4 sous fonctions
    Dim iFrom As Integer, iTo As Integer
     
    iFrom = LBound(Liste)
    iTo = UBound(Liste)
     
    Select Case bCrois
        Case True
            While iFrom < iTo
                Call subPermute11(Liste, iFrom, iTo)
                Call subPermute21(Liste, iTo, iFrom)
            Wend
        Case False
            While iFrom < iTo
                Call subPermute12(Liste, iFrom, iTo)
                Call subPermute22(Liste, iTo, iFrom)
            Wend
    End Select
    End Sub
     
    Private Sub subPermute11(ByRef Liste As Variant, ByVal iFrom As Integer, ByRef iTo As Integer)
    'permute les éléments Liste(iFrom) à Liste(iTo) , iFRom < iTo, pour les rendre croissants 2 à 2
    'change la valeur de iTo qui devient l'indice sup non rangé
    Dim iT As Integer, i As Integer, var As Variant
     
    If iFrom >= iTo Then Exit Sub
     
    i = iFrom
    iT = iFrom
     
    While i < iTo
        If Liste(i) > Liste(i + 1) Then
            var = Liste(i)
            Liste(i) = Liste(i + 1)
            Liste(i + 1) = var
            iT = i
        End If
        i = i + 1
    Wend
    iTo = iT
     
    End Sub
     
    Private Sub subPermute21(ByRef Liste As Variant, ByVal iFrom As Integer, ByRef iTo As Integer)
    'permute les éléments Liste(iFrom) à Liste(iTo),iTo < iFrom pour les rendre croissants 2 à 2
    'change la valeur de iTo qui devient l'indice sup non rangé
    Dim iT As Integer, i As Integer, var As Variant
     
    If iFrom <= iTo Then Exit Sub
     
    i = iFrom
    iT = iFrom
     
    While i > iTo
        If Liste(i) < Liste(i - 1) Then
            var = Liste(i)
            Liste(i) = Liste(i - 1)
            Liste(i - 1) = var
            iT = i
        End If
        i = i - 1
    Wend
    iTo = iT
     
    End Sub
     
    Private Sub subPermute12(ByRef Liste As Variant, ByVal iFrom As Integer, ByRef iTo As Integer)
    'permute les éléments Liste(iFrom) à Liste(iTo) , iFRom < iTo, pour les rendre décroissants 2 à 2
    'change la valeur de iTo qui devient l'indice sup non rangé
    Dim iT As Integer, i As Integer, var As Variant
     
    If iFrom >= iTo Then Exit Sub
     
    i = iFrom
    iT = iFrom
     
    While i < iTo
        If Liste(i) < Liste(i + 1) Then
            var = Liste(i)
            Liste(i) = Liste(i + 1)
            Liste(i + 1) = var
            iT = i
        End If
        i = i + 1
    Wend
    iTo = iT
     
    End Sub
     
    Private Sub subPermute22(ByRef Liste As Variant, ByVal iFrom As Integer, ByRef iTo As Integer)
    'permute les éléments Liste(iFrom) à Liste(iTo),iTo < iFrom pour les rendre décroissants 2 à 2
    'change la valeur de iTo qui devient l'indice sup non rangé
    Dim iT As Integer, i As Integer, var As Variant
     
    If iFrom <= iTo Then Exit Sub
     
    i = iFrom
    iT = iFrom
     
    While i > iTo
        If Liste(i) > Liste(i - 1) Then
            var = Liste(i)
            Liste(i) = Liste(i - 1)
            Liste(i - 1) = var
            iT = i
        End If
        i = i - 1
    Wend
    iTo = iT
     
    End Sub
    Son efficacité vient du fait qu'on ne s'amuse pas à comparer chaque valeur avec toutes les autres. Mets un chrono et tu verras si ça te convient.

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  9. #9
    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
    Mon idée : Un range est un tableau à deux dimensions. Une pour les colonnes, l'autre pour les lignes.
    Ensuite je peux passer en revue mon range.value avec for each...
    Je peux trier mon range avec sort.
    Donc, en partant d'un tableau à deux dimensions... ne pourrait-on pas inverser le bidule ?
    Le problème est donc de "convertir" un tableau à deux dimensions en range.Value.
    Ce qui me dérange un peu dans mon raisonnement c'est comment passer du range.value au range...
    J'ai dû rêver...
    Donc, si quelqu'un a vu passer mon rêve, merci de me donner ses coordonnées.

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonsoir,

    Récupérer une plage de cellule dans un tableau, récupérer un tableau dans une plage de cellules.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Dim liste, i As Long
     
        liste = Application.Transpose(Range("A1:A5"))
        For i = LBound(liste) To UBound(liste)
            liste(i) = liste(i) * 2
            Debug.Print liste(i)
        Next
     
        Range("A1:A5").Value = Application.Transpose(liste)
    Bonne nuit,

    Tirex28/

  11. #11
    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
    Hello pgz
    J'ai tardé à poster et n'avais pas vu ta réponse.
    Merci pour ton code. Je testerai ça demain en première heure.
    Hello Tirex,
    Jusque là, ça va... c'est effectivement la première partie de la réponse.
    Si j'opte pour la solution utilisant Sort, c'est sans doute ce que je ferai. Je testerai demain pour savoir laquelle des deux est la plus rapide.
    Merci à vous deux et bonne nuit
    Je vous tiens au courant, fring a donné un très bon code pour chronométrer les procédures. Je vais tâcher de le retrouver
    A+

  12. #12
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  13. #13
    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,

    - sous VB6, pas de méthode sort non plus pour un tabeai dynamique.

    - ce qui m'interpelle, dans ce que tu as écrit, Ousk, est le fait qu'il te paraît te souvenir d'une possibilité utilisant la méthode sort avec un tableau à 2 dimensions. J'ai également en mémoire l'existence d'une astuce de ce genre.... Elle consistait, si ma mémoire ne me trahit pas, à se servir d'une base de données alimentée par les données du tableau puis triée avec Sort
    Je crois par contre me rappeler également que le bénéfice réel, en temps d'exécution total, n'était pas vraiment significatf...

  14. #14
    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
    Merci fring. Je m'y mets de ce pas.
    Hello uc,
    Merci de te pencher sur mon sort. Il me semblait bien que je n'étais pas encore tout à fait sénile... A moins que nous le soyons tous les deux
    L'idiot dans l'histoire est que je ne me souviens plus qui avait proposé cette solution.
    En supposant qu'elle existe bien, comment déclarer/instancier le tableau pour que ce soit possible ? Zatizzekouistionne.
    Je teste les deux solutions proposées et je reviens.
    A+

  15. #15
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    si tu peux utiliser un tableau à 2 dimentions, le plus rapide serait pour moi d'agir comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub toto()
    Dim tabTabloExemple As Variant
     
    'Alimentation de la feuille de passage tri
    Range("A10 :G30").Value = tabTabloExemple
     
    ' **** Triage cellules via sort....
     
    'Réalimentation tableau trié
    tabTabloExemple = Range("A10 :G30").Value
    à chronomètrer

    cf : http://www.developpez.net/forums/d62...au-vers-excel/

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  16. #16
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonjour à tous

    Citation Envoyé par ouskel'n'or Voir le message
    Je souhaite effectuer le tri d'un tableau() à une dimension en VBA.
    Ce sont des valeurs, je suppose.

    Pour ma part, quand j'ai besoin de trier un tableau(), je me sers de ceci. Tout dépend ce que l'on fait ensuite. Voici ma proposition pour un tri décroissant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 0 To 9
      mavar = Application.WorksheetFunction.Large((T), i + 1)
    Next i
    Ceci est valable pour 1 dim ou plusieurs

    si j'ai compris la demande, bien entendu

    Eric

  17. #17
    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
    J'ai raison d'insister... Mes tests :
    Si je parcours une feuille de calculs et crée une copie de la ligne de données (de première colonne à dernière colonne) afin de la trier (tri non compris)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For Each Cell In FL3.Range(Cells(1, ColDeb).Address & _
            ":" & Cells(derlig, ColDeb).Address)
            FL4.Range(Cells(1, ColDeb).Address & ":" & Cells(1, ColFin).Address) = _
            FL3.Range(Cells(Cell.Row, ColDeb).Address & ":" & Cells(Cell.Row, ColFin).Address)
        Next
    Temps d'exécution : 17sec16
    Si je crée simplement un tableau de la ligne de données (de première colonne à dernière colonne) afin de la trier (tri non compris)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For Each Cell In FL3.Range(Cells(1, ColDeb).Address & _
            ":" & Cells(derlig, ColDeb).Address)
            Tablo = FL3.Range(Cells(Cell.Row, ColDeb).Address & _
            ":" & Cells(Cell.Row, ColFin).Address).Value
        Next
    Temps d'exécution : 3sec57
    Y'a pas photo (J'ai d'autres tests passant par des variables "plage" mais les différences de temps d'exécution ne sont pas significatives)
    Je vais ajouter les deux types de tris et je reviens.

    Edit
    Hello edelweisseric,
    Merci de ta réponse, je me penche sur Large (je n'ai pas pensé à une solution Excel )
    Je reviens
    A+

  18. #18
    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
    Re,

    s'il s'agit d'un tableau dynamique ( donc pas Excel) à une dimension (je crois l'avoir compris) :
    S'il contient des valeurs numériques :
    tu trouveras la manière la plus rapide ici :
    http://www.developpez.net/forums/d12...-fonction-tri/

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Pour connaître les meilleurs tris en terme de performances, personnellement je tape "algorithmes de tri" sur google, et on trouve des résultats plus ou moins pertinents.

    Bon après, il reste encore à savoir les traduire en VBA.

  20. #20
    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
    Merci pour ta suggestion, decondelite.
    Au départ je souhaitais utiliser Sort sur un tableau, ce qui m'évitait bien des questions
    Merci ucfoutu, tu m'as offert la solution sur un plateau. Avec le tri proposé par méphistopheles, plus besoin de copier les données dans les cellules.
    En situation réelle, 0,14 secondes ! (pour comparer les temps mes tests portaient sur 65535 lignes, non 352)
    J'ai seulement adapté. Tableau as variant et retour de fonction.

    Pour ceux que ça intéressent et comme le code de méphistocéleste n'est pas dans la FAQ VBA-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
    Sub Test()
    Dim FL3 As Worksheet, Cell As Range, derlig As Long, ColFin As Integer, i As Integer
    Dim Tablo, Recup, Tablo2() 'As Variant tous les trois
        Set FL3 = Worksheets("Feuil3")
        ColFin = 10 'ou dernière colonne renseignée de la ligne ou de la plage
        ReDim Tablo2(ColFin)
        Tablo = FL3.Range("A1:" & Cells(1, ColFin).Address).Value
        For i = 1 To ColFin
            Tablo2(i) = Tablo(1, i)
        Next
        Recup = QUICKSORT(Tablo2, 1, ColFin)
     
        'vérif du résultat du classement
        For i = 1 To ColFin
            msg = msg & Recup(i) & vbCr
        Next
        MsgBox msg
     
    End Sub
    Citation Envoyé par méphistopheles
    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
    Public Function QUICKSORT(Tableau As Variant, Debut As Integer, Fin As Integer) As Variant
    Dim Pivot As Integer
    Dim Gauche As Integer
    Dim Droite As Integer
    Dim temp As Integer
        Pivot = Debut
        Gauche = Debut
        Droite = Fin
        Do
            If Tableau(Gauche) >= Tableau(Droite) Then
                temp = Tableau(Gauche)
                Tableau(Gauche) = Tableau(Droite)
                Tableau(Droite) = temp
                Pivot = Gauche + Droite - Pivot
            End If
            If Pivot = Gauche Then
                Droite = Droite - 1
            Else
                Gauche = Gauche + 1
            End If
            DoEvents
        Loop Until Gauche = Droite
      If Debut < Gauche - 1 Then QUICKSORT Tableau, Debut, Gauche - 1
      If Fin > Droite + 1 Then QUICKSORT Tableau, Droite + 1, Fin
      QUICKSORT = Tableau
    End Function
    Bonne journée à tous, mon pb est

    Edit
    Hello Ormonth, je n'avais pas vu ta réponse
    En fait, ce qui prend le plus de temps est le collage du tableau dans la feuille de calculs. C'est pour cette raison que je cherchais à l'éviter.
    La solution que j'ai finalement adoptée fait ça.
    Si quelqu'un a la réponse à ma question originelle, je suis toujours intéressé, juste pour me rassurer et savoir que je n'ai pas rêvé
    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Trier un tableau() avec Sort
    Par ouskel'n'or dans le forum Général VBA
    Réponses: 6
    Dernier message: 02/10/2012, 14h01
  2. Trier un tableau a deux dimension
    Par Carb0 dans le forum Langage
    Réponses: 1
    Dernier message: 11/12/2008, 17h03
  3. Trier un tableau à deux dimensions
    Par ghost emperor dans le forum VB.NET
    Réponses: 4
    Dernier message: 24/04/2008, 15h51
  4. [Prototype] Trier un tableau à deux dimensions par colonnes
    Par G.D.V.L. dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 12/06/2007, 12h20
  5. [PERL] Trier un tableau a deux dimensions
    Par piregwan dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2005, 22h29

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