【问题标题】:Filtering Pivot Table Items by Referencing Cell String Values通过引用单元格字符串值过滤数据透视表项
【发布时间】:2017-08-28 13:26:13
【问题描述】:

我正在尝试使用来自多个单元格的字符串值过滤数据透视表,这些单元格存储在数组变量 LTmonth() 中。但是,当我将此数组变量插入下面的代码时,由于某种原因它不会读取数组值,也不会过滤存储在该数组中的值。

我注意到一件事,当我将 LTmonth 更改为过滤器的实际值时,如下所示,代码完美运行:

"如果 ActiveSheet.PivotTables("PivotTable1").PivotFields("MONTH").PivotItems(j) = "JAN-2016" 那么"

鉴于单元格值与数据透视表中的筛选项完全匹配,如何使这两个值相互匹配?我到处寻找答案,但我找到的答案并没有帮助解决我的问题。这是我使代码工作最接近的方法,但我不确定为什么变量数组不起作用。

Sub Filter()

    Dim i, j, z, monthcount As Integer
    monthcount = 8

    Dim LTmonth() As String
    ReDim LTmonth(monthcount)

    For i = 1 To monthcount
        LTmonth(i) = ActiveSheet.Range("P2").Offset(i - 1, 0).Value
    Next i


    For j = 1 To ActiveSheet.PivotTables("PivotTable1").PivotFields("MONTH").PivotItems.Count
        For z = 1 To monthcount
            If ActiveSheet.PivotTables("PivotTable1").PivotFields("MONTH").PivotItems(j) = LTmonth(z) Then
                ActiveSheet.PivotTables("PivotTable1").PivotFields("MONTH").PivotItems(j).Visible = True
            Else
                ActiveSheet.PivotTables("PivotTable1").PivotFields("MONTH").PivotItems(j).Visible = False
            End If
        Next z
    Next j


End Sub

【问题讨论】:

  • 使用F8 调试代码以查看数组中的内容。并比较两个字符串使用InStr
  • 如何比较过滤项的字符串值?我认为可能是这种情况,因为过滤器中日期的格式可能与项目的实际格式不同。

标签: arrays excel vba filter pivot-table


【解决方案1】:

看看这是否能达到你想要达到的效果。

Sub Filter()
    Dim pt As PivotTable
    Dim pf As PivotField

    Dim i, j, z, monthcount As Integer
    monthcount = 8

    Dim LTMonth() As String
    ReDim LTMonth(monthcount)

    For i = 1 To monthcount
        LTMonth(i) = Format(ActiveSheet.Range("P2").Offset(i - 1, 0).Value, "mmm-yyyy")
    Next i

    Set pt = ActiveSheet.PivotTables("PivotTable1")
    Set pf = pt.PivotFields("Month")
    pf.ClearAllFilters
    For j = 1 To pf.PivotItems.Count
        For z = 1 To monthcount
            If ActiveSheet.PivotTables("PivotTable1").PivotFields("MONTH").PivotItems(j) = LTMonth(z) Then
                ActiveSheet.PivotTables("PivotTable1").PivotFields("MONTH").PivotItems(j).Visible = True
                Exit For
            End If
        Next z
    Next j
End Sub

【讨论】:

  • 感谢您的快速回复。但是,过滤器项目采用大写格式(例如 JAN-2016),所以我不确定您添加的格式语句是否有效。引用的单元格已经使用“=UPPER(TEXT(A4,"MMM-YYYY))”更正了这种大写。此外,我无法使用 ClearAllFilters 语句,因为下面还有另一个数据透视表,因此并非所有过滤器都将是能够检查,因为它们会重叠。我试图通过检查和取消选中单元格中引用的过滤器值来规避这个问题。
  • 所以我刚刚发现我的同事在数据透视表(而不是原始数据)中过滤原始数据透视过滤器名称后将其更改为“MMM-YYYY”格式。所以原本过滤项是用 2015 年 1 月 1 日的格式写的,但他会去把过滤项重命名为 JAN-2015。过滤器项目将读取“JAN-2015”而不是“1/1/2015”。如果有的话,这将如何改变事情?
  • 在这种情况下尝试 LTMonth(i) = UCase(Format(ActiveSheet.Range("P2").Offset(i - 1, 0).Value, "mmm-yyyy")) 并查看如果这对你有用。
  • 感谢您的代码,但它不起作用。我在代码中看到,当重命名数据透视项时,它会生成以下代码: [ActiveSheet.PivotTables("PivotTable1").PivotFields("MONTH").PivotItems( _ "3/1/2015").Caption = “2015 年 3 月”]。我看到使用了函数“.Caption”。不确定这是否有帮助...
  • 然后试试 If ActiveSheet.PivotTables("PivotTable1").PivotFields("MONTH").PivotItems(j).Caption = LTMonth(z) Then
猜你喜欢
  • 1970-01-01
  • 2017-07-04
  • 2013-10-08
  • 2021-12-19
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
相关资源
最近更新 更多