Bonjour,
Quand tu mets pt(client).Visible = True, les autres PivotItem ne passes pas à False.
C'est peut être ça le problème.
Voilà comment je procède dans des cas similaires :
Une fonction qui test la présence dans ma liste (la liste est un range dans le classeur dans ce cas) :
1 2 3 4 5
| Function Est_present(rg As Range, v As String) As Boolean
Dim n&
n = Application.WorksheetFunction.CountIf(rg, v)
Est_present = n > 0
End Function |
Ensuite je parcours tous les PivotItem et met leurs propriété .Visible à Est_present(liste,valeur) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Sub Filtrer()
Application.ScreenUpdating = False
Dim PvT As PivotTable, PvF As PivotField, PvI As PivotItem, liste_filter As Range
Set PvT = ActiveSheet.PivotTables("Tableau croisé dynamique1") '<- a adapter
Set PvF = PvT.PivotFields("code") '<- a adapter
Set liste_filter = ActiveSheet.[I2:I4] '<- a adapter
With PvT
For Each PvI In PvF.PivotItems
PvI.Visible = Est_present(liste_filter, PvI.Value)
Next
End With
fin:
Set PvT = Nothing
Set PvF = Nothing
Set liste_filter = Nothing
Application.ScreenUpdating = True
End Sub |
Il te reste à adapter à ton cas.
EDIT :
Mal lu première fois
For Each pt In [..........].PivotItems
pt est un PivotItem avec des propriétés comme .Value, .Visible, ...
(Un objet et non une collection d'objets)
Donc pt(client) n'a pas de sens en VB.
Par contre pt.Vsible = (pt.Value = client) oui.
Mais le problème des Visible True qui ne passent pas à False persiste.
j'espère être clair.
Partager