VBA - problème modification macro filtre TCD

Bonjour,

Je travaille sur un fichier où l'utilisateur ne doit pas pouvoir modifier le choix du filtre du TCD, pour ceci voici une macro qui fonctionne très bien :

Sub BLOQUER_Filtre_DTSE_1()

'METTRE ET BLOQUER FILTRE DTSE SUR TCD 1'

Dim pt As PivotTable, pf As PivotField, sPI As String

sPI = "DTSE" 'critère'

Set pt = Sheets("IK DTSE").PivotTables("Tableau croisé dynamique1") 'feuille + TCD'

Set pf = pt.PageFields("Direction") 'champs à filtrer'

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

Or les données ont changé et nous devons réaliser un filter à plusieurs critères. Malheureusement je ne sais pas comment faire s'il faut modifier complètement la macro ou un simple changement de syntaxe suffira.

Il faudrait que la ligne du critère : sPI = "DTSE" --> avoir un choix de plusieurs critères à mettre dans le filtre.

Si vous avez des idées sur le sujet cela m'aiderait beaucoup

Merci de votre aide et du tmeps consacré à ma demande !

Stéphane

Bonjoujour

Il faut autoriser la multiséletion sur le champ puis afficher tout (ClearAllFilters) et rendre non visible tout ce qui est différent des valeurs choisies par une boucle for each et un select case par exemple

Merci de ton aide,

Je dispose déja d'une autre macro pour me mettre mes filtres à zéro, la je voudrai juste pouvoir filtrer sur 2 items. Je ne peux pas juste modifier la syntaxe de ma macro déja existante ? car je ne sais pas encore faire de boucle et ni utiliser Case... D'ailleurs Case donnerai des conditions or cela ne m'intéresse pas j'aimerai juste que la macro est une action directe : filtrer et empecher la modification du champ.

Si tu as d'autres idées ou options ? Je te remercie pour ton aide

Stéphane

RE

Je te donne une solution qui fonctionne !

Dès qu'on a un champ en multisélection, le filtrage fonctionne différemment : il faut défiltrer puis faire une boucle pour refiltrer.

Comme il y a plusieurs choix si on veut éviter des SI imbriqués, le CASE s'impose.

A toi de modifier ton code : sans ton classeur exemple je ne code pas.

Je viens de faire un peu comme tu m'as dit et cela fonctionne très bien !! au final je dis ce que je ne prends pas cela revient au même que de dire les données que je veux filtrer (il y en a peu), je n'ai pas su utiliser le Case et voici le code que cela donne :

Sub BLOQUER_Filtre_DTSE_1()

'METTRE ET BLOQUER FILTRE DTSE SUR TCD 1'

ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Direction"). _

EnableMultiplePageItems = True

ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Direction"). _

CurrentPage = "(All)"

With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _

"Direction")

.PivotItems("CODIR").Visible = False

.PivotItems("COSII").Visible = False

.PivotItems("DMP").Visible = False

.PivotItems("Marché d'affaires").Visible = False

End With

ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Direction").EnableItemSelection = False

End Sub

Cela fait bien plus manuel qu'avant mais cela fonctionne ! penses tu qu'il pourrait être amélioré ?

Merci de ton aide

Re

Le souci c'est que si des directions s'ajoutent elles ne seront pas filtrées puisque qu'au lieu de préciser que ce que tu veux voir, tu indiques ce que tu veux masquer.

Si la liste des direction est stable cela marche...

EnableMultiplePageItems = True est inutile, il suffit que ce soit activé manuelelment dans le TCD 1 fois, cela ne bouge plus

Tu veux decaler tes With et en With pour mutualiser aussi la 1ere et la dernière référence au champ

Bonjour,

Essaie ceci :

Option Explicit

Public Sub Filter_data()
Dim pt As PivotTable, pf As PivotField, pi As PivotItem

    On Error GoTo err_Handler

    Set pt = ActiveSheet.PivotTables(1)
    Set pf = pt.PageFields("Direction")

    pt.PivotCache.Refresh
    pt.ManualUpdate = True

    With pf
        .ClearAllFilters
        .EnableItemSelection = True
        For Each pi In .PivotItems
            Select Case pi.Name
                Case "CODIR", "COSII", "DMP", "March? d'affaires"
                    pi.Visible = False
                Case Else
                    '
            End Select
        Next pi
    End With

    pt.ManualUpdate = False

