XL 2010 Application plusieurs filtres sur un TCD en fonction d'une cellule [VBA]

altra83

XLDnaute Nouveau
Bonjour à tous !

Voila, je rencontre un petit problème auquel je ne trouve pas de solution concernant la mise a jour auto de filtre TCD selon la valeur dans une cellule. Je vais déjà mettre les choses dans leur contexte pour plus de clarté.

<< En pièce jointe, l'exemple décrit ci-dessous avec un copié/collé de ce post pour plus de clarté et de facilité >>

J'ai ici deux onglets :

[Recherche] : Deux menus déroulants en cascade (FRUIT donnant accès a une liste de fruit, et LEGUME donnant accès à une liste de ... legume ofc).

[Fournisseurs] : TCD se mettant à jour automatiquement en filtrant par rapport à E5 (liste de produit).

Le problème : lorsque je sélectionne une famille de produit, en (1), je peux choisir un produit en (2) et mon TCD se met à jour (ex : si je sélectionne "POMME", le TCD va m'appliquer le filtre "POMME" lorsque je vais allé sur l'onglet "Fournisseurs".

Cependant, j'ai ajouté dans cette liste de produit "ENSEMBLE FRUIT".

Ce que je souhaiterai faire (ou du moins, savoir si cela est possible), c'est que lorsque je sélectionne "ENSEMBLE FRUIT", le TCD soit filtré avec les 5 fruits disponibles afin d'avoir une vision d'ensemble sur la famille de produit concernée.

Évidement, j'ai la même configuration avec "LEGUME" et "ENSEMBLE LEGUME".

En d'autres termes, filtrer mon tcd sur plusieurs rubriques lorsque la cellule lié au filtre est sur un certain intitulé.

J'espère avoir été assez clair !

--------------------------------------------------------------------------------------------------------------------------------
Mon code de la macro de mise à jour du TCD :

VB:
Private Sub Worksheet_Activate()

Dim i As Integer

Application.ScreenUpdating = False

  For i = 1 To 1

  ActiveSheet.PivotTables("Tableau croisé dynamique" & i).PivotFields("Produit"). _

  ClearAllFilters

  ActiveSheet.PivotTables("Tableau croisé dynamique" & i).PivotFields("Produit"). _

  CurrentPage = IIf(Sheets("recherche").Range("e5").Value = "", "(All)", Sheets("recherche").Range("e5").Value)

  Next


End Sub


--------------------------------------------------------------------------------------------------------------------------------

Par avance merci, au plaisir de vous lire !
 

Pièces jointes

  • Exemple.xlsm
    36.3 KB · Affichages: 69

chris

XLDnaute Barbatruc
Bonjour

Tu pars un peu sur une usine à gaz à mon avis en ne tirant pas partie des possibilités de 2010.

2010 offre les segments pour filtrer.

Tu gagnerais à ajouter la famille à ta BD (une formule suffit)

Ton fichier avec la source et les correspondances sous forme de tableau, une formule pour la famille, et 2 segments.
Pas besoin de VBA à part, si on veut peaufiner, l'annulation du filtre produit quand on change famille...
 

Pièces jointes

  • TCD_segments.xlsm
    43.4 KB · Affichages: 58

altra83

XLDnaute Nouveau
Bonjour chris et merci pour ta réponse

Je sais qu'au premier abord ça parait plus compliqué que ce qu'il serait possible de faire, mais c'est une contrainte car ce que je demande est destiné à être incorporé sur un doc pro (et les deux menus déroulant sont là pour gagner de la place sur l'interface principale du document, ainsi que pour être verrouillé afin de sécuriser l'envoi et pour limiter les accès de chaque personne aux informations).

Mes connaissances en VBA étant quand même assez limitées, je voulais déjà savoir si ce que je demande est réalisable, afin de savoir si je dois contourner le problème ou me pencher plus sérieusement dessus avec la certitude qu'une solution peut être trouver.

Encore une fois merci pour ton temps !
 

chris

XLDnaute Barbatruc
Re

Pilote tes segments placés ailleurs, en VBA.

Si tu n'ajoutes pas famille dans ta BD, tu devras filtrer produit pas produit via une boucle et mettre ton champ de page en multi sélection ce qui empêche l'usage de currentpage, il me semble
 

altra83

XLDnaute Nouveau
Et en ajoutant une colonne ainsi qu'un deuxième filtre mais cette fois-ci par famille, serait-il possible de faire en sorte que si dans le premier filtre, il y a une valeur "ENSEMBLE de ...", le TCD passe le premier filtre en "tout" et le deuxième sur la famille concerné ?

Je vais me penché sur la question !
 

chris

XLDnaute Barbatruc
RE

"Ensemble de" correspondra à tous sur le produit et au choix d'une famille : il n'est pas utile de filtrer le produit puisqu'il l'est via la famille d'où ma remarque sur l'annulation du filtre produit dans mon premier message.
 

altra83

XLDnaute Nouveau
Donc si je comprend, ajouté un segment juste pour ma famille suffit, il faut ensuite que j’envoie un bout de code pour qu'il me sélectionne a chaque fois la famille concernée dans ce dernier comme ça, si je sélectionne "ensemble de ...", le TCD va me de-filtrer tous mes produits, mais va me filtrer mes familles grâce au segment ?

Cela ne risque-t-il pas de m'afficher le même message d'erreur que je rencontre actuellement si je sélectionne "'ensemble de ..." ?
 

altra83

XLDnaute Nouveau
Re,

J'ai finalement réussi a résoudre mon problème en partant de ma macro initiale

VB:
Private Sub Worksheet_Activate()
Dim i As Integer
Application.ScreenUpdating = False
    For i = 1 To 1
      
       ActiveSheet.PivotTables("Tableau croisé dynamique" & i).PivotFields("famille"). _
        ClearAllFilters
        ActiveSheet.PivotTables("Tableau croisé dynamique" & i).PivotFields("famille"). _
        CurrentPage = IIf(Sheets("recherche").Range("e3").Value = "", "(All)", Sheets("recherche").Range("e3").Value)
      
      
       ActiveSheet.PivotTables("Tableau croisé dynamique" & i).PivotFields("Produit"). _
        ClearAllFilters
        ActiveSheet.PivotTables("Tableau croisé dynamique" & i).PivotFields("Produit"). _
        CurrentPage = IIf(Sheets("recherche").Range("e5").Value = "ENSEMBLE", "(All)", Sheets("recherche").Range("e5").Value)
  
   Next
   
End Sub


J'ai donc renommé mes rubriques "ensemble de ..." par "Ensemble" et ajouté une filtre supplémentaire "famille". Si "Ensemble" est sélectionné, le filtre "produit" est retiré, laissant donc apparaitre dans le TCD uniquement la famille de produit sélectionné.

Merci encore chris, bien que je n'ai pas emprunté ton chemin, j'ai remarqué grâce a toi que lorsque que le message d'erreur d’affiché, tous les filtres étaient retiré, ce qui m'a donné l'idée d'une seconde rubrique de filtre.

Je met en PJ le doc d'exemple actualisé, sait-on jamais, si ça peut servir a quelqu'un !

Encore merci et bon apres-midi à toi :)
 

