XL 2013 Boucle avec PivotItems qui … ne boucle pas !

Sebast

XLDnaute Impliqué
Bonsoir à toutes et à tous,

j'ai besoin d'un regard extérieur sur une boucle qui … ne boucle pas !
Qui peut me dire comment corriger mon code pour que toutes les feuilles du fichier joint soient concernées ?

Dans la pièce jointe, j'ai placé (commenté, i.e. désactivé) le code qui effectue des opérations sur le TCD d'UNE feuille bien déterminée.

Le code placé juste à la suite (donc non commenté) se propose de faire la même chose mais sur TOUTES les feuilles du classeur.
Or, il ne boucle pas, c’est-à-dire je n'arrive pas à passer d'une feuille à l'autre et à appliquer les opérations que je sais faire sur une feuille donnée.

Je m'escrime avec le code, peut-être que je ne vois pas l'arbre qui cache la forêt (?!)

D'avance, merci pour votre aide
 

Pièces jointes

  • PT_filtre_selection_plusieurs_feuilles_11042016.xlsm
    274.3 KB · Affichages: 29
  • PT_filtre_selection_plusieurs_feuilles_11042016.xlsm
    274.3 KB · Affichages: 32

sousou

XLDnaute Barbatruc
Re : Boucle avec PivotItems qui … ne boucle pas !

Bonsoir
Des chose étranges suivre les flèches <-
' --- Etape 2 : si Answer existe, on affiche les items correspondant et on ferme les autres
If compteur > 0 Then
On Error Resume Next

For sh = 1 To Sheets.Count ' depuis 1ère jusqu'à dernière feuille
Sheets(sh).Activate
If ActiveSheet.PivotTables.Count > 0 Then ' uniquement si feuille contient TCD
With ActiveSheets.PivotTables("Tableau croisé dynamique1").PivotFields("emballage") <- activesheet sans s
For Each Pvitem In .PivotItem <- d'abord pivotitem avec un s collection mais plutôt cette boucle ne devrait pas exister
.ClearManualFilter
For k = 1 To .PivotItems.Count
Test = False
var = .PivotItems(k)
If InStr(var, Answer) > 0 Then .PivotItems(k).Visible = True: Test = True
If Test = False Then .PivotItems(k).Visible = False
Next k
Next Pvitem <- sans doûte à supprimer
On Error GoTo 0
End With
End If ' ActiveSheet.PivotTables.Count > 0
Next sh

Else 'compteur > 0
MsgBox "Le terme " & Answer & " est absent de la bdd, le traitement est interrompu et tous les items vont être affichés"
ActiveSheets.PivotTables("Tableau croisé dynamique1").PivotFields("emballage").ClearAllFilters

End If ' compteur > 0

End Sub
 

eriiic

XLDnaute Barbatruc
Re : Boucle avec PivotItems qui … ne boucle pas !

Bonjour,

Avant de chercher peut-être pour rien, tu sais que tu peux faire ça avec un segment ?
eric

PS: et tu devrais oter ton On Error Resume Next si tu veux voir les erreurs. Il ne faut le mettre que juste avant une instruction dont tu sais qu'une erreur est 'normale' et remettre la gestion d'erreur tout de suite après.
 

Pièces jointes

  • PT_filtre_selection_plusieurs_feuilles_11042016.xlsm
    300 KB · Affichages: 24
  • PT_filtre_selection_plusieurs_feuilles_11042016.xlsm
    300 KB · Affichages: 26
Dernière édition:

Sebast

XLDnaute Impliqué
Re : Boucle avec PivotItems qui … ne boucle pas !

Bonsoir à tous et merci pour vos conseils

Sousou
J’ai suivi tes remarques et ça marche nickel . Je me disais bien que Pvitem In .PivotItem devait être superflu mais je me m'étais embrouillé l’esprit ...

Eriiiic
Concernant on error resume next : tu as raison, c’est un reliquat d’une mise au point, qui n’a pas sa place ici car les cas limite ont été traités dans le code

Segments : j’avoue que je découvre …
Mon souci (non explicité il est vrai dans mon message initial) est que le fichier que j’ai joint est super simplifié, dans la réalité, il y a des dizaines et des dizaines de TCD, il me fallait donc un moyen d’appliquer la restriction aux feuilles concernées.
Avec les segments, il faut tout faire à la mano ?

Chris
Même remarque que pour eriiiic

Encore merci pour vos éclairages respectifs et bonne soirée
 

eriiic

XLDnaute Barbatruc
Re : Boucle avec PivotItems qui … ne boucle pas !

Fait un clic-droit sur le segment et regarde 'Connexion de tableau croisé dynamique...'
Tu as juste à cocher ceux que tu veux relier. Donc oui: tout à la main, prévoit qq'un pour t'éponger le front ;-)
Tu peux en ajouter sur les feuilles les plus intéressantes, les liens seront gardés.

Edit: je vois que tu as 2013, je ne sais plus si c'est sur celui-ci ou sur 2016 que c'est apparu mais maintenant ils existent aussi pour les plages de données en tableau
 
Dernière édition:

Sebast

XLDnaute Impliqué
Re : Boucle avec PivotItems qui … ne boucle pas !

Salut à tous,


Eriiic : je vais me pencher sur les segments dès que j’aurai réglé la question du moment (qui est d’automatiser le filtrage). Ca paraît très convivial sur l’exemple que tu as envoyé.


