par , 30/04/2022 à 14h17 (5400 Affichages)
Introduction
J'avais publié il y a quelques années le code d'une fonction générique permettant de trier un objet Range voir mon billet à ce sujet Excel VBA Trier – Procédure pour version 2003-2010 (Version 5.1) malgré son titre, elle fonctionne toujours aujourd'hui (version 365). Cependant elle ne fonctionne pas avec l'objet ListObject
Je publie donc aujourd'hui, une fonction triant un ListObject (Tableau structuré). Elle offre moins de possibilités mais une nouvelle version avec plus d'arguments comme tri des couleurs est en cours de développement.
La fonction a deux arguments l'objet ListObject à trier ainsi que la liste des colonnes à trier soit croissant soit décroissant. Cette liste est une chaîne de caractères séparées par ";" contenant soit le nom de l'étiquette de colonne soit le n° de la colonne (voir l'exemple en bas de cet article)
Code de la fonction
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
| Function SortTable(oList As ListObject, Optional LabelList As String)
' Fonction de tri pour ListObject
' Tri Ascendant/Descendant de colonne(s) d'un tableau structuré
' Author : Philippe Tulliez (www.magicoffice.be)
' Arguments
' oList (ListObject) Objet table
' [LabelList] (String) (Nom des étiquettes de colonne ou numéro des colonnes à trier séparé par ; (Exemple Voiture;Logement;3)
' Si l'étiquette est précédée par un signe négatif, le tri est descendant
' Exemple ("Service;-Logement;-Voiture")
' signifie que la colonne "Service" sera triée par ordre croissant et les deux autres par ordre décroisant
' Si LabelList est vide, le tri se fait sur la première colonne de la table
' Déclaration & Affectation
Dim Sc As Range ' Colonne à trier
Dim So As Byte ' Ordre de tri
Dim Sl As Variant ' Liste des champs à trier
Dim El As Integer ' Variable de boucle
Dim Value As Variant
' Liste des champs à trier suivant argument [LabelList] (Si vide l'Array prend l'étiquette de la première colonne)
Sl = IIf(Len(LabelList), Split(LabelList, ";"), Array(oList.ListColumns(1).Name))
'
With oList
.Sort.SortFields.Clear
For El = LBound(Sl) To UBound(Sl)
So = 1 + Abs(Left(Sl(El), 1) = "-")
Value = Mid(Sl(El), So): If IsNumeric(Value) Then Value = Val(Value)
Set Sc = .ListColumns(Value).DataBodyRange
.Sort.SortFields.Add Key:=Sc, SortOn:=xlSortOnValues, Order:=So
Next
.Sort.Apply
End With
Set Sc = Nothing
End Function |
Exemple d'une procédure qui l'invoque
La procédure ci-dessous trie les colonnes "Sexe" et "Points" du tableau structuré nommé t_People. La première est triée par ordre croissant et la seconde par ordre décroissant.
1 2 3
| Sub SortTableExemple()
SortTable Range("t_People").ListObject, "Sexe;-Points"
End Sub |