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



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
Code VBA : Sélectionner tout
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.
Code VBA : Sélectionner tout
1
2
3
Sub SortTableExemple() 
  SortTable Range("t_People").ListObject, "Sexe;-Points" 
End Sub

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