Ce didacticiel montrera comment utiliser le filtre de tableau croisé dynamique dans VBA.
Les tableaux croisés dynamiques sont un outil de données exceptionnellement puissant d'Excel. Les tableaux croisés dynamiques nous permettent d'analyser et d'interpréter de grandes quantités de données en regroupant et en résumant les champs et les lignes. Nous pouvons appliquer des filtres à nos tableaux croisés dynamiques pour nous permettre de voir rapidement les données qui nous concernent.
Tout d'abord, nous devons créer un tableau croisé dynamique pour nos données. (Cliquez ici pour notre guide de tableau croisé dynamique VBA).
Création d'un filtre basé sur une valeur de cellule
Vous pouvez filtrer dans un tableau croisé dynamique à l'aide de VBA en fonction des données contenues dans une valeur de cellule - nous pouvons soit filtrer sur le champ Page ou sur un champ Ligne (par exemple sur le champ Fournisseur ci-dessus ou le champ Oper qui se trouve dans la colonne Étiquettes de ligne ).
Dans une cellule vide à droite du tableau croisé dynamique, créez une cellule pour contenir le filtre, puis tapez les données dans la cellule sur laquelle vous souhaitez filtrer le tableau croisé dynamique.
Créez la macro VBA suivante :
1234567 | Sous FilterPageValue()Diminuer pvFld en tant que champ pivotDim strFilter As StringDéfinir pvFld = ActiveSheet.PivotTables("PivotTable1").PivotFields("Fournisseur")strFilter = ActiveWorkbook.Sheets("Sheet1").Range("M4").ValuepvFld.CurrentPage = strFilterFin du sous-marin |
Exécutez la macro pour appliquer le filtre.
Pour effacer le filtre, créez la macro suivante :
12345 | Sous ClearFilter()Dim pTbl en tant que tableau croisé dynamiqueDéfinir pTbl = ActiveSheet.PivotTables("PivotTable1")pTbl.ClearAllFiltersFin du sous-marin |
Le filtre sera alors retiré.
Nous pouvons ensuite modifier les critères de filtrage pour filtrer sur une ligne du tableau croisé dynamique plutôt que sur la page actuelle.
La saisie de la macro suivante nous permettra ensuite de filtrer sur la ligne (notez que le champ pivot sur lequel filtrer est désormais l'opérateur plutôt que le fournisseur).
1234567 | Sous-filtreRowValue()Diminuer pvFld en tant que champ pivotDim strFilter As StringDéfinir pvFld = ActiveSheet.PivotTables("PivotTable1").PivotFields("Oper")strFilter = ActiveWorkbook.Sheets("Sheet1").Range("M4").ValuepvFld.PivotFilters.Add2 xlCaptionEquals, , strFilterFin du sous-marin |
Exécutez la macro pour appliquer le filtre.
Utilisation de plusieurs critères dans un filtre croisé dynamique
Nous pouvons ajouter au filtre de valeur de ligne ci-dessus en ajoutant des critères supplémentaires.
Cependant, comme le filtre standard masque les lignes qui ne sont pas requises, nous devons parcourir les critères et afficher celles qui sont requises, tout en masquant celles qui ne sont pas requises. Cela se fait en créant une variable Array et en utilisant quelques boucles dans le code.
1234567891011121314151617181920212223 | Sous-filtreMultipleRowItems()Dim vArray en tant que varianteDim i en tant qu'entier, j en tant qu'entierDiminuer pvFld en tant que champ pivotDéfinir pvFld = ActiveSheet.PivotTables("PivotTable1").PivotFields("Oper")vTableau = Plage("M4:M5")pvFld.ClearAllFiltersAvec pvFldPour i = 1 à pvFld.PivotItems.Countj = 1Do While j <= UBound(vArray, 1) - LBound(vArray, 1) + 1Si pvFld.PivotItems(i).Name = vArray(j, 1) AlorspvFld.PivotItems(pvFld.PivotItems(i).Name).Visible = TrueQuitter FaireAutrepvFld.PivotItems(pvFld.PivotItems(i).Name).Visible = FalseFin sij = j + 1BoucleEnsuite jeTerminer parFin du sous-marin |
Création d'un filtre basé sur une variable
Nous pouvons utiliser les mêmes concepts pour créer des filtres basés sur des variables dans notre code plutôt que sur la valeur d'une cellule. Cette fois, la variable de filtre (strFilter) est renseignée dans le code lui-même (par exemple : codé en dur dans la macro).
1234567 | Sous FilterTextValue()Dim pvFld en tant que champ de pivotDim strFilter As StringDéfinir pvFld = ActiveSheet.PivotTables("PivotTable1").PivotFields("Fournisseur")strFiltre = "THOMAS S"pvFld.CurrentPage = strFilterFin du sous-marin |