Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Inactif
    Avatar de ouskel'n'or
    Inscrit en
    février 2005
    Messages
    12 466
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 12 466
    Points : 13 438
    Points
    13 438

    Par défaut

    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 ?" ou "XIV-D. Trier les données d'un tableau"
    Ce n'est donc pas celle-ci que je souhaiterais utiliser.
    Merci de votre réponse

  2. #2
    Expert Confirmé Avatar de pc75
    Profil pro
    Inscrit en
    septembre 2004
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : septembre 2004
    Messages : 3 446
    Points : 3 388
    Points
    3 388

    Par défaut

    Bonjour,

    Je ne sais pas si c'est ce que tu recherches, mais j'ai trouvé ça dans MSDN :

    Microsoft® JScript™
    sort, méthode Référence du langage
    Version 2


    Voir aussi Application


    --------------------------------------------------------------------------------

    Description
    Trie les éléments d'un objet Array.

    Syntaxe
    arrayobj.sort(sortfunction)
    L'argument sortfunction correspond au nom de la fonction employée pour déterminer l'ordre des éléments. S'il est omis, les éléments sont triés par ordre croissant de caractère ASCII.

    Notes
    La méthode sort trie l'objet Array existant. Aucun nouvel objet Array n'est créé pendant l'exécution.
    Si vous indiquez une fonction dans l'argument sortfunction, elle doit retourner l'une des valeurs suivantes :

    Une valeur négative si le premier argument transmis est inférieur au deuxième argument.
    Zéro si les deux arguments sont équivalents.
    Une valeur positive si le premier argument est supérieur au second.
    L'exemple ci-dessous illustre l'utilisation de la méthode sort :

    function SortDemo()
    {
    var a, l;
    a = new Array("X" ,"y" ,"d", "Z", "v","m","r");
    l = a.sort();
    return(l);
    }
    Par principe, je ne réponds pas aux messages URGENT.
    Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
    Pas de questions techniques en MP.

  3. #3
    Inactif
    Avatar de ouskel'n'or
    Inscrit en
    février 2005
    Messages
    12 466
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 12 466
    Points : 13 438
    Points
    13 438

    Par défaut

    Merci pc75,
    C'était bien la méthode de mes souvenirs. Hélas, si elle fonctionne en VB.Script, ce n'est pas le cas en VBA-Excel où Sort réclame un objet range.

    Mais j'ai résolu mon problème grâce à Méphistopheles qui propose un tri très rapide qui me convient très bien.
    Bonne journée

    Je laisse la discussion et mets résolu, ta réponse pourait intéresser les vébéscripteurs

  4. #4
    Membre Expert

    Inscrit en
    avril 2006
    Messages
    1 390
    Détails du profil
    Informations forums :
    Inscription : avril 2006
    Messages : 1 390
    Points : 1 961
    Points
    1 961

    Par défaut

    salut ouskel'nor,

    <ShellSort> est plus rapide que <QuickSort récursif> en VBA :
    Code :
    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
     
    Public Sub ShellSortInteger(ByRef aTab() As Integer)
       Dim i As Long, j As Long, lInc As Long, n As Long, lMin As Long
       Dim lLowerBound As Long, lUpperBound As Long
       Dim vRef As Variant
     
       lLowerBound = LBound(aTab)
       lUpperBound = UBound(aTab)
       n = lUpperBound - lLowerBound + 1
       lInc = 1
     
       While lInc < n
          lInc = lInc * 3 + 1
       Wend
       While lInc > 1
          lInc = lInc / 3
          lMin = lInc + lLowerBound
          For i = lMin To lUpperBound
             j = i
             vRef = aTab(i)
             Do While vRef < aTab(j - lInc)
                aTab(j) = aTab(j - lInc)
                j = j - lInc
                If j < lMin Then Exit Do
             Loop
             aTab(j) = vRef
          Next i
       Wend
    End Sub
    Philippe

  5. #5
    Inactif
    Avatar de ouskel'n'or
    Inscrit en
    février 2005
    Messages
    12 466
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 12 466
    Points : 13 438
    Points
    13 438

    Par défaut

    ShellSortInteger Winner !
    Testé. 0,02 s pour ShellSortInteger contre 0,8 s pour QuiskSort.
    Pour faire plus rapide je devrai changer de micro
    Merci philben, j'adopte !

  6. #6
    Membre du Club
    Inscrit en
    avril 2008
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : avril 2008
    Messages : 150
    Points : 64
    Points
    64

    Par défaut

    C'est vrai que ShellSort est tres bien.
    Le souci est que parfois, le tri n'est pas exact.
    Cela est particulièrement le cas si ton Array à trier contient tres peu de données.

    Perso, j'utilise toujours ShellSort pour les array important sinon un Tri à Bulle est amplement suffisant.

  7. #7
    Membre du Club
    Inscrit en
    mars 2009
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 54
    Points : 40
    Points
    40

    Par défaut

    Citation Envoyé par philben Voir le message
    salut ouskel'nor,

    <ShellSort> est plus rapide que <QuickSort récursif> en VBA :
    Merci !

    Il faut juste préciser :

    Sinon la valeur du plus petit indice du tableau valait 0 chez moi (avec Excel 2007). Ca joue sur la valeur de LBound...

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •