我正在编写一个只选择所需切片器项的脚本。我尝试使用.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)的常见错误。
答案 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个项目。
我需要做的就是在这些上过滤数据透视表,点击“过滤所选项目”选项,它就是这样:
但是要弄清楚如何做到这一点 - 特别是考虑到数据透视表对象模型的局限性(特别是涉及OLAP数据透视表),这是一个非常长期的项目,需要克服许多障碍才能使其无缝工作。我不能分享我害怕的代码,因为这是一个我想要很快发布的商业产品。但我只想强调,虽然这当然是可能的,如果你希望它不会在项目不存在时抛出错误,你会咬掉很多。
答案 2 :(得分:0)