首页 > 解决方案 > 由于非日期值过滤数据透视表 VB 错误

问题描述

我有一个数据透视表和一个用于在 2 个日期之间进行过滤的按钮。当我单击按钮时,我收到错误1004 应用程序定义或对象定义错误

我发现错误是由于某些行的源单元格中的一些非日期值造成的。当我将它们更改为日期值时,代码可以正常工作。

我想知道有没有我可以忽略这些值的方法,即非日期值被忽略并且不在过滤器中使用?目前,该错误会阻止宏继续。

这是我的代码

Dim Invoice_Start_Date As Date
Dim Invoice_End_Date As Date
Invoice_Start_Date = CDate(Worksheets("Despatch Template").Cells(17, "F").Value)
Invoice_End_Date = CDate(Worksheets("Despatch Template").Cells(17, "G").Value)
Sheets("Despatch Template").Select

MsgBox IsDate(Invoice_End_Date)
MsgBox IsDate(Invoice_Start_Date)

ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh
ActiveSheet.PivotTables("PivotTable1").PivotFields("DESPATCH 
DATE").ClearAllFilters
ActiveSheet.PivotTables("PivotTable1").PivotFields("DESPATCH 
DATE").PivotFilters.Add2 _
Type:=xlDateBetween, Value1:=CLng(Invoice_Start_Date), 
Value2:=CLng(Invoice_End_Date)

标签: excelvbapivot

解决方案


您可以在源数据中过滤"*"以查找非日期值,并使用WorksheetFunction.CountIf标准"*"来检查列中有多少。

如果它大于 1(标题),那么您可以显示一条错误消息,显示针对无效行过滤的源数据,并告诉用户修复它。

如果所有其他方法都失败,请遍历PivotItem中的每个,并手动PivotField设置值。PivotItem.Visible您可能希望确保PivotTable.ManualUpdateTrue执行此操作时,它不会尝试为字段中的每个项目重新计算数据透视表。

示例代码:

Dim pTable AS PivotTable, pItem As PivotItem

Set pTable = ActiveSheet.PivotTables("PivotTable1")

pTable.ManualUpdate = True

pTable.PivotFields("DESPATCH DATE").ClearAllFilters
For Each pItem In pTable.PivotFields("DESPATCH DATE")
    If IsDate(pItem.Value) Then
        If pItem.Value >= Invoice_Start_Date AND pItem.Value <= Invoice_End_Date Then
            pItem.Visible = True
        Else
            pItem.Visible = False
        End If
    Else
        pItem.Visible = False
    End If
Next pItem

pTable.ManualUpdate = False
pTable.Update

推荐阅读