使用VBA选择和取消选择多个切片器项(OLAP数据)

时间:2018-03-29 13:07:02

标签: vba olap slicers

我正在编写一个只选择所需切片器项的脚本。我尝试使用.SlicerItems.Selected = True / False进行选择和取消选择,但我使用的是OLAP数据源,在这种情况下.Selected是只读的。切片机的格式为YYYYWW,因此2018年的第7周将是201807年。

我录制了一个选择一些切片器项目的宏,这就是它给我的原因:

Sub Macro2()
    ActiveWorkbook.SlicerCaches("Slicer_YYYYWW").VisibleSlicerItemsList = Array( _
        "[Results].[YYYYWW].&[201726]", "[Results].[YYYYWW].&[201727]", _
        "[Results].[YYYYWW].&[201728]", "[Results].[YYYYWW].&[201729]", _
        "[Results].[YYYYWW].&[201730]", "[Results].[YYYYWW].&[201731]", _
        "[Results].[YYYYWW].&[201732]", "[Results].[YYYYWW].&[201733]", _
        "[Results].[YYYYWW].&[201734]", "[Results].[YYYYWW].&[201735]", _
        "[Results].[YYYYWW].&[201736]", "[Results].[YYYYWW].&[201737]", _
        "[Results].[YYYYWW].&[201738]", "[Results].[YYYYWW].&[201739]", _
        "[Results].[YYYYWW].&[201740]", "[Results].[YYYYWW].&[201741]", _
        "[Results].[YYYYWW].&[201742]", "[Results].[YYYYWW].&[201743]", _
        "[Results].[YYYYWW].&[201744]", "[Results].[YYYYWW].&[201745]", _
        "[Results].[YYYYWW].&[201746]", "[Results].[YYYYWW].&[201747]", _
        "[Results].[YYYYWW].&[201748]", "[Results].[YYYYWW].&[201749]", _
        "[Results].[YYYYWW].&[201750]", "[Results].[YYYYWW].&[201751]", _
        "[Results].[YYYYWW].&[201801]", "[Results].[YYYYWW].&[201802]", _
        "[Results].[YYYYWW].&[201803]")
End Sub

所以我尝试按照这个模板创建一个这样的数组。这是我走了多远:

Sub arrayTest()

Dim startDate As Long
    Dim endDate As Long
    Dim n As Long
    Dim i As Long
    Dim strN As String
    Dim sl As SlicerItem
    Dim strArr As Variant
    Dim dur As Long
    Dim result As String

    endDate = Range("C17").Value ' endDate is the last SlicerItem to be selected
    startDate = Range("G17").Value ' startDate is the first SlicerItem to be selected
    dur = Range("C19").Value ' duration is the the number of SlicerItems to be selected
    i = 0
    ReDim strArr(dur) As Variant
    With ActiveWorkbook.SlicerCaches("Slicer_YYYYWW")
'            .ClearManualFilter
        For n = startDate To endDate
            strN = CStr(n) ' convert n to string
            If n = 201753 Then ' this is needed for when the year changes
                strN = CStr(201801)
                n = 201801
            End If
            strArr(i) = """[Results].[YYYYWW].&[" & strN & "]""" ' write string into array
            i = i + 1

'                For Each sl In .SlicerCacheLevels(1).SlicerItems
'                    If sl.Name = strN Then
'                        sl.Selected = True
'                    Else
'                        sl.Selected = False ' this is read-only for OLAP data so it's not working
'                    End If
'                Next

        Next
        MsgBox Join(strArr, ", ") ' the MsgBox returns the correct string to be applied to select the right slicer items

        .VisibleSlicerItemsList = Join(strArr, ", ") ' Error 13: Type mismatch
    End With

End Sub

目前,代码在.VisibleSlicerItemsList = Join(strArr, ", ")上给出了错误13:类型不匹配,这也是评论。所以我猜测将strArr标记为Variant是错误的,数据没有正确插入到strArr中,或者这样做是不可能的。在最新版本的情况下,我应该怎么做?

第29-35行注释掉的部分不起作用,因为它在sl.Selected = False上给出了应用程序定义或对象定义错误(1004)的常见错误。

3 个答案:

答案 0 :(得分:1)

我有一个类似的问题需要克服。我使用以下代码解决了该问题:

Sub show_SlicerItems()

Dim sc As SlicerCache
Dim sL As SlicerCacheLevel
Dim si As SlicerItem

Dim slicerItems_Array()
Dim i As Long

Application.ScreenUpdating = False

    Set sc = ActiveWorkbook.SlicerCaches("Slicer_Name")
    Set sL = sc.SlicerCacheLevels(1)

    ActiveWorkbook.SlicerCaches("Slicer_Name").ClearManualFilter

    i = 0

    For Each si In sL.SlicerItems

        ReDim Preserve slicerItems_Array(i)

        If si.Value <> 0 Then
            slicerItems_Array(i) = si.Name
            i = i + 1
        End If

    Next

sc.VisibleSlicerItemsList = Array(slicerItems_Array)

Application.ScreenUpdating = True

结束子

答案 1 :(得分:0)

您需要为.VisibleSlicerItemsList提供数组,而不是字符串。抛弃加入。

你的strArr任务应该是这样的:strArr(i) = "[Results].[YYYYWW].&[" & strN & "]",即你不需要用额外的“

填充它

编辑:出于兴趣,我碰巧正在构建一个实际上是弹出式切片器的商业插件,它允许您过滤OLAP数据透视表以显示您尝试执行的范围之间的所有项目。它还允许您过滤通配符,AND和OR的疯狂组合,并过滤存储在外部范围中的列表。

以下是该广告的截图。请注意,顶部有一个搜索栏,可让您使用&lt;或者&gt;一起设置下限和上限,这是我在当前搜索中所做的。您可以看到结果:它已正确识别PivotField中符合条件的14个项目。

enter image description here

我需要做的就是在这些上过滤数据透视表,点击“过滤所选项目”选项,它就是这样:

enter image description here

但是要弄清楚如何做到这一点 - 特别是考虑到数据透视表对象模型的局限性(特别是涉及OLAP数据透视表),这是一个非常长期的项目,需要克服许多障碍才能使其无缝工作。我不能分享我害怕的代码,因为这是一个我想要很快发布的商业产品。但我只想强调,虽然这当然是可能的,如果你希望它不会在项目不存在时抛出错误,你会咬掉很多。

答案 2 :(得分:0)

忘记我的另一个答案......如果感兴趣的字段在数据透视表中作为行或列字段,您可以使用标签过滤器轻松完成此操作。启动宏记录器,并执行以下操作:

enter image description here

enter image description here

...并且您将看到数据透视表被过滤:

enter image description here

...结果代码非常简单:

ActiveSheet.PivotTables("PivotTable1").PivotFields("[Table1].[YYYYWW].[YYYYWW]" _
        ).PivotFilters.Add2 Type:=xlCaptionIsBetween, Value1:="201726", Value2:= _
        "201803"