Pièces jointes

  • Exemple.xlsm
    38 KB · Affichages: 87

altra83

XLDnaute Nouveau
Ma DB est actualisé tous les mois, et généralement j'importe directement l'intégralité de mon extraction en écrasant mon ancienne DB, cela a-t-il une importance particulière de le mettre en tableau dans ces conditions ? (sachant que la requête sur mon ERP est paramétré pour que chaque colonne tombe la où il faut pour la bonne marche de mon outil)
 

merinos

XLDnaute Accro
Ma DB est actualisé tous les mois, et généralement j'importe directement l'intégralité de mon extraction en écrasant mon ancienne DB, cela a-t-il une importance particulière de le mettre en tableau dans ces conditions ? (sachant que la requête sur mon ERP est paramétré pour que chaque colonne tombe la où il faut pour la bonne marche de mon outil)


Ne pas formater les données en table est une faute. car tes données sur les quelles tu pivotes ne sont pas dynamiques.
Dans 6 mois , ou 2 ans, on va ajouter une gamme de produits, une ligne va apparaître... Tu seras pas là ou distrait ... Et ces données seront hors champs. Donc invisibles dans le pivot.
 

Discussions similaires

Réponses
12
Affichages
534

Statistiques des forums

Discussions
311 729
Messages
2 081 974
Membres
101 854
dernier inscrit
micmag26