par , 30/04/2022 � 13h17 (6600 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 |