Macro VBA - Filtrer TCD ayant pour source un cube

Bonjour,

J'ai cherché dans les archives du forum et même si mon sujet n'est pas nouveau je ne trouve pas de réponse.

J'ai fais un tableau croisé dynamique rattaché à une source externe.

J'ai écris quelques lignes de programme et impossible d'automatiser le changement de valeur du filtre.

    ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "[Structure].[Structure - FINESS].[Structure - FINESS]").ClearAllFilters

    ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "[Structure].[Structure - FINESS].[Structure - FINESS]").CurrentPage = _
        "[Structure].[Structure - FINESS].&[ETABLISSEMENT A]"

Sujet déjà abordé ici :

https://forum.excel-pratique.com/viewtopic.php?f=2&t=67084&p=381796&hilit=cube#p381796

https://forum.excel-pratique.com/viewtopic.php?f=2&t=51541&p=286512&hilit=cube#p286512

https://forum.excel-pratique.com/viewtopic.php?f=2&t=110306&p=655595&hilit=cube#p655595

Comme les autres le ClearAllFilters fonctionne mais dès qu'il s'agit de changer la valeur du filtre, soit le nom complet soit un numéro d'index je reçois un message d'erreur.

Si quelqu'un peut m'apporter son aide...

Merci par avance dans tous les cas

Bien cordialement

Bonjour

CurrentPage s'applique à un champ de page monosélection, est-ce la cas ?

Merci 78chris de m'avoir répondu.

Et bien je t'avoue que je ne sais pas exactement ce que signifie le CurrentPage.

J'imagine que c'est la page courante où se trouve physiquement le TCD. Dans ce cas oui c'est une seule page, plus précisément Sheets(1).

Je n'ai pas pu mettre d'exemple de mon TCD en ligne car ce sont des données très sensibles avec protection CNIL et mot de passe qui change à chaque ouverture de classeur.

Ce qui n'aide pas je comprends bien...

J'ai également :

  • remplacé .CurrentPage par .VisibleFields
  • remplacé "[Structure].[Structure - FINESS].&[ETABLISSEMENT A]" par Array("[Structure].[Structure - FINESS].&[ETABLISSEMENT A]")

Dans un TCD classique on peut même changer la valeur du filtre en changeant directement la valeur de la cellule où celui-ci se trouve, çà semble dingue mais çà fait bien office de filtre. Mais dans mon cas, celui d'une liaison avec un cube et bien cela ne fonctionne plus et j'obtiens même un message d'erreur me disant que je ne peux pas saisir la valeur du filtre celui-ci ne pouvant qu'être sélectionné dans la liste.

RE

Dans un TCD les champs sont soit

  • en page ou filtre,
  • en étiquette de colonne,
  • en étiquette de ligne
  • ou en valeurs

CurrentPage n'est utilisable que pour un champ placé en zone de filtre (anciennement nommée page) et sous réserve que la multisélection n'ait pas été autorisée pour filtrer ce champ.

En champ étiquette de ligne ou de colonne on utilise effectivement Array

Le mot verrou ne fait pas partie du vocabulaire des TCD : je ne vois donc pas de quoi tu parles...

Tu peux te servir de l'enregistreur de macros pour voir la syntaxe d'un filtre effectué manuellement et t'en inspirer...

Je ne sais plus d'où j'ai pris le terme "verrou".

Tout au début du VBA je faisais des refresh de TCD comme beaucoup de débutants j'imagine et c'est à ce moment que j'ai vu "verrou".

Depuis,... je fais du TCD ou du VBA mais jamais les deux ... sauf maintenant

Le code suivant a été généré par le générateur de macro automatique et il porte bien sur le filtre du TCD.

ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "[Structure].[Structure - FINESS].[Structure - FINESS]").CurrentPage = _
        "[Structure].[Structure - FINESS].&[ETABLISSEMENT A]"

Comme la base est externe, rien à faire je n'arrive pas à rendre variable le nom de l'établissement [ETABLISSEMENT A].

Donc mon problème est bien de rendre variable la valeur du filtre...

