Synchro filtres de plusieurs tcd en même temps avec VBA
Bonjour à toutes et tous,
Je réalise actuellement sur Excel 2007 une grosse étude où je synchronise plusieurs TCD (leurs filtres en fait) en utilisant une macro VBA dont j'ai trouvé le code sur le web.
J'ai une quarantaine de TCD qui dépendent tous de la même source de données.
Chacun de ces TCD a trois filtres identiques sur tous les TCD, à savoir le filtre "UM (libellé court)", le filtre "Code heure (libellé)" et le filtre "Période".
Le code VBA marche tout à fait avec le filtre "UM (libellé court)" et avec le filtre "Code heure (libellé)" mais, avec le filtre "Période", il bug.
Lorsque je l'exécute, Excel affiche le message "erreur d'exécution 13 : incompatibilité de type".
Ci-dessous, le code pour le filtre "UM (libellé court)" que j'adapte pour le filtre "Code heure (libellé)" et pour le filtre "Période" en changeant PivotFields :
Sub OneForAll_UM()
Dim PT_MAIN As PivotTable
Dim PT As PivotTable
Dim PFN(), PF As Integer, P, I
ActiveWorkbook.RefreshAll
'table de référence
Set PT_MAIN = ActiveSheet.PivotTables("TCD1")
I = 1
'récuperer les noms de filtres inactifs
For PF = 1 To PT_MAIN.PivotFields("UM (libellé court)").PivotItems.Count
If Not PT_MAIN.PivotFields("UM (libellé court)").PivotItems(PF).Visible Then
'redimensionner PFN en fonction du nombre de filtres inactif sur le champ UM (libellé court)
ReDim Preserve PFN(1 To I) 'preserve pour ne pas perdre les données précédemment inscrites
'l'ajouter
PFN(I) = PT_MAIN.PivotFields("UM (libellé court)").PivotItems(PF).Name
I = I + 1 'on incrémente en prévision du prochain filtres inactif à ajouter
End If
Next PF
'nb de filtre inactifs
On Error GoTo ShowAll
I = UBound(PFN)
On Error GoTo 0
'les appliquer sur les autres tables pivot
For Each PT In ActiveSheet.PivotTables
'sauf si c'est la table pivot de référence
If Not PT.Name = PT_MAIN.Name Then
With PT
'activation de la sélection multiple
PT.PivotFields("UM (libellé court)").EnableMultiplePageItems = True
'on affiche tout les filtres disponibles
For Each P In PT.PivotFields("UM (libellé court)").PivotItems
P.Visible = True
Next P
'on désactive les filtres devant être inactif
If Not I = 0 Then
For PF = 1 To I
PT.PivotFields("UM (libellé court)").PivotItems(PFN(PF)).Visible = False
Next PF
End If
End With
End If
Next PT
Exit Sub
ShowAll:
I = 0
Resume Next
End Sub
Si je modifie le début du code VBA pour le filtre "Période ainsi :
Dim PT_MAIN As PivotTable
Dim PT As PivotTable
Dim PFN() As Integer, P, I
Dim PF As Date
alors Excel affiche le message "erreur d'exécution 1004 : impossible de lire la propriété PivotItems de la classe PivotField".
Si quelqun peut me dire quelle propriété utiliser pour PF et me donner le code, ce serait sympa.
Merci d'avance.
Erwan
Bonjour,
Sans fichier joint, il est difficile d'apporter une réponse précise.
Mais essaie ce code et adapte le.
A te relire, peut-être
Cdlt.
Option Explicit
'Option Private Module
Public Sub test()
Dim PT_main As PivotTable, PT As PivotTable
Dim strPF As String
Dim pi As PivotItem
Dim I As Integer
Dim x()
Application.ScreenUpdating = False
Set PT_main = ActiveSheet.PivotTables("TCD1")
PT_main.RefreshTable
strPF = "UM (libellé court)"
I = 1
With PT_main.PivotFields(strPF)
For Each pi In .PivotItems
If Not pi.Visible Then
ReDim Preserve x(1 To I)
x(I) = pi.Name
I = I + 1
End If
Next pi
End With
If I = 1 Then Exit Sub
For Each PT In ActiveSheet.PivotTables
If PT.Name <> PT_main.Name Then
With PT.PivotFields(strPF)
.ClearManualFilter
For I = LBound(x) To UBound(x)
.PivotItems(x(I)).Visible = False
Next I
End With
End If
Next PT
Set PT_main = Nothing
Erase x
End SubBonjour Jean-Eric et merci,
Désolé pour le retard de réponse mais j'avais pas mal d'études cette semaine à réaliser assez urgemment.
Merci pour votre code VBA trop MEGA GENIALO BIEN !
En effet, le mien mettait environ 4 mn pour actualiser tous les TCD en fonction des données filtrées sur le TCD1.
Le votre met 10 sec à peu près pour la même tâche.
Trop fort !
Encore merci.
Avec le PivotFields "UM (libellé court)" et le PivotFields "Code heure (libellé)", ça marche comme sur des roulettes.
Autrement dit, si je laisse
strPF = "UM (libellé court)"ou que je mets
strPF = "Code heure (libellé)", ça roule.
En revanche, si le PivotFields est "Période", alors excel affiche Erreur d'exécution 13 : incompatibilité de type
Si je clique sur "débogage", VBA surligne en jaune
If Not pi.Visible ThenSi je change
Dim strPF As Stringen
Dim strPF As Date, excel affiche le même message et, en débogage, surligne
strPF = "Période"Pouvez-vousSVP me dire comment modifier le code avec le PivotFields "Période" ?
Merci à vous.
Cordialement.
Erwan
Bonjour,
Peux-tu joindre un fichier ou décrire précisément le champ 'Période' et son contenu?
Cdlt.
En fait, avec le code VBA que vous m'avez fourni, l'actualisation des filtres de tous mes TCD en fonction des filtres sélectionnés dans TCD1 marche impec dans mon étude mais, que pour le filtres (ou PivotFields) "UM (libellé court)" et "Code heure (libellé)", pas avec le filtre "Période".
Pour info, voici votre code adapté pour "UM (libellé court)" :
Option Explicit
'Option Private Module
Public Sub Oneforall_UM_LIB_COURT()
Dim PT_main As PivotTable, PT As PivotTable
Dim strPF As String
Dim pi As PivotItem
Dim I As Integer
Dim x()
Application.ScreenUpdating = False
Set PT_main = ActiveSheet.PivotTables("TCD1")
PT_main.RefreshTable
strPF = "UM (libellé court)"
I = 1
With PT_main.PivotFields(strPF)
For Each pi In .PivotItems
If Not pi.Visible Then
ReDim Preserve x(1 To I)
x(I) = pi.Name
I = I + 1
End If
Next pi
End With
If I = 1 Then Exit Sub
For Each PT In ActiveSheet.PivotTables
If PT.Name <> PT_main.Name Then
With PT.PivotFields(strPF)
.ClearManualFilter
For I = LBound(x) To UBound(x)
.PivotItems(x(I)).Visible = False
Next I
End With
End If
Next PT
Set PT_main = Nothing
Erase x
End SubVoici votre code adapté pour "Code heure (libellé)" :
Option Explicit
'Option Private Module
Public Sub Oneforall_CODE_HEURE()
Dim PT_main As PivotTable, PT As PivotTable
Dim strPF As String
Dim pi As PivotItem
Dim I As Integer
Dim x()
Application.ScreenUpdating = False
Set PT_main = ActiveSheet.PivotTables("TCD1")
PT_main.RefreshTable
strPF = "Code heure (libellé)"
I = 1
With PT_main.PivotFields(strPF)
For Each pi In .PivotItems
If Not pi.Visible Then
ReDim Preserve x(1 To I)
x(I) = pi.Name
I = I + 1
End If
Next pi
End With
If I = 1 Then Exit Sub
For Each PT In ActiveSheet.PivotTables
If PT.Name <> PT_main.Name Then
With PT.PivotFields(strPF)
.ClearManualFilter
For I = LBound(x) To UBound(x)
.PivotItems(x(I)).Visible = False
Next I
End With
End If
Next PT
Set PT_main = Nothing
Erase x
End SubVoici votre code adapté pour "Période" (mais qui ne marche pas comme expliqué avant) :
Option Explicit
'Option Private Module
Public Sub Oneforall_PERIODE()
Dim PT_main As PivotTable, PT As PivotTable
Dim strPF As Date
Dim pi As PivotItem
Dim I As Integer
Dim x()
Application.ScreenUpdating = False
Set PT_main = ActiveSheet.PivotTables("TCD1")
PT_main.RefreshTable
strPF = "Période"
I = 1
With PT_main.PivotFields(strPF)
For Each pi In .PivotItems
If Not pi.Visible Then
ReDim Preserve x(1 To I)
x(I) = pi.Name
I = I + 1
End If
Next pi
End With
If I = 1 Then Exit Sub
For Each PT In ActiveSheet.PivotTables
If PT.Name <> PT_main.Name Then
With PT.PivotFields(strPF)
.ClearManualFilter
For I = LBound(x) To UBound(x)
.PivotItems(x(I)).Visible = False
Next I
End With
End If
Next PT
Set PT_main = Nothing
Erase x
End SubJe joint en pièce jointe une image de quelques TCD pour constater que les formats des 3 filtres sont différents : 2 au format texte("UM (libellé court)" et "Code heure (libellé)"), 1 au format date courte ("Période").
Dites-moi si vous avez besoin de plus d'infos.
Je pense que le code VBA ne fonctionne pas avec le filtre "Période" du fait de son format.
Erwan
Re,
En regardant ton image, les champs concernés sont dans le filtre du rapport.
Les choix multiples sont-ils autorisés dans ces champs?
Cdlt.
Oui, chaque TCD à les trois mêmes filtres "UM (libellé court)", "Code heure (libellé)" et Période".
Chacun des ces filtres est bien à choix multiples : le premier propose une dizaine de choix possibles à cocher, le second, une quinzaine à cocher, le troisième va du 01/01/2013 au 01/12/2013 au choix à cocher.
Erwan
Re,
Je reprends ma question.
As-tu l'utilité de travailler avec des sélections multiples?
Si tu n'en as pas besoin, ton code initial et, par conséquence, mon code n'est pas adapté.
Joint un fichier exemple anonymisé avec 2 TCDs que je regarde de plus près le souci.
Cdlt.
Bonjour Jean-Eric,
Désolé pour le retard de réponse.
Ma hiérarchie préfère que le fichier, même transformé, n'arrive pas sur le web.
Désolé.
En fait, le problème que je rencontrais était que votre code marchait IMPEC sauf avec le filtre "Période".
Aussi, j'ai bidouillé pour transformer "Période" (auparavant en format date) en format texte.
Et maintenant, votre code marche !
Encore merci bÔcoup !
Erwan
Bonjour,
N'oublie pas de clore le sujet.
Cdlt.
Bonjour Jean-Eric,
Comment fait-on pour clore un sujet ?
Bye.
Erwan
Bonjour,
ok c'est fait
merci
