基于数据透视表过滤动态更新切片器选择

时间:2019-07-13 05:58:07

标签: excel vba pivot-table

我有3个使用相同源数据的数据透视表。我有按月预算和实际数字(3列-月,预算,实际)。

我为月份创建了一个切片器,并且只想显示具有实际数字的月份(例如1月至6月)。现在,它显示了所有月份,因为存在全年的预算数字。如何使用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属性   数据透视表类

1 个答案:

答案 0 :(得分:0)

我想,您将“月”作为行字段并将“实际总和”(重命名为“实际”)作为数据字段。

如果已对值进行过滤,则会出现错误,因此需要先清除过滤器。

通过以下代码,您可以在切片器中打开/关闭月份名称的可见性:

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

备注,如果要在切片器中完全隐藏月份的名称,

只要您还拥有“预算作为数据”字段(例如“预算总和”),就无法在切片器中完全隐藏月份名称:

  • 您可以打开/关闭各个月份的可见性,
    但切片器仍显示所有月份(已标记或未标记)
  • 您可以使用日期过滤器来减少数据透视表行,
    但切片器仍显示所有月份
  • 您可以使用值过滤器,例如。 G。 “ Actuals”> 0,
    但切片器仍显示所有月份

仅如果您将“预算”显示为第二行字段(这将是无用的,因为您看不到汇总预算),则可以编辑切片器的设置并禁用“隐藏无数据的项目”。然后,切片器将显示减少的月份名称列表。