链接使用数据模型构建的数据透视表中的切片器

时间:2015-09-09 18:02:52

标签: excel vba excel-vba datamodel

我有几个使用不同缓存的数据透视表。所有这些表都是通过数据连接创建的,并且都使用数据模型。我正在尝试创建主切片器,同时过滤所有表。

使用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

我认为这是因为在数据模型上构建的缓存的语法不同。

有人可以确认这个和/或提供代码来过滤我的所有数据模型缓存吗?

1 个答案:

答案 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)。