我有几个使用不同缓存的数据透视表。所有这些表都是通过数据连接创建的,并且都使用数据模型。我正在尝试创建主切片器,同时过滤所有表。
使用VBA,我的想法是从pivotcache1(我的主切片器链接到的缓存)填充所有可见枢轴项的数组,然后循环遍历此数组以过滤我的其他缓存(pivotcache2& pivotcache3)。
但是,下面的代码不起作用 - 它在For Each循环中分解。
Sub FilterMonth()
Dim sc1, sc2, sc3 As SlicerCache
Dim si As SlicerItem
Set sc1 = ActiveWorkbook.SlicerCaches("Slicer_ClickMonth")
Set sc2 = ActiveWorkbook.SlicerCaches("Slicer_Visit_Month1")
Set sc3 = ActiveWorkbook.SlicerCaches("Slicer_Visit_Month")
For Each si In sc1.SlicerItems
If si.Selected Then
'Add to my array
End If
Next
End Sub
我认为这是因为在数据模型上构建的缓存的语法不同。
有人可以确认这个和/或提供代码来过滤我的所有数据模型缓存吗?
答案 0 :(得分:0)
根据我在https://msdn.microsoft.com/EN-US/library/office/ff839561.aspx找到的信息,SlicerItems属性不能直接与连接到数据模型(OLAP数据源)的数据透视表一起使用。相反,我需要将SlicerItems与SlicerCacheLevels对象一起使用。
以下是一个工作示例。
Sub SlicerMonth()
Dim sc1, sc2, sc3 As SlicerCache
Dim si As SlicerItem
Dim sl1 As SlicerCacheLevel
Dim mnth, nokey, nomatch As String
Set sc1 = ActiveWorkbook.SlicerCaches("Slicer_ClickMonth")
Set sc2 = ActiveWorkbook.SlicerCaches("Slicer_Visit_Month1")
Set sc3 = ActiveWorkbook.SlicerCaches("Slicer_Visit_Month")
Set sl1 = sc1.SlicerCacheLevels(1)
'Clears the strings
nokey = ""
nomatch = ""
'Cycles through the Master Slicer and populates the strings
For Each si In sl1.SlicerItems
If si.Selected Then
mnth = Right(si.Name, 7) '7 becaucse I always have 3 letter months
nokey = nokey & ",[No Key].[Visit Month]" & mnth
nomatch = nomatch & ",[No Match].[Visit Month]" & mnth
i = i + 1
End If
Next
'Trims off the first comma for the strings
nokey = Right(nokey, Len(nokey) - 1)
nomatch = Right(nomatch, Len(nomatch) - 1)
'Clears the filter in the slicers
sc2.ClearManualFilter
sc3.ClearManualFilter
'Sets the slicers to match the Master slicer
sc2.VisibleSlicerItemsList = Array(Split(nokey, ","))
sc3.VisibleSlicerItemsList = Array(Split(nomatch, ","))
End Sub
另一个注意事项(我花了大约半天的时间才弄明白)是为了确保在创建字符串时逗号后面没有空格(nomatch& nokey)。