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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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
    Membre émérite
    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
    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

  3. #3
    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
    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/

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    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.

  5. #5
    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
    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

  6. #6
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Salut Ousk' merci pour cette question, je mets la soluce de méphistopheles dans mes tablettes =

    Pour ce que j'avais suggéré, c'était surtout au niveau de l'alimentation de l'array que le focus était mis, le fait de ne pas utiliser de boucle impacte très fort la durée...

    Le test suivant n'a d'intérêt que dans ce sens, vu que sinon ça revient à un copié-collé sinon

    construction d'une feuille 60000 lignes 4 colonnes (outils de ma boîte à tests)

    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
    Sub Construit()
    Dim I As Long
     
    For I = 1 To 60000
        Cells(I, 1) = I
    Next I
    Range("B1").Formula = "=A1*1.125"
    Range("C1").Formula = "=A1*B1"
    Range("D1").Formula = "=(A1*B1^2/C1)*(125^1/2)"
    Range("B1").Select
    Selection.AutoFill Destination:=Range("B1:B60000"), Type:=xlFillDefault
    Range("C1").Select
    Selection.AutoFill Destination:=Range("C1:C60000"), Type:=xlFillDefault
    Range("D1").Select
    Selection.AutoFill Destination:=Range("D1:D60000"), Type:=xlFillDefault
    End Sub
    Ce qui permet de lancer le test de timing ensuite, alimentation et lecture-écriture de l'array :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub toto()
    Dim TP1 As Single
    Dim TP2 As Single
    Dim tabTabloExemple As Variant
     
    TP1 = Timer
    tabTabloExemple = Range("A1 :D60000").Value
    Worksheets(2).Range("A1 :D60000").Value = tabTabloExemple
    TP2 = Timer
    MsgBox " fait en " & TP2 - TP1 & "secondes"
    End Sub
    c'est dans mes vielles notes mal enregistrées, mais je crois que ça vient de L. Longre !

    cordialement,

    Didier

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

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