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
Rechercher des sujets similaires à "reset segments slicers tres long"