Lier par vba deux segments/slicer issus de sources différentes

WIsh_

XLDnaute Occasionnel
Bonjour à tous,

J'essaie depuis hier de lier 2 segments par vba (ceux-ci sont liés à 2 tcd issus de sources différentes).
Lorsque je sélectionne un item dans le segment rouge "N° truc", le même item dans le segment bleu "N° Bidule" devrait se sélectionner automatiquement.

N.B. : Tous les items du segment bleu existent dans le segment rouge mais le segment rouge contient lui davantage d'item que le segment bleu.

...je cale.

Auriez-vous des idées ?

Merci d'avance,
Wish
 

Pièces jointes

  • TestSlice.xlsm
    26.5 KB · Affichages: 7
Solution
RE

Il faudrait partir du cas qui a moins de choix car là tu essayes de rendre unselected des cas inexistants

Soit tester pour chaque s'il existe dans la source, soit ajouter une gestion d'erreur mais en cas de choix d'un item existant dans l'un et pas dans l'autre, cela ne plante pas mais ne filtre évidemment rien dans le second

VB:
Option Explicit

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim sc1, sc2 As SlicerCache
Dim SI1 As SlicerItem

Set sc1 = ThisWorkbook.SlicerCaches("segment_K")
Set sc2 = ThisWorkbook.SlicerCaches("segment_K1")

Application.ScreenUpdating = False
Application.EnableEvents = False

sc2.ClearManualFilter

On Error Resume Next
For Each SI1 In sc1.SlicerItems...

WIsh_

XLDnaute Occasionnel
Re bonjour,

Merci Cris.
Je n'ai pas réussi à utiliser ta macro dans mon fichier. Comme j'ai pas mal de segments, je préfère nommer ceux dont j'ai besoin.

J'ai une erreur "argument ou appel de procédure incorrect" avec le code suivant mais je ne comprends pas ce qui coince:

VB:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim sc1, sc2 As SlicerCache
Dim SI1 As SlicerItem

Set sc1 = ThisWorkbook.SlicerCaches("segment_K")
Set sc2 = ThisWorkbook.SlicerCaches("segment_K1")

Application.ScreenUpdating = False
Application.EnableEvents = False

sc2.ClearManualFilter

For Each SI1 In sc1.SlicerItems
sc2.SlicerItems(SI1.Name).Selected = SI1.Selected
'c'est la ligne ci-dessus qui coince...
Next SI1

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub
 

Pièces jointes

  • TestSlice_1.xlsm
    32.8 KB · Affichages: 8

chris

XLDnaute Barbatruc
RE

Il faudrait partir du cas qui a moins de choix car là tu essayes de rendre unselected des cas inexistants

Soit tester pour chaque s'il existe dans la source, soit ajouter une gestion d'erreur mais en cas de choix d'un item existant dans l'un et pas dans l'autre, cela ne plante pas mais ne filtre évidemment rien dans le second

VB:
Option Explicit

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim sc1, sc2 As SlicerCache
Dim SI1 As SlicerItem

Set sc1 = ThisWorkbook.SlicerCaches("segment_K")
Set sc2 = ThisWorkbook.SlicerCaches("segment_K1")

Application.ScreenUpdating = False
Application.EnableEvents = False

sc2.ClearManualFilter

On Error Resume Next
For Each SI1 In sc1.SlicerItems
sc2.SlicerItems(SI1.Name).Selected = SI1.Selected
Next SI1

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub
 

WIsh_

XLDnaute Occasionnel
Re Chris,

Merci pour ton retour.
Comment est-ce que je peux ajouter au code :
lorsqu'on sélectionne un item dans le premier segment qui n'existe pas dans le second, ne rien sélectionner dans le second ?

Merci d'avance,
Wish
 

WIsh_

XLDnaute Occasionnel
Re,

Ci-joint mon fichier pour illustrer mes propos.
J'ai sélectionné "30002456" dans le 1er segment (rouge). Dans le second, en plus de "30002456" il m'affiche en plus les items qui ne sont pas dans le 1er segment. C'est ceux-là que je voudrais "déselectionner".
 

Pièces jointes

  • TestSlice_2.xlsm
    33.5 KB · Affichages: 12

WIsh_

XLDnaute Occasionnel
Par ailleurs, est-ce que à la place de "on error resume next" on ne pourrait pas utiliser array ? ou checker une à une les item comme tu évoquais ?
Il se passe environ 7, 8 sec lorsqu'on sélectionne un item dans le 1er segment avant l'update des tables... Mon fichier original est beaucoup plus gros que le fichier test : 400 lignes pour source 1 et 3000 lignes pour source 2.
 

chris

XLDnaute Barbatruc
Re

Avec des TCD dont les sources n'ont pas les mêmes noms de champ pour la même info, je n'ai pas trouvé comment établir de lien entre le slicer de l'un et les champs de l'autre pour vérifier la source

La synchro oblige à passer tous les items des slicers en boucle : c'est effectivement peu optimisé

DE plus avec des items différents entre les 2 sources on est en dehors des clous de ce type d'exercice...

Sur mon PC c'est instantané sur ton exemple...
 
Haut Bas