excel - 由于非日期值过滤数据透视表 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)
解决方案
您可以在源数据中过滤"*"
以查找非日期值,并使用WorksheetFunction.CountIf
标准"*"
来检查列中有多少。
如果它大于 1(标题),那么您可以显示一条错误消息,显示针对无效行过滤的源数据,并告诉用户修复它。
如果所有其他方法都失败,请遍历PivotItem
中的每个,并手动PivotField
设置值。PivotItem.Visible
您可能希望确保PivotTable.ManualUpdate
在True
执行此操作时,它不会尝试为字段中的每个项目重新计算数据透视表。
示例代码:
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
推荐阅读
- android - ImageView 中的图像显示非常模糊
- html - 如何使单击按钮的效果为 0.5 秒?
- android - FDSQLiteBackup Sqlite 无法打开数据库
- charts - 以时间为轴的 Google Visualization SteppedAreaChart 未正确对齐
- linux - Ansible:“URL 不能包含控制字符”
- javascript - 如何知道输入中的最后一个字符 - Javascript
- javascript - D3:如何使用点击文本的更新模式?
- python - BS4:删除标签
- debugging - 在连接的 Android 模拟器上运行调试应用程序需要很长时间,在 Visual Studio 上需要超过 10 分钟
- linux - QApplication 后清理