Sousou et Eriiic :

Après avoir constaté que vos recommandations fonctionnaient (Pvitems, on error resume next à supprimer) etc., j’ai voulu adapter mon code remanié à un fichier légèrement différent, et là … plantage !

J’ai tout passé en revue mais ne comprends pas comment ce qui marche pour un fichier plante avec un autre.

Comme tu avais eu la vista hier, peut-être sauras-tu me dire ce qui cloche ici (voir pièce jointe, code ci-dessous)
La portion suivante se met en jaune au debuggage : .PivotItems(k).Visible = True
Incompréhensible car tout est bordé avec Test

Merci d’avance



Code:
Sub Fitration()
    Choix (InputBox("La valeur suivante vous est proposée, validez ou saisissez-en une autre", "PivotTable Filter", "IFCO"))
End Sub
Code:
' Objet : restreindre affichage à un item, à la demande (pour TOUTES les feuilles)

Sub Choix(Answer As String)

Dim k As Long ' recense les pivotItems
Dim line As Long ' recense le nombre de lignes dans feuille Base
Dim var As String ' prend la valeur du PivotItem rencontré
Dim compteur As Long ' pour compter les occurences d'une valeur d'un PivotItem
Dim Test As Boolean
Dim sh As Long ' feuille sur laquelle on se trouve

Answer = UCase(Answer)

' --- Etape 1 : on voit si le terme Answer existe
Dim dernlign As Long
dernlign = Sheets("Base").Range("i" & Rows.Count).End(xlUp).Row

With Sheets("Base")
        For line = 1 To dernlign
               var = .Range("i" & line)
               If InStr(var, Answer) > 0 Then compteur = compteur + 1
        Next line
End With

' MsgBox "il y a " & compteur & " entrées pour " & Answer


' --- Etape 2 : si Answer existe, on affiche les items correspondant et on ferme les autres
 If compteur > 0 Then

     For sh = 1 To Sheets.Count ' depuis 1ère jusqu'à dernière feuille
        Sheets(sh).Activate
        If ActiveSheet.PivotTables.Count > 0 Then ' uniquement si feuille contient TCD
            With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("emballage")
                    .ClearManualFilter
                    For k = 1 To .PivotItems.Count
                       Test = False
                       var = .PivotItems(k)
                       If InStr(var, Answer) > 0 Then .PivotItems(k).Visible = True: Test = True
                       If Test = False Then .PivotItems(k).Visible = False
                    Next k
            End With
       End If ' ActiveSheet.PivotTables.Count > 0
     Next sh

 Else 'compteur > 0
    MsgBox "Le terme " & Answer & " est absent de la bdd, le traitement va s'interrompre"
  
 End If ' compteur > 0
 
 End Sub
 

Pièces jointes

  • Code_remanié_12042016.xlsm
    146.8 KB · Affichages: 14

Sebast

XLDnaute Impliqué
Re : Boucle avec PivotItems qui … ne boucle pas !

Bonsoir à tous,

Je ne m’explique pas pourquoi le bug sur le code posté précédemment et reste intéressé par vos éventuels éclairages.

Entre-temps, j’ai trouvé une manière beaucoup plus simple de procéder.
En gros, je commence par lever tous les filtres puis pour chaque PivotItem, s’il ne correspond pas à l’élément cherché, alors je le mets en .visible=false.

Cependant, si qqn peut me dire ce qui déraillait avec le code précédent ...


Bonne soirée


Code:
Sub Choix(Answer As String)

Dim k As Long ' recense les pivotItems
Dim line As Long ' recense le nombre de lignes dans feuille Base
Dim var As String ' prend la valeur du PivotItem rencontré
Dim compteur As Long ' pour compter les occurences d'une valeur d'un PivotItem
Dim sh As Long ' feuille sur laquelle on se trouve
Dim dernlign As Long

Answer = UCase(Answer)

' --- Etape 1 : on voit si le terme Answer existe
dernlign = Sheets("Base").Range("i" & Rows.Count).End(xlUp).Row
With Sheets("Base")
        For line = 1 To dernlign
               var = .Range("i" & line)
               If InStr(var, Answer) > 0 Then compteur = compteur + 1
        Next line
End With
' MsgBox "il y a " & compteur & " entrées pour " & Answer

' --- Etape 2 : on ouvre tous les items puis on ferme sélectivement
 If compteur > 0 Then
     For sh = 1 To Sheets.Count ' depuis 1ère jusqu'à dernière feuille
        Sheets(sh).Activate
        If ActiveSheet.PivotTables.Count > 0 Then ' uniquement si feuille contient TCD
            With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Emballage")
                    .ClearManualFilter ' on libère tous les filtres
                    For k = 1 To .PivotItems.Count ' pour chaque item
                       var = .PivotItems(k)
                       If InStr(var, Answer) = 0 Then .PivotItems(k).Visible = False 'i.e. on ferme si ne matche pas
                    Next k
            End With
       End If ' ActiveSheet.PivotTables.Count > 0
     Next sh
 Else 'compteur > 0
    MsgBox "Le terme " & Answer & " est absent de la bdd, le traitement va s'interrompre"
 End If ' compteur > 0
 End Sub
 

Discussions similaires

Réponses
21
Affichages
286

Statistiques des forums

Discussions
312 203
Messages
2 086 191
Membres
103 152
dernier inscrit
Karibu