我使用Set excel slicer to today's date作为参考来尝试构建一个类似的函数:切片器总是拿起今天(在我的情况下昨天的日期),但我总是有错误'438'。这是我正在尝试的代码:
Sub SlicerSelectToday()
Dim today As Date
today = Now - 1
Dim todayString As String
todayString = Format$(today, "m/d/yyyy")
'MsgBox (todayString)
Dim item As SlicerItem
'ThisWorkbook.Worksheets("Collector").Activate
'ThisWorkbook.SlicerCaches("Slicer_RptDate").ClearManualFilter
For Each item In Worksheets("Collector").SlicerCaches("Slicer_RptDate").SlicerItems
If item.Name = todayString Then
item.Selected = True
Else
item.Selected = False
End If
Next item
ThisWorkbook.RefreshAll
End Sub
我编码错误的任何建议?
答案 0 :(得分:2)
这里是如何避免重复它。
看看这一行:
For Each item In Worksheets("Collector").SlicerCaches("Slicer_RptDate").SlicerItems
如果我们明确说出每条陈述,它将如下所示:
For Each item In Worksheets.Item("Collector").SlicerCaches.Item("Slicer_RptDate").SlicerItems
换句话说:
Worksheets.Item("Collector") _
.SlicerCaches.Item("Slicer_RptDate") _
.SlicerItems
对于单个指令,很多成员访问。
引入中间变量......
Dim collectorSheet As Worksheet
Set collectorSheet = Worksheets("Collector")
Dim rptDateSlicerCache As SlicerCache
Set rptDateSlicerCache = collectorSheet.SlicerCaches("Slicer_RptDate") '*
For Each item In rptDateSlicerCache.SlicerItems
'...
Next
...在键入标有'*
条评论的行时,您可能已注意到, IntelliSense 不提供{{1} }作为SlicerCaches
的成员。
为什么呢?因为:
collectorSheet
返回Worksheets("Collector")
- 从那时起,您就可以自己: IntelliSense 无法帮助您完成自动完成功能,因为{{{{{{ 1}}直到运行时才解决。
通过将该对象分配给Object
变量,您可以自己进行编译时检查,并避免那个讨厌的运行时错误438.
答案 1 :(得分:1)
SlicerCaches
是Workbook
类的属性,而不是Worksheet
类,因为您已经配置了代码。请尝试改为:
For Each item In ThisWorkbook.SlicerCaches("Slicer_RptDate").SlicerItems