exit_Handler:
    Set pf = Nothing
    Set pf = Nothing
    Exit Sub
err_Handler:
    MsgBox "Erreur : " & Err.Number & Chr(10) & Err.Description
    Resume exit_Handler
End Sub

Wow merci beaucoup à vous deux j'étais en train de reprendre les messages pour essayer de l'améliorer et tu réponds Jean-Eric ! Mercii à toi !

Tout est très bien j'ai pu modifier les conditions case comme je le souhaitait et en mettant seulement ceux que je voulais voir !

Par contre cela agis sur le TCD2 de ma feuille pourtant on appelle bien .PivotTables(1) ! Bizarre ?

Quellle peut en être la cause ?

Aussi cette ligne pour empecher la modification du filtre ne fonctionne plus : ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Direction").EnableItemSelection = False

pourquoi ?

Une autre question : pourquoi mettre 'Option Explicit' ? A quoi cela sert ?

Merci

ps : le code

Option Explicit

Public Sub Filter_data()

Dim pt As PivotTable, pf As PivotField, pi As PivotItem

On Error GoTo err_Handler

Set pt = ActiveSheet.PivotTables(1)

Set pf = pt.PageFields("Direction")

pt.PivotCache.Refresh

pt.ManualUpdate = True

With pf

.ClearAllFilters

.EnableItemSelection = True

For Each pi In .PivotItems

Select Case pi.Name

Case "OS", "DMP"

pi.Visible = True

Case Else

pi.Visible = False

End Select

Next pi

End With

pt.ManualUpdate = False

exit_Handler:

Set pf = Nothing

Set pf = Nothing

Exit Sub

err_Handler:

MsgBox "Erreur : " & Err.Number & Chr(10) & Err.Description

Resume exit_Handler

ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Direction").EnableItemSelection = False

End Sub

bonjour

et si au lieu de macro, on utilisait une fonctionnalité "récente de 10 ans déjà" ?

sur 2013, il faut télécharger Power Query (il est gratuit et maintenant intégré à Excel)

on récupère les données, on filtre, puis on charge

on fait le (les) TCD.

exemple

note : il n'y a pas de réelle protection contre un type qui voudrait vraiment supprimer ou modifier le filtre (piratage, malveillance). Mais il lui faudra d'abord apprendre un peu de Power Query et mettre les mains dans le truc.

Si le risque existe, faire un classeur intermédiaire avec un Query1 qui filtre, puis un second avec un Query2 qui interroge le 1er. Donne l'accès au second. Imossible de modifier le filtre qui est en 1. Malin, trouvé sur le net.

note 2 : les utlisateurs ont juste à cliquer sur Actualiser pour actualiser

pas de VBA.

17classeur3.xlsx (20.91 Ko)

Cela semble être une bonne solution je viens de regarder, après je dispose d'autre logicels de base de données tels que PowerBI ou QlikView mais je souhaite vraiement faire ca sur un seul logiciel et rapidement via une macro lorsque j'aurai besoins de modifications ! De plus j'apprends le VBA et c'est pour cela que cela m'intéresse plus !

Merci néanmoins pour ta réponse quin est jsute et utile !

Stéphane

re

n'apprends pas VBA

c'est inutile

si tu veux apprendre un langage, choisis C++/#, Python ou autre

mets un coup de boost sur Power BI !

d'ailleurs tu ne feras plus de TCD ni de graphiques sous Excel, tellement il est agréable à concevoir et surtout à consommer (oui, c'est le mor à utiliser)

ton TCD avec filtre devrait être fait sous PBI

c'est LE MEILLEUR conseil que je puisse te donner

et dans 1 heure tu as fini

et c'est sécurisé

et les consommateurs seront enchantés

Pour avoir mis les pieds dans plusieurs services je t'assures que cela n'est pas inutile je peux faire des fichiers avec des fonctionnalités où sur powerBI je ne pourrai pas faire le quart du tiers

