Reset Segments (Slicers) très long
Bonjour,
J'ai actuellement un fichier Excel contenant plusieurs TCD connectés à plusieurs segments.
J'ai une macro de réinitialisation qui efface l'ensemble des filtres des segments pour retrouver un affichage "global" de l'ensemble des informations.
Private Sub RAZ_Click() 'Lorsqu'on clique sur le bouton Réinitialisation
Application.ScreenUpdating = False 'Désactivation de l'actualisation de la page (accélération de la macro)
ActiveWorkbook.RefreshAll 'Mise à jour des tableaux croisées dynamiques
ActiveWorkbook.SlicerCaches("Segment_Typologie_de_défaut").ClearManualFilter 'Remise à zéro du Slicers Segment_Typologie_de_défaut
ActiveWorkbook.SlicerCaches("Segment_Procédé_en_défaut").ClearManualFilter 'Remise à zéro du Slicers Segment_Procédé_en_défaut
ActiveWorkbook.SlicerCaches("Segment_Date_de_création_avis").ClearManualFilter 'Remise à zéro du Slicers Segment_Date_de_création_avis
ActiveWorkbook.SlicerCaches("Segment_Ilot").ClearManualFilter 'Remise à zéro du Slicers Segment_Ilot
ActiveWorkbook.SlicerCaches("Segment_Ligne").ClearManualFilter 'Remise à zéro du Slicers Segment_Ligne
Application.ScreenUpdating = True 'Ré-activation de l'actualisation de la page (accélération de la macro)
End Sub
Cependant cette macro est très longue à l'exécution.... (environ 1 minute)
J'ai pensé conditionner les remise à zéro seulement si le segment était filtrés, mais je ne trouve pas la bonne syntaxe.
Avec vous d'autres solutions afin d’accélérer le temps d’exécution ?
Merci d'avance
Bonjour,
Un début de réponse (pistes de résolution
Option Explicit
Public Sub ClearAllFilterOnPivotTables()
Dim ws As Worksheet, pt As PivotTable
Application.ScreenUpdating = False
For Each ws In ActiveWorkbook.Worksheets
For Each pt In ws.PivotTables
With pt
.ManualUpdate = True
.ClearAllFilters
.ManualUpdate = False
End With
Next pt
Next ws
End Sub
Public Sub ClearAllFilterOnPivotTables_2()
Dim slcr As SlicerCache
Application.ScreenUpdating = False
For Each slcr In ActiveWorkbook.SlicerCaches
'slcr.ClearAllFilters
slcr.ClearManualFilter
Next slcer
End Sub
Merci de ta réponse Jean-Eric,
J'ai pris en compte ta simplification de code (Cf code ci dessous)
Cependant, ce que je cherche à faire , c'est d'effacer le filtre du segments seulement si celui çi est filtré (Si aucun filtre n'est appliquer au segment, rien ne sert de le réinitialiser)
Private Sub RAZ_Click() 'Lorsqu'on clique sur le bouton Réinitialisation
Application.ScreenUpdating = False 'Désactivation de l'actualisation de la page (accélération de la macro)
ActiveWorkbook.RefreshAll 'Mise à jour des tableaux croisées dynamiques
For Each SlicerCache In ActiveWorkbook.SlicerCaches 'Pour chaque segment présent dans l'onglet "Analyse"
'******Ajout d'une condition du style : If (Slicercache.filtrer = True) Then ******* (Syntaxe mauvaise)
SlicerCache.ClearManualFilter 'Remise à zéro des segments
Next SlicerCache 'Rebouclage
Application.ScreenUpdating = True 'Ré-activation de l'actualisation de la page (accélération de la macro)
End Sub
Re,
Essaie ainsi, mais je doute sérieusement du résultat.
Rien n'est prévu (à ma connaissance) pour déterminer simplement si un Segment est filtré ou pas.
Et là, on va boucler sur tous les éléments du(des) segment(s).
Ma première proposition devrait être retenue !?
Option Explicit
Public Sub CleatAllFiltersOnPivotTables()
Dim slcr As SlicerCache, sli As SlicerItem
Application.ScreenUpdating = False
For Each slcr In ActiveWorkbook.SlicerCaches
For Each sli In slcr.SlicerItems
If sli.Selected = True Then
slcr.ClearManualFilter
Exit For
End If
Next sli
Next slcr
End Sub
Bonjour,
Un retour ?
Cdlt.
Bonjour,
Ne comprenant pas l'utilité de la première partie de ta solution (avec les pivots de TCD) j'ai seulement adapter et garder la deuxième partie :
La solution de boucler sur l'ensemble des segments prenait un temps fou !
Private Sub RAZ_Click() 'Lorsqu'on clique sur le bouton Réinitialisation
Application.ScreenUpdating = False 'Désactivation de l'actualisation de la page (accélération de la macro)
ActiveWorkbook.RefreshAll 'Mise à jour des tableaux croisées dynamiques
For Each SlicerCache In ActiveWorkbook.SlicerCaches 'Pour chaque segment présent dans l'onglet "Analyse"
SlicerCache.ClearManualFilter 'Remise à zéro des segments
Next SlicerCache 'Rebouclage
Application.ScreenUpdating = True 'Ré-activation de l'actualisation de la page (accélération de la macro)
End Sub
Par ailleurs, j'ai remarqué que si l'ensemble des segments était filtrés, la macro de réinitialisation prenait 15 secondes environ contre 1 minute si seulement 1 segment était filtré. illogique ...
Merci de ta réponse qui m'aura été d'une grande utilité !
Paul
Re,
Merci de ce retour...
Toujours déclarer et typer les variables.
Private Sub RAZ_Click()
Dim slcr As SlicerCache
Application.ScreenUpdating = False
With ActiveWorkbook
.RefreshAll
For Each slcr In .SlicerCaches
slcr.ClearManualFilter
Next slcr
End With
End Sub