excel - 基于数据透视表过滤动态更新切片器选择
问题描述
我有 3 个使用相同源数据的数据透视表。我有按月计算的预算和实际数字(3 列 - 月、预算、实际)。
我为月份创建了一个切片器,只想显示具有实际数字的月份(例如一月到六月)。现在,它显示所有月份,因为全年都有预算数字。如何使用 VBA 代码实现这一点?
作为第一步,我在数据透视表上尝试了一个值过滤器,但我收到了一个错误。我的计划是首先过滤实际不等于零月份的数据透视表,然后将月份的选择应用于切片器。
Sub filtermonth()
'
' filtermonth Macro
'
ActiveSheet.PivotTables("PivotTable4").PivotFields("Month").PivotFilters.Add2 _
Type:=xlValueDoesNotEqual, DataField:=ActiveSheet.PivotTables("PivotTable4" _
).PivotFields("Actuals"), Value1:=0
End Sub
运行此程序时出现以下错误
运行时错误 1004:无法获取数据透视表类的 PivotFields 属性
解决方案
我猜,您将“月份”作为行字段,将“实际总和”(重命名为“实际值”)作为数据字段。
如果值已被过滤,则会出现错误,因此您需要先清除过滤器。
通过以下代码,您可以在切片器中打开/关闭月份名称的可见性:
Sub HideUnnecessaryMonths()
Dim pt As PivotTable
Dim pfMonth As PivotField, pfActuals As PivotField
Dim r As Range
Dim i As Long
Set pt = ActiveSheet.PivotTables("PivotTable4")
Set pfMonth = pt.PivotFields("Month")
Set pfActuals = pt.PivotFields("Actuals")
pfMonth.ClearAllFilters
pfMonth.PivotFilters.Add2 _
Type:=xlValueDoesNotEqual, _
DataField:=pfActuals, _
Value1:=0
For i = 1 To 12 ' each month
On Error Resume Next
Set r = pt.GetPivotData("Actuals", pfMonth.Name, i)
If Err.Number <> 0 Then
On Error GoTo 0
pfMonth.PivotItems(i + 1).Visible = False
End If
On Error GoTo 0
Next i
End Sub
备注,如果要在切片器中完全隐藏月份名称:
只要您也将预算作为数据字段(例如“预算总和”),您就不能在切片器中完全隐藏月份名称:
- 您可以打开/关闭各个月份的可见性,
但切片器仍会显示所有月份(标记或不标记) - 您可以使用日期过滤器来减少数据透视行,
但切片器仍会显示所有月份 - 您可以使用值过滤器,例如“Actuals”> 0,
但切片器仍显示所有月份
只有当您将“预算”显示为第二行字段(这将是无用的,因为您看不到汇总预算)时,您才能编辑切片器的设置并禁用“隐藏没有数据的项目”。然后你的切片器会显示一个减少的月份名称列表。
推荐阅读
- reactjs - 如何使用反应路由器dom显示嵌套组件?
- netsuite - DocuSign 和 NetSuite webhook 事件通知认证
- jquery - jquery css on change properties接收滚动条
- java - 如何从java中具有多个实现的接口获取类名
- javascript - 更改过滤数组中的布尔值
- ruby-on-rails - Capybara 没有使用 js 启动自己的服务器:true
- node.js - 在 Jenkinsfile 中从 yarn 运行 jest 从一个分支获取“jest: not found”,从另一个分支获取成功
- java - 如何让 webapp 在 Travis CI 上运行?
- selenium-webdriver - 为什么 WebDriver 不编辑合流页面?
- corda - 如何确保 Corda 流中的所有事务/子流都已完成?