Appliquer une macro à plusieurs feuilles d'un classeur

Bonjour,

J'ai un classeur avec plusieurs feuilles qui vont être exportés séparémment. Chacune des feuilles comportent un tableau croisé dynamique. Le problème est que quand j'exporte une feuille il est possible de modifier le filtre et donc d'avoir accès aux données d'une autre entité. Je souhaite donc empêcher l'utilisateur de modifier le filtre. J'ai trouvé ce code qui me permet de faire ce que je veux sur la feuille "Alpes Provence"

Public Sub DisableSelection()
Worksheets("Alpes Provence").Activate 
Dim pt As PivotTable, pf As PivotField, sPI As String

    sPI = "Alpes Provence"
    Set pt = ActiveSheet.PivotTables(1)
    Set pf = pt.PageFields("Entité")

    On Error GoTo err_Handler
    pf.CurrentPage = sPI
    pf.EnableItemSelection = False

exit_Handler:
    Set pf = Nothing: Set pt = Nothing
    Exit Sub
err_Handler:
    MsgBox "Le champ " & sPI & " est inconnu.", vbInformation
    Resume exit_Handler
End Sub

Sauf que je cherche comment appliquer ce code sur toutes les feuilles suivantes en une fois : Alpes Provence, Alsace Vosges, Anjou Maine, Aquitaine, Atlantique Vendée, Brie Picardie, Centre Est, Centre France, Centre Loire, Centre-Ouest.

Je souhaite avoir un bouton sur la feuille Menu qui me permettra d'appliquer cette macro à toutes les feuilles

Je ne sais pas comment les imbriquer à chaque fois pour qu'elle agisse sur chaque feuille appelée ou il y a peut être une autre façon de le faire.

Ci-joint un fichier

Merci pour votre aide

7test.zip (348.85 Ko)

Bonjour,

Je ne suis pas certain d'avoir compris votre demande mais s'il s'agit d'appliquer votre macro à chacune des feuilles du classeur, alors il vous faut rajouter une macro de type :

Sub Macro1()

For each Ws in this.workbbok

call DisableSelection(Ws)

next Ws

end sub

Ce sera cette macro qu'il vous faudra exécuter à l'aide du bouton.

Il faudra alors modifier votre macro principale en y ajoutant un argument :

Sub DisableSelection(Feuille as Worksheet)

end Sub

et en remplaçant chaque "ActiveSheet" par "Feuille"

Bonjour 3GB, merci déjà pour votre réponse.

En fait la macro ne sera pas exécuté sur toute les feuilles et à chaque fois qu'elle est exécuté sur une feuille, un paramètre qui change. Il s'agit de : sPI = "Alpes Provence" .

Sur la feuille Alsace Vosges, ce paramètre deviendra par exemple : sPI = "Alsace Vosges", (c'est à dire qu'il prend le nom de la feuille).

Je pensais que la solution est d'appeler peut être chaque feuille pour y exécuter le code(ainsi je personnalise le paramètre qui change à chaque fois) mais je ne sais pas comment appeler la feuille suivante "Alsace Vosges" pour y exécuter le code à la suite du précédent et ainsi de suite.

Re Muqtadir92,

Mais pourquoi faire plusieurs TCD ? Ce ne serait pas plus simple de faire une seule feuille avec un seul TCD dont vous feriez changer le paramètre par une boucle ?

Il ne faudrait pas donner à sPI la valeur de chacune des régions de votre liste et à chaque fois en prenant soin d'activer et désactiver aux moments voulus la sélection ?

Ou peut-être que ce que tu veux, c'est variabiliser la valeur de sPI ?

sPI = Activesheet.Name (nom de la feuille active)

Re 3GB,

Je dois exporter une feuille par région. Caque feuille contient donc : le tcd qui lui est propre + d'autres données. l'Objectif est de pouvoir exporter toutes les feuilles en une fois et une région ne doit pas avoir accès aux données d'une autre.

Mais le problème est que j'exporte une feuille par exemple et que je l'ouvre, au niveau des filtres l'utilisateur peut changer et avoir accès aux données d'une autre région alors que la feuille est dans seule dans un classeur sans les données qui ont servit à réaliser le TCD.

La macro en question permet de faire disparaitre le filtre. Elle marche sur une feuille mais je ne sais pas comment la faire marcher sur les autres feuilles à moins de l'appliquer à chaque fois sur la feuille de chaque région (ce qui fait pour 44 régions, 44 fois la même macro).

Voilà un peu

Re Mutqadir,

Je ne suis pas certain d'avoir bien compris mais je crois quand même avoir réussi à trouver ce que tu cherches, sachant que le principal problème semblait être la désactivation des TCD.

Voici le code où je passe toutes les références statiques en dynamiques ("Alpes Provence") devient ActiveSheet, et ce pour chaque feuille de l'onglet.

Sub Export()

Dim Ws As Worksheet

Application.ScreenUpdating = False

For Each Ws In ThisWorkbook.Worksheets 'Boucle sur chacune des feuilles du classeur
If Ws.Name <> "Menu" And Ws.Name <> "Données" Then
Call DisableSelection(Ws) 'pour désactiver le filtre
Call EditionPDF(Ws) 'pour exporter en PDF
End If
Next Ws

Application.ScreenUpdating = True

End Sub

Sub DisableSelection(Feuille As Worksheet)

Feuille.Activate

Dim NomTCD$, pt As PivotTable, pf As PivotField

NomTCD = Feuille.PivotTables(1).Name
Set pt = Feuille.PivotTables(NomTCD)
Set pf = pt.PageFields("Entité")

On Error GoTo err_Handler
pf.EnableItemSelection = False

exit_Handler:
Set pf = Nothing
Set pt = Nothing
Exit Sub

err_Handler:
MsgBox "Le champ " & sPI & " est inconnu.", vbInformation

Resume exit_Handler

End Sub

Sub EditionPDF(Feuille As Worksheet)

Dim Dossier$, NomFichier$, Extension$, Chemin$

Dossier = ThisWorkbook.Path 'répertoire courant où sera créé le fichier PDF
NomFichier = "Récap " & Feuille.Name
Extension = ".pdf"
Chemin = Dossier & "\" & NomFichier & Extension

Feuille.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Chemin, IgnorePrintAreas:=False

End Sub

Mais si la région propre à chaque onglet est fixe, je ne vois pas l'intérêt d'un TCD. Un simple tableau suffirait avec des sommes.si.ens(Tab[Fruits];Tab[Entité];$B$1;Tab[Responsable];$A4) (jusqu'à $A11), où B1 contient le nom de la région en question et les cellules A4 à A11 les noms des responsables.

Bon, j'espère en tout cas que ça correspond à tes attentes.

Bonne soirée,

Rechercher des sujets similaires à "appliquer macro feuilles classeur"