Lier des segments issus de 2 sources de données différentes
Bonjour,
J'ai un tableau de bord avec :
- 1 onglet "Données"
- 1 onglet "Données_Chg"
- 1 onglet TCD
Donc 2 sources de données. J'utilise les segments pour que cela soit plus rapide et facile à utiliser, mais je ne parviens pas à lier les 3 segments de la source "Données_Chg" aux 3 segments de la sources "Données".
Le code plante lorsque je clic sur un segment :
Private Sub Workbook_SheetPivotTableUpdate(ByVal Sh As Object, ByVal Target As PivotTable)
If Sh.Name = "TCD" And Target.Name = "Tableau croisé dynamique1" Then
Application.EnableEvents = False
'ligne suivante à répéter pour chaque autre segment en adaptant le nom
ActiveWorkbook.SlicerCaches("Segment_Société").ClearManualFilter
ActiveWorkbook.SlicerCaches("Segment_Année").ClearManualFilter
ActiveWorkbook.SlicerCaches("Segment_Mois").ClearManualFilter
For Each Iitem In ActiveWorkbook.SlicerCaches("Slicer_Zone").SlicerItems
'ligne suivante à répéter pour chaque autre segment en adaptant le nom
ActiveWorkbook.SlicerCaches("Segment_Société").SlicerItems(Iitem.Name).Selected = Iitem.Selected
ActiveWorkbook.SlicerCaches("Segment_Année").SlicerItems(Iitem.Name).Selected = Iitem.Selected
ActiveWorkbook.SlicerCaches("Segment_Mois").SlicerItems(Iitem.Name).Selected = Iitem.Selected
Next
Application.EnableEvents = True
End If
End SubL'erreur vient à la ligne
For Each Iitem In ActiveWorkbook.SlicerCaches("Slicer_Zone").SlicerItemsJe pense que cela vient de "Slicer_Zone", pouvez-vous me dire comment changer svp ? (désolé toujours noob en VBA).
Bonjour,
Sans détails sur l'erreur ni fichier difficile d'etre précis. Quelques pistes de résolution :
Vérifiez que ActiveWorkbook.SlicerCaches("Slicer_Zone") existe bien (assignez une variable et regardez là dans l'explorateur d'objets).
Si vous avez Option Explicit, vous devez Dim Iitem as Variant
Sinon, veuillez joindre un fichier et au minimum un screenshot de l'erreur en question.
Écrivez
Dim a
a = ActiveWorkbook.SlicerCaches("Slicer_Zone")
Juste avant la ligne en jaune, et relancer votre macro. Si la nouvelle ligne devient jaune alors cela veut dire que l'objet SlicerCaches nommé "Slicer_Zone" n'existe pas. Vous devez revoir son nom.
Pour le fichier vous pouvez le joindre en supprimant les données sensibles. Ce qui compte c'est le nom de vos tableaux et les macros.
Bonjour,
Si quelqu'un a une idée car je vais avoir une 3ème source de données... le but étant de ne modifier les segments qu'une seule fois.
D'avance merci
Solution de contournement, j'ai mis en place une page de garde avec des logos. Puis affectation d'une macro au logo, qui va du coup piloter les segments.
Cela fonctionne très bien mais l'actualisation des données est très longue !!
Je pense que le code VBA est largement perfectible pour gagner du temps mais je ne vois pas comment :
Sub SOCIETE1()
' SOCIETE1 Macro
ActiveWorkbook.RefreshAll
Dim tblPivot As PivotTable
For Each tblPivot In ActiveWorkbook.PivotTables
tblPivot.RefreshTable
Next tblPivot
Dim Iitem As Variant
Dim i As Integer
Application.EnableEvents = False
ActiveWorkbook.SlicerCaches("Segment_Société").ClearManualFilter
ActiveWorkbook.SlicerCaches("Segment_Société1").ClearManualFilter
ActiveWorkbook.SlicerCaches("Segment_Société2").ClearManualFilter
For Each Iitem In ActiveWorkbook.SlicerCaches("Segment_Société").SlicerItems
ActiveWorkbook.SlicerCaches("Segment_Société").SlicerItems("SOCIETE1").Selected = True
ActiveWorkbook.SlicerCaches("Segment_Société").SlicerItems("SOCIETE2").Selected = False
ActiveWorkbook.SlicerCaches("Segment_Société").SlicerItems("SOCIETE3").Selected = False
ActiveWorkbook.SlicerCaches("Segment_Société").SlicerItems("SOCIETE4").Selected = False
ActiveWorkbook.SlicerCaches("Segment_Société").SlicerItems("SOCIETE5").Selected = False
Next Iitem
For i = 1 To 2
For Each Iitem In ActiveWorkbook.SlicerCaches("Segment_Société" & i).SlicerItems
ActiveWorkbook.SlicerCaches("Segment_Société" & i).SlicerItems("SOCIETE1").Selected = True
ActiveWorkbook.SlicerCaches("Segment_Société" & i).SlicerItems("SOCIETE2").Selected = False
ActiveWorkbook.SlicerCaches("Segment_Société" & i).SlicerItems("SOCIETE3").Selected = False
ActiveWorkbook.SlicerCaches("Segment_Société" & i).SlicerItems("SOCIETE4").Selected = False
ActiveWorkbook.SlicerCaches("Segment_Société" & i).SlicerItems("SOCIETE5").Selected = False
Next Iitem
Next
Application.EnableEvents = True
End SubMais en tout cas cela fonctionne. Pour info j'ai aussi fait de meme pour choisir le mois et l'année (en plus de la société), idem cela fonctionne mais le temps de rafraichissement est encore plus long !! Dernier essai fait, toutes les sociétés et tous les mois, Excel à mis plus de 3 minutes à rafraichir les infos.
Bonjour
Il suffit de compiler les 2 tables via PowerQuery de façon à avoir une source unique, une colonne précisant la source, pour que tous les TCD/GCD aient une source unique et donc des Segments communs.
Cela oblige
- soit à refaire tes TCD/GCD directement à partir de la requête,
- soit récupérer la compilation dans un onglet, puis modifier les TCD/GCD pour modifier la source et ajouter un filtre supplémentaire pour préciser si le TCD/GCD utilise les lignes de Base ou Base_chg
Plus qu'à supprimer les segments en trop et lier les autres à tous les TCD/GCD
Je ne connais pas du tout PowerQuery !
En gros j'ai 3 onglets avec des données (du coup 2 sources différentes), un onglet TCD et ensuite 4 onglet de présentation avec utilisation des segments.
N'ayant pas réussi à lier les segments entre eux (vu qu'ils sont issus d'une source différente), j'ai ajouté un onglet "Table" pour choisir la ou les sociétés, le ou les mois et l'année d'analyse.
RE
J'ai appliqué la seconde solution et ai sur 8 TCD (dont j'ai modifié la couleur pour que tu vois) :
- délié les segments à plus d'un TCD
- modifié la source des TCD,
- ajouté le champ Source et filtré ce champ
Il te reste à :
- faire les étapes 2 et 3 sur chaque TCD
- relier tes segments aux divers TCD
- éventuellement les dupliquer sur les tableaux de bord en supprimant les anciens
Merci beaucoup ! Le regroupement des sources va faciliter les choses :)


