Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Tri et filtrage des données | Automatisation des tableaux et des rapports
VBA Excel Pour l'Automatisation des Entreprises

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.

Figure 4.2

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

  1. Écrire une macro qui filtre tblReports uniquement pour février, en utilisant AutoFilter Field:=1.
  2. L'étendre pour filtrer la Région (Field:=2) uniquement sur "East" et "West" en même temps, en utilisant xlFilterValues.
  3. 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.
Indice
expand arrow

1. Filtrer sur février

  • Field:=1 fait référence à la première colonne du tableau, et non de la feuille de calcul — Month est la colonne 1 dans tblReports, quel que soit l'emplacement physique dans la feuille.
  • Criteria1 prend le texte exact sur lequel vous filtrez, entre guillemets.
  • Vous appliquez AutoFilter sur tbl.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, plus Operator:=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 AutoFilter deux fois, une fois par colonne.

3. Effacer les filtres et trier

  • Vérifiez tbl.AutoFilter.FilterMode avant d'appeler ShowAllData — l'appeler alors qu'aucun filtre n'est actif génère une erreur.
  • L'objet Sort nécessite d'abord .SortFields.Clear, puis un .SortFields.Add2 par 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.
Solution
expand arrow
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.

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 2

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

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.

Figure 4.2

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

  1. Écrire une macro qui filtre tblReports uniquement pour février, en utilisant AutoFilter Field:=1.
  2. L'étendre pour filtrer la Région (Field:=2) uniquement sur "East" et "West" en même temps, en utilisant xlFilterValues.
  3. 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.
Indice
expand arrow

1. Filtrer sur février

  • Field:=1 fait référence à la première colonne du tableau, et non de la feuille de calcul — Month est la colonne 1 dans tblReports, quel que soit l'emplacement physique dans la feuille.
  • Criteria1 prend le texte exact sur lequel vous filtrez, entre guillemets.
  • Vous appliquez AutoFilter sur tbl.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, plus Operator:=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 AutoFilter deux fois, une fois par colonne.

3. Effacer les filtres et trier

  • Vérifiez tbl.AutoFilter.FilterMode avant d'appeler ShowAllData — l'appeler alors qu'aucun filtre n'est actif génère une erreur.
  • L'objet Sort nécessite d'abord .SortFields.Clear, puis un .SortFields.Add2 par 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.
Solution
expand arrow
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.

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 2
some-alt