Mini macro : trier un tableau

Odesta

XLDnaute Impliqué
Bonjour à tous et à toutes

Je me permets d'ouvrir un post (c'est pas souvent) pour vous faire partager cette petite macro que je me copie de programme en programme, réalisée il y a quelques mois, et commentée exprès pour ceux qui s'y intéresseront.
Et aussi pour montrer mon 'implication' à XLD.

Cette macro réalise le tri d'un tableau, qui comporte une ou deux dimensions, par ordre croissant ou non.

VB:
Sub trier_tableau(ByRef tableau As Variant, Optional ByRef colonne As Integer = -1, Optional ByRef croissant As Boolean = True)
'cette macro sert à trier un tableau déclaré comme public
'les tableaux peuvent comporter, ou non, une deuxième dimension
'   en cas de deuxième dimension, la variable colonne correspond à la colonne que l'on souhaite trier
'   dans le cas où le tableau ne comporte qu'une dimension, ne pas indiquer de valeur dans colonne
'      (la valeur 0 ou 1 indique la première colonne d'un tableau à deux dimensions, pensez à vérifier quelle valeur renvoie LBOUND)
'la macro permet aussi de trier par ordre croissant ou décroissant (par la valeur Optionnelle Vrai ou Faux)

If Not colonne = -1 Then  'lorsque le tableau comporte une deuxième dimension
    'trier un tableau suivant une colonne choisie pour toutes les lignes dans l'ordre croissant ou décroissant
    ligne = LBound(tableau, 1)
    While ligne < UBound(tableau, 1)
        If (croissant And (tableau(ligne, colonne) > tableau(ligne + 1, colonne))) Or (Not croissant And (tableau(ligne, colonne) < tableau(ligne + 1, colonne))) Then
            For col = LBound(tableau, 2) To UBound(tableau, 2)
                temp = tableau(ligne, col)
                tableau(ligne, col) = tableau(ligne + 1, col)
                tableau(ligne + 1, col) = temp
            Next col
            ligne = LBound(tableau, 1)
        Else
        ligne = ligne + 1
        End If
    Wend
Else


    ligne = LBound(tableau, 1)
    While ligne < UBound(tableau, 1)
        If (croissant And (tableau(ligne) > tableau(ligne + 1))) Or (Not croissant And (tableau(ligne) < tableau(ligne + 1))) Then
            temp = tableau(ligne)
            tableau(ligne) = tableau(ligne + 1)
            tableau(ligne + 1) = temp
            ligne = LBound(tableau, 1)
        Else
        ligne = ligne + 1
        End If
    Wend
End If
End Sub

+ un mini fichier pour tester rapidement


Bien cordialement

Olivier

EDIT PJ repostée avec un exemple de plus
 

Pièces jointes

  • exemple_macro_tri.xls
    29 KB · Affichages: 363
Dernière édition:

david84

XLDnaute Barbatruc
Re : Mini macro : trier un tableau

Bonjour,
merci Olivier pour cette macro. Je pense que tu aurais dû mettre ton fichier dans le salon d'XLD. Peut-être pour concrétiser cette notion de dimension aurait-il été intéressant de fournir 1 ou 2 exemples pour montrer comment jouer avec cette notion afin que les néophytes en VBA (comme moi) comprennent bien.
Concernant son utilisation, peut-on également s'en servir pour le tri de plages dans des combobox ou sert-elle uniquement dans des feuilles excel ?
Cordialement
 

Odesta

XLDnaute Impliqué
Re : Mini macro : trier un tableau

Bonjour

Le post étant dans le salon, mais il a été déplacé ici.


Pour les tableau, il concerne tous les tableaux VBA, c'est à dire ceux que tu utilise dans ton code, déclarés en Public.

Il ne fonctionne pas à trier une combobox, à moins de passer par un tableau intermédiaire (en fait je ne me suis jamais posé la question, bien que je manipule relativement souvent tableau et combo box).

Ok pour un exemple (à une seule dimension en VBA) => Voir dans le post initiale.
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
156

Statistiques des forums

Discussions
312 333
Messages
2 087 374
Membres
103 528
dernier inscrit
maro