【问题标题】:Update pivot tables with filters using VBA使用 VBA 使用过滤器更新数据透视表
【发布时间】:2017-04-02 18:19:36
【问题描述】:

到目前为止,我还没有将 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.做一个测试 2. 可能是的,使用 DLookup() 作为一个选项 3. With 可以嵌套,但看不到你为什么会在这段代码中。

标签: vba excel pivot-table


【解决方案1】:
  1. 因为您正在处理 PageField(即“过滤器”窗格中的字段并且未选中“选择多个项目”),所以不,我认为您不需要清除过滤器。但我的建议……把它留在那儿……不会有任何伤害的。
  2. 如果项目不存在,只需在代码中进行某种错误处理以找出任何错误,这样就更容易了。如果您只是想忽略任何错误,请将 On Error Resume Next 语句放在代码块的顶部。或者,您可能希望告知用户数​​据透视表尚未被过滤。如果你澄清你想做什么,我会发布一个代码sn-p。
  3. 请注意,如果这两个数据透视表共享相同的数据源,则无需刷新两个缓存,因为它们共享一个缓存。如果是这种情况,那么只需去掉 2nd Refresh 行。
  4. 您能解释一下为什么要隐藏该列吗?以后会不会隐藏?每当您运行此代码时,它是否可能被取消隐藏?
  5. 如果这就是您的代码所做的全部,那么我可能不会费心关闭屏幕更新。但同样,这并不重要。

【讨论】:

  • 非常感谢,杰弗里 - 这太棒了! :)(这只是我代码的一小部分,但我之前已经完成了其余部分,所以只想检查一下。)
  • 您几乎回答了我所有的问题,第 3 项是一件很值得了解的事情(它们确实共享相同的来源)。我唯一不确定的是错误处理。在我的情况下,这将在每个星期一被前一个日历周过滤,所以我想在这里介绍的唯一情况是显示一个消息框,以防没有与该特定周数相关的数据。我正在考虑类似 On Error GoTo ErrMsg 之类的东西,但我不知道如何解决这个特定错误。
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 2012-06-19
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多