IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

VBA Excel - Fonction générique - Trier un objet ListObject (Tableau structuré)
Un billet blog de Philippe Tulliez

0PARTAGES

618290

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
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
' (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 (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.
Sub SortTableExemple()
SortTable Range("t_People").ListObject, "Sexe;-Points"
End Sub

Vous avez lu gratuitement 608 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !