用于更改Excel数据透视表

时间:2015-06-10 17:35:11

标签: vba excel-vba combobox excel

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

我正在使用9个数据透视表,它们都有[Project],[Customer],[Country]的过滤器。

我的目的是将第一个组合框更改为Project1&所有数据透视表过滤器应该更改为Project1.I我成功地能够做到这一点。

但是当我选择第一个组合框为“全部”时。第一个组合框单元链接到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 

1 个答案:

答案 0 :(得分:0)

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

对于.CurrentPage的来电,您会收到1004错误,原因如下:

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

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

  • 验证可能的列表中是否存在该值。
  • 另请注意,您使用.Text将使用单元格的 display 值,而不是其基础.Value

要解决这些问题,可以选择以下几种方法:

  • 如果您要过滤行或列上的数据(而不是过滤器部分),您可以浏览PivotItems并设置Visible = True/False
  • 如果需要,也可以从VBA设置标签过滤器,而不是手动过滤器
  • 如果您想检查CurrentPage中存在的值,您可以为该PivotItems重复PivotField并检查其匹配情况。该代码与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

范围图片

enter image description here