使用VBA更新包含过滤器的数据透视表

时间:2017-04-02 18:19:37

标签: vba excel-vba pivot-table excel

到目前为止,我还没有将VBA与数据透视表一起使用。现在我想更新(刷新)2个数据透视表,并将日历周的过滤器设置为最后一整周。

我的问题/问题是:

1)我是否真的需要.ClearAllFilters行,或者我可以在没有它的情况下设置过滤器吗? 2)如果相应的项目(例如周数13)存在于我的表格中,我可以在设置过滤器之前进行检查吗?否则我会尝试过滤不存在​​的东西(尚) 3)我是否以正确的方式编写代码或者是否有更短/更好的方法?例如。我不确定With中的With在这里是否有意义。

我的代码:

Dim varLastSunday As Date, varWeekNumber As Integer

varLastSunday = Date - Weekday(Date, vbUseSystemDayOfWeek)
varWeekNumber = CLng(Format(varLastSunday, "ww"))

Application.ScreenUpdating = False
With Worksheets(4)
    .Range("StartColumns").EntireColumn.Hidden = False
    .PivotTables("PivotTable9").PivotCache.Refresh
    .PivotTables("PivotTable9").PivotFields("WEEK_NUMBER").ClearAllFilters
    .PivotTables("PivotTable9").PivotFields("WEEK_NUMBER").CurrentPage = varWeekNumber
    .PivotTables("PivotTable10").PivotCache.Refresh
    .PivotTables("PivotTable10").PivotFields("week").ClearAllFilters
    .PivotTables("PivotTable10").PivotFields("week").CurrentPage = varWeekNumber
End With
Application.ScreenUpdating = True

1 个答案:

答案 0 :(得分:1)

  1. 因为您正在处理PageField(即“过滤器”窗格中的某个字段,其中包含“#34;选择多个项目"未选中”)因此,我不相信您需要清除过滤器。但是我的建议......就把它留在那里......它不会受到伤害。
  2. 如果项目不存在,只需简单地在代码中加入某种错误处理来获取任何错误。如果您只是想忽略任何错误,请在代码块的顶部放置On Error Resume Next语句。或者,您可能想要告知用户数​​据透视表尚未过滤。如果您澄清了您想要做的事情,我会发布一个代码段。
  3. 请注意,如果这两个pivottables共享相同的数据源,则不需要刷新两个缓存,因为它们共享一个缓存。如果是这样的话,那就去掉第二条刷新线。
  4. 你能说清楚为什么要隐藏这个专栏吗?以后会不会被隐藏?是否可以在运行此代码时取消隐藏?
  5. 如果这是您的所有代码所做的,那么我可能不会打扰关闭屏幕更新。但同样,它并不重要。