【问题标题】:VBA Filter errorVBA 过滤器错误
【发布时间】:2016-05-18 15:54:50
【问题描述】:

我有一个名为 week_of_year (1,2,3,4,5,6,7,8....) 的过滤字段,另一个数据透视字段 year(2012,2013,2014),下面的 vba 代码过滤2014/2015 的当前周和年,并隐藏其他所有内容。但问题是代码循环每条记录并且在涉及大数据透视表时运行缓慢。我正在尝试新代码,但遇到了一些错误。

Sub datefilter()
Dim PvtTbl As PivotTable
Set PvtTbl = Worksheets("LO").PivotTables("PivotTable3")
Dim dd As Integer
dd = Format(Date, "ww")
Dim pf As PivotField
Dim pf1 As PivotField
Dim PI As PivotItem
Set pf =              

Worksheets("LO").PivotTables("PivotTable3").PivotFields("week_of_year")
Set pf1 =       
Worksheets("LO").PivotTables("PivotTable3").PivotFields("year")
PvtTbl.ClearAllFilters
For Each PI In pf.PivotItems
 If PI.Name = CStr(dd) Then

    PI.Visible = True
Else
    PI.Visible = False
End If
Next

For Each PI In pf1.PivotItems
 If PI.Name = "2014" Or PI.Name = "2015" Then
    PI.Visible = True
Else
    PI.Visible = False
End If
Next
End Sub

我开发的新代码是:

Sub datefilter1()
Dim PvtTbl As PivotTable
Set PvtTbl = Worksheets("LO").PivotTables("PivotTable3")
Dim dd As Integer
dd = Format(Date, "ww")
Dim pf As PivotField
Set pf =        
Worksheets("LO").PivotTables("PivotTable3").PivotFields("week_of_year")
pf.PivotFilters.Add2 xlValueEquals, 3
End Sub

代码失败

pf.PivotFilters.Add2 xlValueEquals, CStr(dd)

我也试过了:

pf.PivotFilters.Add2 Type:= xlValueEquals, Value1 := CStr(dd)

错误是无效的过程调用或参数。知道如何解决这个错误????

有更快的方法来过滤多个过滤条件吗?谢谢!

【问题讨论】:

  • 数据透视表报表过滤器的工作方式与行/列标签过滤器略有不同。不幸的是,你被循环方法卡住了。
  • 不可能......循环需要永远。我正在尝试 Currentpage 方法。有什么想法吗?
  • 斯科特是正确的。 CurrentPage 方法仅显示一个 pivotItem,而不是多个,并且不能更改为显示多个,除非使用循环方法。如果您想做一些不同的事情,也许您可​​以在数据上使用帮助列(weekRange1 对应于第 1-8 周)并使用 currentpage 选项过滤到该列。
  • pivotfilter.add 方法呢?我做错了什么?也许该方法也比循环更快? @OpiesDad
  • 根据这篇文章:stackoverflow.com/questions/764504/… 似乎无法在循环时阻止数据透视表的更新。我尝试了所有答案,但都没有奏效,并且 OP 从未将任何答案标记为答案,这表明它们也不适用于他。

标签: excel vba pivot-table


【解决方案1】:

如果您只想过滤一个值,请将感兴趣的字段拖到“报告过滤器”窗格中,然后您可以非常快速地完成此操作,而无需使用以下代码循环:

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


Set pt = Worksheets("LO").PivotTables("PivotTable3")
Set pf = pt.PivotFields("week_of_year")

pf.CurrentPage = Format(Date, "ww")
End Sub

如果由于某种原因该字段绝对必须作为行字段保留在数据透视表中,如果您有 Excel 2010 或更高版本,您仍然可以通过以下方法进行过滤而不循环

  1. 制作数据透视表的副本,然后拖动“week_of_year”字段 在复制到报告过滤器区域中
  2. 在一个数据透视表的 week_of_year 字段上设置切片器,然后 通过报表连接将其连接到另一个数据透视表 对话。 (右键单击切片器,选择“报告连接”)
  3. 修改上述代码,使其在第二个数据透视表上运行。

然后切片器将同步两个数据透视表。

如果您想过滤多个值,请将字段拖到 ROWS 区域,然后使用:

Sub FilterOnWeek2()
Dim pt As PivotTable
Dim pf As PivotField
Dim pi As PivotItem
Dim lStart As Long
Dim lEnd As Long


lEnd = Format(Date, "ww")
lStart = Val(Format(Date, "ww")) - 1

Set pt = Worksheets("LO").PivotTables("PivotTable3")
Set pf = pt.PivotFields("week_of_year")

With pf
    .ClearAllFilters
    .PivotFilters.Add Type:=xlCaptionIsBetween, Value1:=lStart, Value2:=lEnd
End With

End Sub

如果出于某种原因希望数据透视表中的该字段作为行字段,请遵循与上述相同的一般方法:制作数据透视表的副本,放置所需的字段在副本中过滤为 ROWS 字段,将感兴趣的字段连接在一起作为切片器,将切片器隐藏在某处,并修改代码,使其在包含行字段的数据透视表的副本上运行。

如果您想了解有关有效过滤数据透视表的更多信息,我建议您阅读我的文章http://dailydoseofexcel.com/archives/2013/11/14/filtering-pivots-based-on-external-ranges/

【讨论】:

  • 嗨,杰夫,我实际上从我的代码中取出了 currentpage,因为它只允许一个值,如果我想要多个项目,他们说它不起作用。如果我想要本周和前一周,你知道怎么做吗?谢谢!!
  • 见上面我修改后的答案。
  • 杰弗里谢谢,只捕获两个项目,如果我想要多个项目,只有 date ,还有字符串?有什么解决方案吗?我的数据透视表中有三个过滤器都需要编码,包括日期、值和多个项目。在这种情况下,我唯一的选择是循环每条记录吗?再次感谢!!!!!!
  • @Sailormoon 你一直在改变要求!请单击我上面文章的链接,因为这正是您所需要的。那篇文章中的代码清单很长也很复杂,但是非常非常快。根据我在dailydoseofexcel.com/archives/2015/11/17/… 的帖子,我还在开发一个可以非常快速地过滤数据透视表的商业插件,我很快就会发布它。
  • stackoverflow.com/questions/35299073/… 我创建了一个新问题,这几乎就是我需要的所有内容。如果您对此有答案,我将不胜感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多