Selectionner certains Pivotitems

a51432 Messages postés 39 Statut Membre -  
a51432 Messages postés 39 Statut Membre -
Bonjour,

J'ai un fichier contenant un TCD. J'aimerai pouvoir cocher certains "PivotItems" d'un "PivotFields" via VBA.

Pour cela j'ai essayé le code suivant qui ne fonctionne pas :

Sub TCD()

Application.ScreenUpdating = False

Dim TC()
Dim z
Dim monPivIt As Object

TC = Array("TOTO", "TITI", "TATA", "TETE")
    
With Workbooks("Classeur").Sheets("Feuille").PivotTables("TCD").PivotFields("MOT")
    .ClearAllFilters
    For Each monPivIt In .PivotItems
        For z = LBound(TC) To UBound(TC)
            If monPivIt.Name <> z Then
                monPivIt.Visible = False
            Else
                monPivIt.Visible = True
                Exit For
            End If
        Next z
    Next monPivIt
End With

Application.ScreenUpdating = True

End Sub


J'ai bien une solution qui pourrait fonctionner avec des "OR" à répétition mais la liste de "PivotItems" à cocher est en réalité bien plus longue que dans l'"Array" du code ci-dessus. Si quelqu'un a une meilleure solution, je suis preneur !

Merci par avance de votre aide !

Cordialement,

2 réponses

  1. a51432 Messages postés 39 Statut Membre 1
     
    Merci pour ta réponse.

    J'ai effectivement testé avec les msgbox et cela me renvoit bien les noms correctement. Il fallait également utiliser TC(z) plutot que z pour renvoyer le mot et non la position dans l'Array.

    Le code me déselectionne bien les PivotItems à décocher et fonctionne pour le premier mot de l'Array mais il plante dès le 2ème mot à seléctionner sur la ligne désignée dans le code ci-dessous (Erreur 1004 : impossible de définir la propriété Visible de la classe PivotItems)

    Code :

    Sub TCD()

    Application.ScreenUpdating = False

    Dim TC()
    Dim z
    Dim monPivIt As Object

    TC = Array("TOTO", "TITI", "TATA", "TETE")

    With Workbooks("Classeur").Sheets("Feuille").PivotTables("TCD").PivotFields("MOT")
    .ClearAllFilters
    For Each monPivIt In .PivotItems
    For z = LBound(TC) To UBound(TC)
    If monPivIt <> TC(z) Then
    monPivIt.Visible = False
    Else
    If monPivIt.Visible = False Then
    monPivIt.Visible = True 'Ligne qui bug
    Exit For
    Else
    Exit For
    End If
    End If
    Next z
    Next monPivIt
    End With

    Application.ScreenUpdating = True

    End Sub
    1
  2. PlacageGranby Messages postés 402 Statut Membre 26
     
    Bonjour,

    Si le IF ne retourne pas les résultat prévu. faire un test sur les éléments qui sont évalué.

    For Each monPivIt In .PivotItems
            For z = LBound(TC) To UBound(TC)
                  Msgbox monPivIt.Name
                  Msgbox z
                  If monPivIt.Name <> z Then


    Comme ca au moins tu as des pistes pour trouver le problème.

    P.S. peut-être essayer un msgbox TC(z) pour voir si c'est plus adapté à ton besoin.
    0