VBA运行时错误';438';:对象没有';不支持此属性或方法
我用它作为参考,试图构建一个类似的函数:切片器总是选择今天(在我的例子中是昨天)的日期,但我总是出现错误“438”。以下是我正在尝试的代码:VBA运行时错误';438';:对象没有';不支持此属性或方法,vba,Vba,我用它作为参考,试图构建一个类似的函数:切片器总是选择今天(在我的例子中是昨天)的日期,但我总是出现错误“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 'This
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
任何我编码错误的建议?
SlicerCaches
是工作簿
类的属性,而不是工作表
类的属性,因为您已经配置了代码。请尝试:
用于此工作簿中的每个项目。切片机(“切片机”)切片机是工作簿
类的属性,而不是工作表
类的属性,因为您已经配置了代码。请尝试:
此工作簿中每个项目的。切片器缓存(“切片器”\rpdate”)。切片器
以下是避免重复的方法
看看这一行:
如果我们把每一句话都说得很清楚,它会是这样的:
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不会将切片缓存作为收集器表的成员提供
为什么??因为:
Worksheets("Collector")
返回一个对象
——从这一点开始,您就只能靠自己了:IntelliSense无法帮助您自动完成,因为对象
的成员直到运行时才解析
通过将该对象分配给工作表
变量,您可以进行编译时检查,并避免令人讨厌的运行时错误438。
以下是避免重复的方法
看看这一行:
如果我们把每一句话都说得很清楚,它会是这样的:
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不会将切片缓存作为收集器表的成员提供
为什么??因为:
Worksheets("Collector")
返回一个对象
——从这一点开始,您就只能靠自己了:IntelliSense无法帮助您自动完成,因为对象
的成员直到运行时才解析
通过将该对象分配给工作表变量,您可以进行编译时检查,并避免出现令人讨厌的运行时错误438。哪一行引发了错误?对于工作表中的每个项目(“收集器”)。切片器(“切片器”\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\n,但是循环的主体可以是item.Selected=item.Name=todayString
而不是一个完整的If…Then…Else
block。哪一行引发了错误?对于工作表中的每个项目(“收集器”)。切片器(“切片器”\rpdate”)。切片器尽管如此,当我进行逐行测试时,似乎无法识别项目,但不会修复错误,但是循环的主体可以是item.Selected=item.Name=todayString
而不是整个If…Then…Else
block。教一个人钓鱼……)调试这个的很棒的解释!教一个人钓鱼……:)调试这个的很棒的解释!谢谢但是,我得到了运行时错误“1004”:应用程序定义或对象定义的错误,在同一行。@Vivianne IMO这很可能意味着在检查时,SlicerCaches
集合中没有切片器项目。但是在“公式中使用的名称”(切片器设置)中,它显示为在VBA中,我在for循环之前列出了“ThisWorkbook.SlicerCache(“Slicer\RptDate”).ClearManualFilter”,它实际上起了作用。尝试Ctrl+G(即时窗格),然后键入?ThisWorkbook。SlicerCache(“Slicer\RptDate”)什么都不是
,它要么打印False
(在这种情况下,我感到困惑),或重现运行时错误。一旦将错误缩小到某个特定调用,请尝试?thishworkbook.SlicerCaches.Count
-如果输出0
,则出现问题。如果这是1
,则执行?thishworkbook.SlicerCaches(1).Name
-这应该会给您它期望看到的名称。[注意,我对SlicerCaches API不是很熟悉,所以实际的成员名称可能会有所不同]这超出了我的实际回答能力,此时,您的问题已从其原始状态(我们已解决)演变而来。有关进一步的疑难解答,请询问一个新的/单独的问题。谢谢。但是,在同一行中出现了运行时错误“1004”:应用程序定义的错误或对象定义的错误。@Vivianne IMO这很可能意味着没有”切片器\u rpdate检查时,SlicerCaches
集合中的切片器项。但在“公式中使用的名称”(切片器设置)中,它显示为“切片器rpdate”,在VBA中,我在for循环之前列出了“thish工作簿.SlicerCaches(“slicer rpdate”).ClearManualFilter”,它实际起作用。请尝试Ctrl+G(即时窗格),然后键入?此工作簿。SlicerCache(“SlicerrptDate”)什么都不是
——它将打印False
(在这种情况下,我感到困惑),或重现运行时错误。一旦将错误缩小到某个特定调用,请尝试?thishworkbook.SlicerCaches.Count
-如果输出0
,则出现问题。如果这是1
,则执行?thishworkbook.SlicerCaches(1).Name
-这应该会给您它期望看到的名称。[注意,我对SlicerCaches API不是很熟悉,所以实际的成员名称可能会有所不同]这超出了我的实际回答能力,此时,您的问题已从其原始状态(我们已解决)演变而来。要进一步排除故障,请问一个新的/单独的问题。