【问题标题】:Pivot Table Label Filter Is Applied But Data Does Not Actually Filter应用了数据透视表标签过滤器,但实际上并未过滤数据
【发布时间】:2020-01-18 17:46:34
【问题描述】:

我有一个数据透视表,我试图通过 VBA 向其中添加标签过滤器(在单个列上)。

我当前的代码是:

Sub Filter__Pivot()

Application.ScreenUpdating = False

 Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales"). _
    ClearAllFilters

 Worksheets("Summary").PivotTables("Pivot1").PivotSelect _
    "Sales[All]", xlLabelOnly, True


 Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales"). _
    PivotFilters.Add2 Type:=xlCaptionIsNotBetween, Value1:="-10", Value2:= _
    "10"

Application.ScreenUpdating = True

End Sub

代码运行没有错误,并且枢轴具有正在应用的过滤器的外观。我的意思是在我想要的枢轴列上有一个典型的过滤器图标。单击此标题图标显示已应用标签过滤器,当我单击过滤器本身时:过滤器在标题->标签过滤器->不在之间......我看到 -10 和 10 在值字段。问题是数据透视表中的实际数据没有反映过滤器 - 它尚未应用(即 -10 和 10 之间的值仍然可见)。

我尝试了宏录制并且我的语法匹配。我也尝试在放置过滤器后使用Worksheets("Summary").PivotTables("Pivot1").PivotCache.Refresh,但这没有帮助。

奇怪的是,如果我通过 VBA 应用过滤器,然后如上所述单击通过,当我在“非介于”过滤器上看到 -10 和 10 时单击“确定”时,过滤器就会激活并且数据透视表中的数据反映了过滤器。

实质上,我的过滤器被放置在数据透视表上,但它没有“执行”,并且数据透视表数据没有反映在其上似乎处于活动状态的过滤器。

谢谢大家!

更新:

我创建了以下代码:

 With Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales")
    For i = 1 To .PivotItems.count
        If i > -10 And i < 10 Then
            .PivotItems(i).Visible = False
        Else
            .PivotItems(i).Visible = True
        End If
    Next i
End With

这不是根据我的数据透视表的销售列中的值进行评估和过滤,但它确实会移动/过滤表中的数据。有没有办法调整这种方法并循环或遍历每个枢轴线并根据销售列中的值更改.Visibility

这将是完全使用过滤器的一种解决方法,但可能会达到我的需要。

谢谢!

【问题讨论】:

  • 奇怪的是枢轴缓存更新没有解决这个问题。出于好奇,在宏末尾添加ThisWorkbook.RefreshAll 有什么效果吗?
  • @ChrisB 我试过了 - 它产生了相同的“应用过滤器”,但表中没有实际的数据过滤。

标签: excel vba pivot-table


【解决方案1】:

这已经很老了,但是我遇到了同样的问题,终于弄明白了。这让我发疯了,因为 Excel 应用了过滤器,如果您只是查看过滤器并单击“确定”,它会很好地应用。

这是一个数据类型问题——我假设 VBA 可以处理字符串>整数转换,但 C# 不能,它只是吞下错误,但 Excel 前端会在您查看它时对其进行转换,然后应用正确的单击“确定”时过滤器中的数据类型。

如果您将字符串更改为整数,则从以下开始:

 Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales"). _
PivotFilters.Add2 Type:=xlCaptionIsNotBetween, Value1:="-10", Value2:= _
"10"

到这里:

 Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales"). _
PivotFilters.Add2 Type:=xlCaptionIsNotBetween, Value1:=-10, Value2:= _
10

那么它应该可以工作,至少在我遇到的情况下它可以工作。

【讨论】:

    【解决方案2】:

    我从来没有能够实现一个解决方案,该解决方案可以按最初的预期解决数据透视表或标签过滤器。我的解决方法是避免数据透视表本身,并根据我在原始问题中概述的标准隐藏行(在 -10 到 10 之间隐藏)。这可能对其他人不起作用,当然也不是最干净的解决方案,但根据我的需要,下面的代码有效:

    Sub Filter_Summary_Pivot()
    Application.ScreenUpdating = False
    
        Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales"). _
        ClearAllFilters
    
     Worksheets("Summary").PivotTables("Pivot1").PivotSelect _
        "Sales[All]", xlLabelOnly, True
    
    'workaround to pivot filters not actioning data - hides rows based on "isbetween" logic of values in Sales Column
    
    Dim lastrow As Long
    lastrow = Worksheets("Summary").Range("C" & Rows.Count).End(xlUp).Row
    
    BeginRow = 5
      EndRow = lastrow
      ChkCol = 6
    
    For RowCnt = BeginRow To EndRow
        If Worksheets("Summary").Cells(RowCnt, ChkCol).Value > -10 And Worksheets("Summary").Cells(RowCnt, ChkCol).Value < 10 Then
            Worksheets("Summary").Cells(RowCnt, ChkCol).EntireRow.Hidden = True
        End If
    Next RowCnt
    
    'secondary "filter" to remove "(Blank)" values in Sales column of pivot
    
    BeginRow = 5
      EndRow = lastrow
      ChkCol = 6
    
    For RowCnt = BeginRow To EndRow
        If Worksheets("Summary").Cells(RowCnt, ChkCol).Value = "(blank)" Then
            Worksheets("Summary").Cells(RowCnt, ChkCol).EntireRow.Hidden = True
        End If
    Next RowCnt
    
    
    Application.ScreenUpdating = True
    
    End Sub
    

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-13
      • 2021-11-11
      • 1970-01-01
      • 2019-09-17
      • 2014-07-22
      • 2020-05-08
      • 1970-01-01
      • 2018-03-31
      相关资源
      最近更新 更多