【发布时间】:2018-03-29 13:07:01
【问题描述】:
我正在编写一个仅选择所需切片器项目的脚本。我尝试使用.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
目前,代码给出了错误 13:.VisibleSlicerItemsList = Join(strArr, ", ") 上的类型不匹配,这也被注释掉了。所以我猜想将 strArr 标注为 Variant 是错误的,数据没有正确插入 strArr 或者不可能这样做。如果是最新的,应该怎么做呢?
第 29-35 行注释掉的部分不起作用,因为它在sl.Selected = False 上给出了应用程序定义或对象定义错误 (1004) 的常见错误。
【问题讨论】:
-
您尝试过滤的项目之一是否可能不存在于数据中?您能否在 Watch 窗口中发布显示数组的屏幕截图,以便我们检查您的代码是否正确格式化了存储在数组中的内容?
-
是的,切片器项目列表中可能不存在该项目。但是,现在我已经检查了我要选择的所有项目确实存在。将来,是的,这个问题必须解决,但现在我正试图让切片器选择工作。 Watch 窗口的图像是在接近末尾 (ln 38) 执行 MsgBox 之后拍摄的。 imageupload.co.uk/image/Ehbv
-
警告:围绕不存在的项目进行编码非常棘手:我制作了一个商业应用程序,允许用户在此类搜索(包括通配符)上过滤 OLAP 和非 OLAP 数据透视表,我发现我必须使用数据透视表的副本,其中感兴趣的字段未经过滤,因此我可以确认项目是否存在。因为如果他们不这样做,您会在下面我的回答中得到您在评论中提到的错误。可以说这是相当棘手的,涉及大量代码,如果我以前的经验有效,无疑需要相当长的时间才能纠正。
-
您基本上只是想为人们提供一种比使用切片器更简单的方法来选择事物吗?也许您不希望他们必须在切片器上单击拖动来选择大量项目?