VBA运行时错误'438':对象不支持此属性或方法

时间:2017-01-23 21:20:37

标签: vba

我使用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

我编码错误的任何建议?

2 个答案:

答案 0 :(得分:2)

David Zemens got your answer

这里是如何避免重复它。

看看这一行:

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)

SlicerCachesWorkbook类的属性,而不是Worksheet类,因为您已经配置了代码。请尝试改为:

For Each item In ThisWorkbook.SlicerCaches("Slicer_RptDate").SlicerItems