【问题标题】:combo box to change filters on excel pivot table用于更改 excel 数据透视表上的过滤器的组合框
【发布时间】:2015-08-26 03:00:28
【问题描述】:

Excel 2013。我正在使用 3 个组合框来更改数据透视表上的过滤器。 我的第一个组合框有“Project1”、“Project2”和所有。 我的第二个组合框有“Customer1”、“Customer2”和所有。 我的第三个组合框有“Country1”、“Country2”和所有。

我正在使用 9 个数据透视表,它们都具有 [项目]、[客户]、[国家/地区] 等过滤器。

我的意图是将第一个组合框更改为 Project1,所有数据透视表过滤器都应更改为 Project1。我成功地做到了。

但是,当我将第一个组合框选择为“全部”时。第一个组合框单元格链接到 Y1。我收到 VBA 运行时错误 1004:应用程序定义或对象定义错误。

Sub ProjectName()

ActiveSheet.PivotTables("PVT1").PivotFields("Project Name").ClearAllFilters
ActiveSheet.PivotTables("PVT2").PivotFields("Project Name").ClearAllFilters
ActiveSheet.PivotTables("PVT3").PivotFields("Project Name").ClearAllFilters

    ActiveSheet.PivotTables("PVT1").PivotFields("Project Name").CurrentPage = Range("Y1").Text
    ActiveSheet.PivotTables("PVT2").PivotFields("Project Name").CurrentPage = Range("Y1").Text
    ActiveSheet.PivotTables("PVT3").PivotFields("Project Name").CurrentPage = Range("Y1").Text 

【问题讨论】:

  • 如果添加断点并逐行执行(点击F8 前进),哪一行会报错?
  • 第四行在我使用断点时出错。 ActiveSheet.PivotTables("PVT1").PivotFields("项目名称").CurrentPage = Range("Y1").Text
  • 您使用的是All 还是(All)?后者是正确的版本。
  • 我确实使用了(全部),但没有帮助。我试图创建的代码在报告过滤器中,它不是行或列过滤器。所以我使用了 9 个数据透视表,它们都有报表过滤器作为 [项目]、[客户]、[国家]。
  • 我真的很难找到问题所在。一种解决方法是用If... Then 将它们全部包围,以避免过滤器(如果它是All)。像If Range("Y1").Text <> "All" Then : 'filtering code : End If 这样的东西。组合框的图片也可能有所帮助。调试时,预期值是否通过Range("Y1").Text

标签: vba excel combobox


【解决方案1】:

由于前三行代码没有问题,我将假设数据透视表PVT1 和字段Project Name 都存在。这会将错误放在之后的某个地方。

对于.CurrentPage 的调用,您将收到 1004 错误,原因如下:

  • 使用它来尝试过滤任何未设置为Report Filter 的字段。您不能使用CurrentPage 过滤任何行或列
  • 设置可能值列表中不存在的值

关于第二点,这可能是对Range 的调用。

  • 验证该值是否存在于可能值列表中。
  • 还要注意您使用的是.Text,它将使用单元格的display 值,而不是其底层.Value

要解决这些问题,有几个选项:

  • 如果您想过滤位于行或列(而不是过滤器部分)中的数据,您可以通过PivotItems 并设置Visible = True/False
  • 您也可以根据需要从 VBA 设置标签过滤器,而不是手动过滤器
  • 如果您想检查CurrentPage 中存在的值,您可以为PivotField 迭代PivotItems 并检查是否匹配。其代码与带有检查值的For Each 循环非常相似,只是不要设置Visible

代码用于在行或列上设置过滤器

Sub FilterPivotField()

    Dim pt As PivotTable
    Set pt = ActiveSheet.PivotTables("PVT1")

    Dim pf As PivotField
    Set pf = pt.PivotFields("C")

    pf.ClearAllFilters

    'slow iterates all items and sets Visible (manual filter)
    Dim pi As PivotItem
    For Each pi In pf.PivotItems
        pi.Visible = (pi.Name = Range("J2"))
    Next

    'fast way sets a label filter
    pf.PivotFilters.Add2 Type:=xlCaptionEquals, Value1:=Range("J2")

End Sub

范围图片

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    相关资源
    最近更新 更多