Forcément VBA à ses limites et n'est pas le plus professionnalisant ni le plus recherché mais pas de perte de temps je t'assure Je souhaite quand même maîtrisé VBA avant de passer au codage via requête sur autre logiciel ou le lange sera déja bien plus facile et instrictif que le VBA (ps : j'ai 21 ans et le temps )

Merci !

re

non, tu n'as pas le temps.

Apprendre 3 ou 4, ou plus langage est un engagement comme le rugby.

et VBA, qui autorise la programmation sale, risque de te gâter l'apprentissage de codage propre

(sur ce forum, tu liras de nombreux messages en ce sens)

et en plus ça te retarde dans l'apprentissage des zillions de fonctionnalités d'Excel (et tu risques fort de réinventer avec VBA des fonctionnalités existantes, ou de structurer tes fichiers comme des feuilles de papier)

Power BI fait de la présentation de données

Excel fait de la saisie de données

quels traitements fais-tu qui sont impossibles sous PBI ?

commence aussi le big data et l'IA

2 sujets majeurs !

donc R et Python, et PBI pour visualiser les résultats

plus ta connaissance d'Excel, tu seras le roi du monde

attention, les USA ont un aspirateur qui attire irrésistiblement ces compétences. Prépare ta valise !

tu pourrais être mon petit-fils

mais j'apprends actuellement l'IA

j'ai commencé l'IA (le Machine Learning) il y a 45 ans. Sans ordinateur ! si curieux, je te donnerai la source.

C'est excatement ce que je fais je suis en Master en alternance en finance mais je m'intéresse aux systèmes d'information et à la fiabilisation des données via ces énormes flux (qui plus est je suis à EDF et les données et logiciels sont vraiement nombreux/ses).

Je fais encore du VBA la pour automatiser mon service mais je commence à utiliser PBI depuis 1 semaine car j'ai pu constater aussi les limites d'Excel pendant mon apprentissage.. Pour l'IA je verrai donc plus tard ahah j'ai encore beaucoup de compétences à acquérir avant !

Merci pour tes conseils et bonne continuation

bonne vie

construis-la

trouves-y de la satisfaction

la vie est pimentée d'erreurs. Apprendre VBA en est une

Re,

1 - J'ai considéré que la procédure était exécutée à partir de la feuille active et que cette feuille ne comportait qu'un unique TCD soit le numéro 1. Si une feuille comporte plusieurs TCDs, il faut alors les nommer précisément.

2 - Option Explicit : cette option impose que l'on déclare et type toutes les variables (regarde l'aide sur le web).

Cdlt.

Re Jean Eric, merci beaucoup cela fonctionne très bien et bravo pour tes explications tout est très clair !

Re,

désolé dernier petit détail... sais-tu pourquoi la propriété :

ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Direction").EnableItemSelection = False

Ne fonctionne pas en fin de code ? cela est censé empêché la possibilité de changer les filtres manuellement

voici le code :

Option Explicit

Public Sub Bloquer_filtres_DMP1()

Dim pt As PivotTable, pf As PivotField, pi As PivotItem

On Error GoTo err_Handler

Set pt = ActiveSheet.PivotTables("Tableau croisé dynamique1")

Set pf = pt.PageFields("Direction")

pt.PivotCache.Refresh

pt.ManualUpdate = True

With pf

.ClearAllFilters

.EnableItemSelection = True

For Each pi In .PivotItems

Select Case pi.Name

Case "OS", "DMP", "CODIR"

pi.Visible = True

Case Else

pi.Visible = False

End Select

Next pi

End With

pt.ManualUpdate = False

exit_Handler:

Set pf = Nothing

Set pf = Nothing

Exit Sub

err_Handler:

MsgBox "Erreur : " & Err.Number & Chr(10) & Err.Description

Resume exit_Handler

ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Direction").EnableItemSelection = False

End Sub

Re,

Pour commencer la syntaxe correcte est :

pf.EnableItemSelection=False

Ensuite, là ou tu l'as placé, la commande ne pourra jamais être exécutée !...

Elle doit être placée avant exit_Handler.

Informe toi sur la gestion des erreurs sous VBA.

Cdlt.

Rechercher des sujets similaires à "vba probleme modification macro filtre tcd"