Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA运行时错误';438';:对象没有';不支持此属性或方法_Vba - Fatal编程技术网

VBA运行时错误';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

我用它作为参考,试图构建一个类似的函数:切片器总是选择今天(在我的例子中是昨天)的日期,但我总是出现错误“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

任何我编码错误的建议?

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不是很熟悉,所以实际的成员名称可能会有所不同]这超出了我的实际回答能力,此时,您的问题已从其原始状态(我们已解决)演变而来。要进一步排除故障,请问一个新的/单独的问题。