Tri et filtrage des données
Glissez pour afficher le menu
Le filtrage restreint ce qui est visible sans modifier les données sous-jacentes — essentiel pour créer un rapport qui n'affiche qu'un seul mois ou une seule région à la fois.
Filtre automatique de base
tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)
AutoFilter ne supprime ni ne déplace aucune donnée — il masque les lignes qui ne correspondent pas, exactement comme si vous aviez cliqué sur la flèche déroulante et décoché tout sauf January manuellement. Field:=1 compte les colonnes à partir de 1 dans le tableau lui-même (Month, Region, Sales, Expenses, Profit, Target — donc Region serait Field:=2, Profit Field:=5), c'est pourquoi cette ligne doit être maintenue à jour si les colonnes sont réorganisées.
Filtres multi-conditions
Filtrer sur plusieurs valeurs dans la même colonne nécessite xlFilterValues et un tableau de critères :
tbl.Range.AutoFilter Field:=2, _
Criteria1:=Array("North", "Central"), _
Operator:=xlFilterValues
À comparer avec le filtre à valeur unique ci-dessus : Criteria1 contient maintenant un Array(...) de valeurs acceptables au lieu d'une simple chaîne, et Operator:=xlFilterValues indique à AutoFilter de traiter ce tableau comme une liste de correspondances plutôt que d'essayer de l'interpréter comme une seule expression de critère. Si vous omettez Operator:=xlFilterValues, cette ligne génère une erreur ou se comporte de façon inattendue — il est facile d'oublier ce paramètre, il vaut donc la peine de vérifier chaque fois que Criteria1 est une liste.
Filtrer sur une condition numérique — par exemple, uniquement les lignes où Profit dépasse Target de manière significative — utilise à la place des opérateurs de comparaison :
tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"
Notez que ">15000" est écrit comme du texte entre guillemets même s'il s'agit d'une comparaison numérique — AutoFilter attend toujours Criteria1 sous forme de chaîne, et il analyse lui-même le signe > au début. Écrire Criteria1:=15000 sans le > filtrerait les lignes exactement égales à 15000 au lieu de celles supérieures à cette valeur, ce qui est une erreur courante.
Tri
L'objet Sort prend en charge plusieurs clés, exactement comme la boîte de dialogue Données → Trier :
With tbl.Sort
.SortFields.Clear
.SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
SortOn:=xlSortOnValues, Order:=xlAscending
.SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
SortOn:=xlSortOnValues, Order:=xlDescending
.Header = xlYes
.Apply
End With
.SortFields.Clear s'exécute en premier afin que les clés de tri restantes d'une exécution précédente de macro (ou d'un tri manuel de l'utilisateur) ne se combinent pas silencieusement avec les nouvelles — il faut toujours effacer avant d'ajouter. L'ordre dans lequel les deux appels .Add2 apparaissent est aussi important que leurs paramètres Order:=xlAscending/xlDescending : le premier ajouté devient la clé de tri principale (Month), et le second sert de départage dans chaque groupe (Profit, du plus élevé au plus faible dans chaque mois). .Header = xlYes indique à Excel que la première ligne est un en-tête et ne doit jamais être déplacée par le tri ; .Apply déclenche réellement le tri — tout ce qui précède ne fait que préparer les instructions.
Effacer les filtres
Toujours effacer les filtres au début d'une macro de rapport, afin que chaque exécution commence à partir d'un état connu et non filtré :
If tbl.AutoFilter.FilterMode Then
tbl.AutoFilter.ShowAllData
End If
FilterMode est un booléen qui vaut True dès qu'un filtre restreint les lignes visibles du tableau — le vérifier d'abord évite une erreur d'exécution, car appeler ShowAllData alors qu'aucun filtre n'est actif génère une erreur au lieu de ne rien faire discrètement.
Tâche
- Écrire une macro qui filtre tblReports uniquement pour février, en utilisant
AutoFilter Field:=1. - L'étendre pour filtrer la Région (Field:=2) uniquement sur "East" et "West" en même temps, en utilisant
xlFilterValues. - Effacer les deux filtres, puis trier le tableau par Région (ordre croissant), puis par Profit (ordre décroissant), en utilisant l'objet Sort présenté ci-dessus.
1. Filtrer sur février
Field:=1fait référence à la première colonne du tableau, et non de la feuille de calcul — Month est la colonne 1 danstblReports, quel que soit l'emplacement physique dans la feuille.Criteria1prend le texte exact sur lequel vous filtrez, entre guillemets.- Vous appliquez
AutoFiltersurtbl.Range, et non directement sur la feuille de calcul.
2. Ajouter le filtre Région
- Region est la deuxième colonne du tableau, donc c'est un autre numéro pour
Field:=que pour le filtre Month. - Filtrer sur deux valeurs dans la même colonne nécessite
Criteria1:=Array(...)avec les deux valeurs à l'intérieur, plusOperator:=xlFilterValues— oublier cet opérateur est l'erreur la plus fréquente ici. - Les deux filtres (Month et Region) peuvent être actifs en même temps — il suffit d'appeler
AutoFilterdeux fois, une fois par colonne.
3. Effacer les filtres et trier
- Vérifiez
tbl.AutoFilter.FilterModeavant d'appelerShowAllData— l'appeler alors qu'aucun filtre n'est actif génère une erreur. - L'objet
Sortnécessite d'abord.SortFields.Clear, puis un.SortFields.Add2par niveau de tri — l'ordre dans lequel vous les ajoutez détermine la clé primaire et le critère de départage, et non l'ordre d'apparition dans le tableau. - Région en ordre croissant doit être ajouté avant Profit en ordre décroissant, puisque Région doit être le tri principal.
Option Explicit
Sub FilterToFebruary()
Dim tbl As ListObject
Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")
tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub
Sub FilterFebruaryEastWest()
Dim tbl As ListObject
Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")
tbl.Range.AutoFilter Field:=1, Criteria1:="February"
tbl.Range.AutoFilter Field:=2, _
Criteria1:=Array("East", "West"), _
Operator:=xlFilterValues
End Sub
Sub ClearFiltersAndSort()
Dim tbl As ListObject
Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")
' Clear any active filters
If tbl.AutoFilter.FilterMode Then
tbl.AutoFilter.ShowAllData
End If
' Sort by Region ascending, then Profit descending
With tbl.Sort
.SortFields.Clear
.SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
SortOn:=xlSortOnValues, Order:=xlAscending
.SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
SortOn:=xlSortOnValues, Order:=xlDescending
.Header = xlYes
.Apply
End With
End Sub
Exécutez FilterFebruaryEastWest et seules les lignes de février pour les régions East et West seront visibles. Ensuite, exécutez ClearFiltersAndSort — toutes les lignes réapparaissent, triées d'abord par Région (ordre alphabétique), puis, au sein de chaque Région, le Profit le plus élevé apparaît en premier.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Tri et filtrage des données
Le filtrage restreint ce qui est visible sans modifier les données sous-jacentes — essentiel pour créer un rapport qui n'affiche qu'un seul mois ou une seule région à la fois.
Filtre automatique de base
tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)
AutoFilter ne supprime ni ne déplace aucune donnée — il masque les lignes qui ne correspondent pas, exactement comme si vous aviez cliqué sur la flèche déroulante et décoché tout sauf January manuellement. Field:=1 compte les colonnes à partir de 1 dans le tableau lui-même (Month, Region, Sales, Expenses, Profit, Target — donc Region serait Field:=2, Profit Field:=5), c'est pourquoi cette ligne doit être maintenue à jour si les colonnes sont réorganisées.
Filtres multi-conditions
Filtrer sur plusieurs valeurs dans la même colonne nécessite xlFilterValues et un tableau de critères :
tbl.Range.AutoFilter Field:=2, _
Criteria1:=Array("North", "Central"), _
Operator:=xlFilterValues
À comparer avec le filtre à valeur unique ci-dessus : Criteria1 contient maintenant un Array(...) de valeurs acceptables au lieu d'une simple chaîne, et Operator:=xlFilterValues indique à AutoFilter de traiter ce tableau comme une liste de correspondances plutôt que d'essayer de l'interpréter comme une seule expression de critère. Si vous omettez Operator:=xlFilterValues, cette ligne génère une erreur ou se comporte de façon inattendue — il est facile d'oublier ce paramètre, il vaut donc la peine de vérifier chaque fois que Criteria1 est une liste.
Filtrer sur une condition numérique — par exemple, uniquement les lignes où Profit dépasse Target de manière significative — utilise à la place des opérateurs de comparaison :
tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"
Notez que ">15000" est écrit comme du texte entre guillemets même s'il s'agit d'une comparaison numérique — AutoFilter attend toujours Criteria1 sous forme de chaîne, et il analyse lui-même le signe > au début. Écrire Criteria1:=15000 sans le > filtrerait les lignes exactement égales à 15000 au lieu de celles supérieures à cette valeur, ce qui est une erreur courante.
Tri
L'objet Sort prend en charge plusieurs clés, exactement comme la boîte de dialogue Données → Trier :
With tbl.Sort
.SortFields.Clear
.SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
SortOn:=xlSortOnValues, Order:=xlAscending
.SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
SortOn:=xlSortOnValues, Order:=xlDescending
.Header = xlYes
.Apply
End With
.SortFields.Clear s'exécute en premier afin que les clés de tri restantes d'une exécution précédente de macro (ou d'un tri manuel de l'utilisateur) ne se combinent pas silencieusement avec les nouvelles — il faut toujours effacer avant d'ajouter. L'ordre dans lequel les deux appels .Add2 apparaissent est aussi important que leurs paramètres Order:=xlAscending/xlDescending : le premier ajouté devient la clé de tri principale (Month), et le second sert de départage dans chaque groupe (Profit, du plus élevé au plus faible dans chaque mois). .Header = xlYes indique à Excel que la première ligne est un en-tête et ne doit jamais être déplacée par le tri ; .Apply déclenche réellement le tri — tout ce qui précède ne fait que préparer les instructions.
Effacer les filtres
Toujours effacer les filtres au début d'une macro de rapport, afin que chaque exécution commence à partir d'un état connu et non filtré :
If tbl.AutoFilter.FilterMode Then
tbl.AutoFilter.ShowAllData
End If
FilterMode est un booléen qui vaut True dès qu'un filtre restreint les lignes visibles du tableau — le vérifier d'abord évite une erreur d'exécution, car appeler ShowAllData alors qu'aucun filtre n'est actif génère une erreur au lieu de ne rien faire discrètement.
Tâche
- Écrire une macro qui filtre tblReports uniquement pour février, en utilisant
AutoFilter Field:=1. - L'étendre pour filtrer la Région (Field:=2) uniquement sur "East" et "West" en même temps, en utilisant
xlFilterValues. - Effacer les deux filtres, puis trier le tableau par Région (ordre croissant), puis par Profit (ordre décroissant), en utilisant l'objet Sort présenté ci-dessus.
1. Filtrer sur février
Field:=1fait référence à la première colonne du tableau, et non de la feuille de calcul — Month est la colonne 1 danstblReports, quel que soit l'emplacement physique dans la feuille.Criteria1prend le texte exact sur lequel vous filtrez, entre guillemets.- Vous appliquez
AutoFiltersurtbl.Range, et non directement sur la feuille de calcul.
2. Ajouter le filtre Région
- Region est la deuxième colonne du tableau, donc c'est un autre numéro pour
Field:=que pour le filtre Month. - Filtrer sur deux valeurs dans la même colonne nécessite
Criteria1:=Array(...)avec les deux valeurs à l'intérieur, plusOperator:=xlFilterValues— oublier cet opérateur est l'erreur la plus fréquente ici. - Les deux filtres (Month et Region) peuvent être actifs en même temps — il suffit d'appeler
AutoFilterdeux fois, une fois par colonne.
3. Effacer les filtres et trier
- Vérifiez
tbl.AutoFilter.FilterModeavant d'appelerShowAllData— l'appeler alors qu'aucun filtre n'est actif génère une erreur. - L'objet
Sortnécessite d'abord.SortFields.Clear, puis un.SortFields.Add2par niveau de tri — l'ordre dans lequel vous les ajoutez détermine la clé primaire et le critère de départage, et non l'ordre d'apparition dans le tableau. - Région en ordre croissant doit être ajouté avant Profit en ordre décroissant, puisque Région doit être le tri principal.
Option Explicit
Sub FilterToFebruary()
Dim tbl As ListObject
Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")
tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub
Sub FilterFebruaryEastWest()
Dim tbl As ListObject
Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")
tbl.Range.AutoFilter Field:=1, Criteria1:="February"
tbl.Range.AutoFilter Field:=2, _
Criteria1:=Array("East", "West"), _
Operator:=xlFilterValues
End Sub
Sub ClearFiltersAndSort()
Dim tbl As ListObject
Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")
' Clear any active filters
If tbl.AutoFilter.FilterMode Then
tbl.AutoFilter.ShowAllData
End If
' Sort by Region ascending, then Profit descending
With tbl.Sort
.SortFields.Clear
.SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
SortOn:=xlSortOnValues, Order:=xlAscending
.SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
SortOn:=xlSortOnValues, Order:=xlDescending
.Header = xlYes
.Apply
End With
End Sub
Exécutez FilterFebruaryEastWest et seules les lignes de février pour les régions East et West seront visibles. Ensuite, exécutez ClearFiltersAndSort — toutes les lignes réapparaissent, triées d'abord par Région (ordre alphabétique), puis, au sein de chaque Région, le Profit le plus élevé apparaît en premier.
Merci pour vos commentaires !