J'ai corrigé mes précédents messages en remplaçant ce terme "verrou" pour le terme plus clair mais certainement aussi plus juste de "valeur de filtre" ou "filtre".

Re

Si l'établissement est variable

Etab="ETABLISSEMENT A"
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "[Structure].[Structure - FINESS].[Structure - FINESS]").CurrentPage = _
        "[Structure].[Structure - FINESS].&[" & Etab & "]"

Bonjour 78chris,

C'est extraordinaire ce que tu as fais là, ta ligne de code fonctionne.

Maintenant je dois interroger tous les établissements du TCD.

  • Soit en faisant référence au numéro d'index : 1,2,3,...
  • Soit en disposant de la liste des libellés d'établissements

Je vais essayer de l'obtenir en tirant l'information du TCD.

Si je n'y arrive pas je te demanderai un éventuel dernier coup de main, dans tous les cas je te tiens au courant.

Merci beaucoup !

Pourquoi çà ne marche pas ....

J'essaie de récupérer la liste des variables pour pouvoir ensuite les rentrer une par une dans le filtre du TCD mais çà ne fonctionne pas

l = 0
compte = ActiveSheet.PivotTables("1").PivotFields("[Structure].[Structure - FINESS].[Structure - FINESS]").PivotItems.Count
For Each Pi In ActiveSheet.PivotTables("1").PivotFields("[Structure].[Structure - FINESS].[Structure - FINESS]").PivotItems
    l = l + 1
    Cells(l, 14) = Pi.Name
Next Pi

Cà fonctionne très bien sur un TCD sans liaison externe mais là la variable compte = 0 et aucun Pi n'est trouvé...

Sinon plutôt que de récupérer la liste est-il possible de rendre variable la valeur en passant non pas par le libellé mais le num index ?

Quelque chose qui s'apparenterait à çà : sauf que dans mon cas le ne fonctionne pas.

For i = 1 to 200
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "[Structure].[Structure - FINESS].[Structure - FINESS]").CurrentPageName = _
        "[Structure].[Structure - FINESS].&[" & i & "]"
next i

Je déraille ou quoi...

78chris tu m'as vraiment écris çà ?

Etab="ETABLISSEMENT A"
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "[Structure].[Structure - FINESS].[Structure - FINESS]").CurrentPage= _
        "[Structure].[Structure - FINESS].&[" & Etab & "]"

Parce que quand j'ai repris ton code j'ai écris çà :

Etab="ETABLISSEMENT A"
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "[Structure].[Structure - FINESS].[Structure - FINESS]").CurrentPageName= _
        "[Structure].[Structure - FINESS].&[" & Etab & "]"

Et c'est seulement avec CurrentPageName que cela fonctionne, ce qui est normal car c'est pour cube OLAP

RE

Effectivement c'est CurrentPageName : j'avais recopié ton code sans dérailler et juste mis l'établissement en variable...

Mais tu n'as pas de solution concernant mon précédent message ?

l = 0
compte = ActiveSheet.PivotTables("1").PivotFields("[Structure].[Structure - FINESS].[Structure - FINESS]").PivotItems.Count
For Each Pi In ActiveSheet.PivotTables("1").PivotFields("[Structure].[Structure - FINESS].[Structure - FINESS]").PivotItems
    l = l + 1
    Cells(l, 14) = Pi.Name
Next Pi

En fait je ne dispose pas de la liste des établissements et je n'arrive pas à la tirer du TCD.

Il suffisait de mettre le champ qui était en filtre en champ Lignes,....

RE

Sans ficher exemple et sans copie d'écran, difficile de voir ce que tu cherches à faire : du code isolé de tout contexte ne suffit pas à situer...

Le problème est résolu 78christu m'a beaucoup aidé avec ton second message.

Le .CurrentPageName fait le travail.

Derrière j'avais besoin de la liste des établissements, il suffit de la faire figurer en ligne dans le TCD pour l'obtenir ...

Un énorme merci, sans toi, je n'en aurais pas été là !

Rechercher des sujets similaires à "macro vba filtrer tcd ayant source cube"