Alimenter automatiquement un filtre de TCD
Bonjour.
N'ayant pas trouvé réponse à ma question dans la section recherche je crée ce poste .
J'ai un classeur avec 3 feuilles:
- une feuille "IMPORT" qui est une base de données
- une feuille "TCD" où il y a un TCD crée à partir de la feuille IMPORT. Ce TCD a notamment un filtre qui est la "Ville"
- une feuille "FILTRE" dans lequel l'utilisateur entre les villes qu'il souhaite voir apparaître comme éléments à sélectionner dans le filtre du TCD.
Mes questions sont donc:
1) Comment alimenter automatiquement le filtre du VBA en fonction de ce qu'indique l'utilisateur dans la feuille filtre.
J'ai fais un enregistrement de macro et essayé de mettre des for ou if mais j'échoue (cf l'enregistrement de macro ci -dessus)
Sub TCD()
Range("A1:D9").Select
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"IMPORT!R1C1:R9C4", Version:=xlPivotTableVersion12).CreatePivotTable _
TableDestination:="Feuil6!R3C1", TableName:="Tableau croisé dynamique3", _
DefaultVersion:=xlPivotTableVersion12
Sheets("Feuil6").Name = "TCD"
With ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Ville")
.Orientation = xlPageField
.Position = 1
End With
ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Ville"). _
CurrentPage = "(All)"
With ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Ville")
.PivotItems("Marseille").Visible = False
End With
ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Ville"). _
EnableMultiplePageItems = True
With ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Nom")
.Orientation = xlRowField
.Position = 1
End With
ActiveSheet.PivotTables("Tableau croisé dynamique3").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique3").PivotFields("Salaire"), _
"Somme de Salaire", xlSum
End Sub
2) Comment créer dynamiquement un TCD sur une nouvelle feuille, pour chaque élément différent du filtre.
Par exemple, dans mon TCD le filtre c'est la ville. Je voudrais créer une feuille avec un TCD dont le filtre vaut Paris, idem pour Marseille, et idem pour Toulouse.
Merci d'avance de votre réponse.
Bonsoir,
Pour ton point 1, pourquoi tu ne fais pas plutot une liste des villes possibles et compléter ta base de données en utilisant une liste déroulante pour les villes. Cette manière de faire fera en sorte que ton TCD ne reprendra que les villes existantes dans ta base.
Pour le point 2, je ne vois très pourquoi tu ne fais pas plus simplement un TCD qui par défaut contiendra toutes les villes. Il te suffit ensuite de faire un copier coller du tcd existant dans une nouvelle feuille par ville et de choisir la ville dans le filtre de page. Une fois fait tu ne devras plus changer.
Juste cette pensée car je trouve plus compliqué ton option via macro mais bien entendu cela peut se faire
A te relire
Salut Dan.
Mon besoin est le suivant:
en cliquant sur un bouton, on lance une macro.
Cette macro va piocher des données avec un logiciel de business intelligence. J'arrive à piocher ces infos avec une macro mais je suis bloqué pour le traitement.
En fonction des filtres voulues et renseigné par l'utilisateur sur une des feuilles, on crée automatiquement un TCD par feuille et par
élément du filtre
Donc il y a nécessité absolue de créer une macro .
Re,
Ok merci de tes explication.
Plusieurs questions se posent si tu utilises toujours le même fichier pour alimenter ta base de données :
Si les TCD par feuille sont déjà créés et que tu fais une mise à jour de ta base de données, que doit-on faire
Si tu as un TCD par feuille avec des villes et que tu supprimes une ville dans ta feuille FILTRE, on supprime la feuille concernée ?
C’est possible de faire en automatique mais je pense que ce serait mieux de commander tout cela via un bouton placé sur ta feuille FILTRE. A voir plut tard donc.
A te relire
Edit Dan : voici déjà un code à tester
Sub TCD()
'Macro Dan le 07/06/2012
Dim plage As Range
Dim i As Byte
Set plage = Sheets("IMPORT").Range("A1:D" & Sheets("IMPORT").Range("A" & Rows.Count).End(xlUp).Row)
For i = 2 To Sheets("Filtre").Range("D" & Rows.Count).End(xlUp).Row
Sheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Sheets("Filtre").Range("D" & i)
ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
plage).CreatePivotTable _
TableDestination:=ActiveSheet.Range("A4"), _
TableName:="TCD" & ActiveSheet.Name
With ActiveSheet.PivotTables("TCD" & ActiveSheet.Name)
.PivotFields("Ville").Orientation = xlPageField
.PivotFields("Ville").CurrentPage = ActiveSheet.Name
.PivotFields("Nom").Orientation = xlRowField
.AddDataField .PivotFields("Salaire"), "Somme de Salaire", xlSum
End With
Next
End Sub
Salut Dan.
Désolé si j'ai pas répondu avant en ce moment je suis un peu sous l'eau.
C'est ma faute j'aurais du donner des nouvelles.
En ce qui concerne mon problème, je l'ai résolu partiellement.
La méthodologie adoptée est la suivante:
à part les feuilles Import et Filtre, je supprime toutes les autres feuilles où il y a un TCD.
Et je crée une boucle for qui va recréer une feuille par élément de filtre, et un TCD par feuille.
J'ai adopté cette solution à mon problème original. Je te mets le début de code (je peux pas mettre la suite sinon je l'aurais fait
Le code qui permet de choisir un élément particulier pour filtre est la suivante ( idcf est une variable).
feuilleTCD.PivotTables("Tableau croisé dynamique3").PivotFields( _
"Centre de Frais").CurrentPage = "" & idcf & ""
nbCf = Sheets("Accueil").Range("E1")
For i = 1 To nbCf
idcf = Sheets("Accueil").Range("D1").Offset(i, 0)
Sheets.Add
ActiveSheet.Name = "" & idcf & ""
Set feuilleTCD = Sheets("" & idcf & "")
Sheets("ImportRPA").Select
Sheets("ImportRPA").UsedRange.Name = "table"
'-------------------------------------------------------------------------------------------------------------------
'on crée un tableau croisé dynamique va va calculer les temps d'activité, les temps d'inactivité et les temps de présence de toutes les
'semaines
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"table", Version:=xlPivotTableVersion10).CreatePivotTable _
TableDestination:="" & idcf & "!R1C1", TableName:="Tableau croisé dynamique3", _
DefaultVersion:=xlPivotTableVersion10
With feuilleTCD.PivotTables("Tableau croisé dynamique3").PivotFields( _
"Centre de Frais")
.Orientation = xlPageField
.Position = 1
End With
feuilleTCD.PivotTables("Tableau croisé dynamique3").PivotFields( _
"Centre de Frais").CurrentPage = "" & idcf & ""
Par contre, je veux passer à l'étape suivante : je voudrais choisir plusieurs éléments d'un filtre (par exemple 2 parmi 3 ) et là je patine.
Tu as une idée pour ça ?
re
A voir ton code j'ai l'impression que tu n'as pas essayé ma proposition.
Pour ce qui de choisir plusieurs éléments d'un fitre, explique ce que tu veux faire car selon ta demande initiale il était question de créer des TCD en fonction des données dans ta feuille FILTRE
A te relire
Salut Dan.
Sur le forum, j'ai crée un exemple qui n'est pas le classeur dans lequel j'ai fais une macro.
Si tu regardes bien, j'ai repris la même démarche que toi. Utilisation de la boucle for et création de TCD en conséquence.
J'ai essayé d'adapter ta solution à mon problème initiale :
Mais lors de la création de TCD, j'ai eu la fameuse erreur n°5. Donc j'ai un peu remanié à ma sauce et ça a marché.
Par contre j'ai jamais compris pourquoi j'ai l'erreur n°5..
Maintenant, j'ai un 2ème besoin:
sur une même feuille, je voudrais créer un TCD et sélectionner par exemples 2 villes sur trois au niveau du filtre (par ex Paris et Marseille).
J'ai essayé de faire une boucle avec l'instruction :
feuilleTCD.PivotTables("Tableau croisé dynamique3").PivotFields( _
"Centre de Frais").CurrentPage = "" & idcf & ""
idcf étant une variable, elle prend une valeur différente à chaque tour de boucle.
Mais je n'ai pas le résultat attendu. C'est à dire que dans le filtre, je trouve que la dernière valeur prise par la variable idcf.
As-tu déjà traité ce genre de problème ?
Merci.
re,
Sur le forum, j'ai crée un exemple qui n'est pas le classeur dans lequel j'ai fais une macro.
Si tu regardes bien, j'ai repris la même démarche que toi. Utilisation de la boucle for et création de TCD en conséquence.
J'ai essayé d'adapter ta solution à mon problème initiale :
Mais lors de la création de TCD, j'ai eu la fameuse erreur n°5. Donc j'ai un peu remanié à ma sauce et ça a marché.
Par contre j'ai jamais compris pourquoi j'ai l'erreur n°5..
Avec les TCD il vaut toujours mieux avoir le classeur dont tu te sers ou tout au moins qu'il soit structuré de manière identique.
L'erreur 5 se passe sur quelle ligne ??
Ton dernier code peut être simplifié
For i = 1 To nbCf
idcf = Sheets("Accueil").Range("D1").Offset(i, 0)
Sheets.Add.Name = "" & idcf & ""
Set feuilleTCD = Sheets("" & idcf & "")
Sheets("ImportRPA").UsedRange.Name = "table"
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"table", Version:=xlPivotTableVersion10).CreatePivotTable _
TableDestination:="" & idcf & "!R1C1", _
TableName:="Tableau croisé dynamique3"
With feuilleTCD.PivotTables("Tableau croisé dynamique3").PivotFields("Centre de Frais")
.Orientation = xlPageField
.CurrentPage = "" & idcf & ""
End With
N'oublie pas de déclarer tes variables i, nbcf et idcf
Par contre, je veux passer à l'étape suivante : je voudrais choisir plusieurs éléments d'un filtre (par exemple 2 parmi 3 ) et là je patine. Tu as une idée pour ça ?
Mets moi un fichier que je puisse voir ce que tu veux et surtout comment tu procèdes ou explique moi par rapport au fichier que tu as mis en ligne.
L'erreur n°5, je l'ai eu à la création du TCD.
Par exemple, exécutes le code présent dans le post https://forum.excel-pratique.com/post176176.html#p176176.
T'obtiendras l'erreur n°5, mais j'ai jamais compris pourquoi.
Pour mes variables t'inquiètes pas je les utilise jamais sans les déclarer: pour moi c'est la première étape dans le code.
Pour que tu comprennes bien, j'ai expliqué dans le nouveau classeur joint.
Dans la feuille "CahierDesCharges" , je t'ai mis des images pour expliquer ce que je veux.
Merci.
Re
Plus haut tu disais que tu voulais une feuille par ville avec un TCD sur chaque feuille. Ici dans ton dernier post et fichier j'ai l'impression que tu changes, à savoir que tu veux un TCD avec dans le filtre du champ de page les villes de ta feuille FILTRE.
Merci d'expliquer quelle solution tu cherches et d'essayer ce que je t'ai proposé avant (une feuille par ville avec un TCD)
Ton erreur 5 est solutionnée sur l'autre fil.
A te relire.
Plus haut tu disais que tu voulais une feuille par ville avec un TCD sur chaque feuille.
Oui est ça c'est bon.
Ici dans ton dernier post et fichier j'ai l'impression que tu changes, à savoir que tu veux un TCD avec dans le filtre du champ de page les villes de ta feuille FILTRE.
Maintenant j'ai un autre besoin qui est dans une même feuille de créer un TCD avec un filtre, et les éléments du filtre sont rentrés par l'urilisateur dans une feuille.
Regardes le code que j'ai fais et je t'explique l'endroit où c'est pas bon.
Sub TCD()
Dim import As Worksheet
Dim ftcd As Worksheet
Dim fFiltre As Worksheet
Dim i As Integer
Application.DisplayAlerts = False
Sheets("TCD").Delete
Sheets("IMPORT").Select
Sheets.Add
ActiveSheet.Name = "TCD"
Set ftcd = Sheets("TCD")
Set fFiltre = Sheets("Filtre")
'je crée le TCD dans la feuille TCD à partir de l'import
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"IMPORT!R1C1:R25C4", Version:=xlPivotTableVersion12).CreatePivotTable _
TableDestination:="TCD!R1C1", TableName:="Tableau croisé dynamique3", _
DefaultVersion:=xlPivotTableVersion12
'pour mon tcd je choisis la ville comme filtre de TCD
With ftcd.PivotTables("Tableau croisé dynamique3").PivotFields("Ville")
.Orientation = xlPageField
.Position = 1
End With
[color=#FF0000] 'je fais une boucle qui parcourt les éléments que je veux mettre dans le filtre du Tcd et ces éléments
'sont dans la feuille Filtre
'problème: même si je fais une boucle, seul le dernier élément parcouru est pris en compte dans le filtre[/color]
For i = 2 To fFiltre.Range("D65000").End(xlUp).Row
ftcd.PivotTables("Tableau croisé dynamique3").PivotFields("Ville"). _
CurrentPage = "" & fFiltre.Cells(i, 4) & ""
Next i
With ftcd.PivotTables("Tableau croisé dynamique3").PivotFields("Nom")
.Orientation = xlRowField
.Position = 1
End With
ftcd.PivotTables("Tableau croisé dynamique3").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique3").PivotFields("Salaire"), _
"Somme de Salaire", xlSum
End Sub
si t'as d'autre question n'hésites pas .
T'as des pistes DAN ou les autres ?
re,
Non je ne suis pas sur d'autres pistes mais à voir les codes que tu places, j'ai l'impression que tu travailles de ton coté sans regarder ce que je te propose. Alors pour te dire vrai à quoi bon m'occuper de chercher puiqu'il faut à chaque reprise recommencer.
Maintenant j'ai un autre besoin qui est dans une même feuille de créer un TCD avec un filtre, et les éléments du filtre sont rentrés par l'urilisateur dans une feuille.
C'est la même question qu'au début de ce fil non ?
Prends ce que je t'ai proposé dans ce post --> Jeu Juin 07, 2012 11:35 am
Bonjour,
Je déterre ce topic dont le besoin était d'avoir un TCD dont le filtre s'automatise en fonction des ville renseignée dans une autre feuille.
J'ai crée un topic personnel pour un sujet similaire, mais celui-ci n'ayant pas encore trouvé réponse, je voulais savoir si FlyEmirate avait trouvé solution à son problème.
pour info mon topic :
https://forum.excel-pratique.com/excel/macro-filtre-choix-multiple-tcd-t32709.html
Re
Pourquoi poster dans ce fil parce que l'on ne té réponds pas sur l'autre.
Tu aurais pu simplement faire référence à ce fil sur ton fil et le faisant remonter.
Là cela risque de mettre le souc .... et que l'on te réponde ici plutôt que sur l'autre.
Merci de laisser ce sujet pour la demande de Flyermirates.
Amicalement