1

我正在编写一个仅选择所需切片器项目的脚本。我尝试使用.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

目前,代码给出了 Error 13: Type mismatch on .VisibleSlicerItemsList = Join(strArr, ", "),这也被注释掉了。所以我猜想要么将 strArr 标注为 Variant 是错误的,要么数据没有正确插入到 strArr 中,要么就是不可能这样做。在最新的情况下,我应该怎么做?

第 29-35 行注释掉的部分不起作用,因为它给出了 Application-defined or object-defined error (1004) on 的常见错误sl.Selected = False

4

3 回答 3

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
End Sub
于 2018-08-03T10:54:00.513 回答
0

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

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

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

这是它的屏幕截图。请注意,顶部有一个搜索栏,可让您使用 < 或 > 一起设置下限和上限,这是我在当前搜索中所做的。您可以看到结果:它已正确识别出 PivotField 中符合要求的 14 个项目。

在此处输入图像描述

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

在此处输入图像描述

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

于 2018-03-30T21:36:20.533 回答
0

忘记我的其他答案...您可以使用标签过滤器轻松完成此操作,前提是感兴趣的字段在数据透视表中作为行或列字段。启动宏记录器,然后执行以下操作:

在此处输入图像描述

在此处输入图像描述

...您会看到数据透视表被过滤:

在此处输入图像描述

...生成的代码非常简单:

ActiveSheet.PivotTables("PivotTable1").PivotFields("[Table1].[YYYYWW].[YYYYWW]" _
        ).PivotFilters.Add2 Type:=xlCaptionIsBetween, Value1:="201726", Value2:= _
        "201803"
于 2018-04-02T23:06:13.400 回答