我在数据透视表上有四个过滤器,week_of_year(1,2到52),日期(2012年1月1日到2016年2月7日),年(2012年到2016年),城市(newyork到san fransisco)
Sub datefilter()
Dim PvtTbl As PivotTable
Set PvtTbl = Worksheets("test").PivotTables("PivotTable3")
Dim pf As PivotField
Dim pf1 As PivotField
Dim PI As PivotItem
Set pf =
Worksheets("test").PivotTables("PivotTable3").PivotFields("week_of_year")
Set pf1 =
Worksheets("test").PivotTables("PivotTable3").PivotFields("year")
Set pf2 =
Worksheets("test").PivotTables("PivotTable3").PivotFields("Date")
Set pf3 =
Worksheets("test").PivotTables("PivotTable3").PivotFields("city")
PvtTbl.ClearAllFilters
For Each PI In pf.PivotItems
If PI.Name = "7" 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
''Same for the Date,city, have multiple items selected as filter.
End Sub
这可行,但需要永远运行,因为它循环每条记录。尝试找到一种更有效的方法。任何人都可以使用currentpage或pivotfield.add来实现同样的目的吗?感谢!!!感谢一帮!
特殊要求:数据透视表已链接到数据库。因此,当新日期闪烁时,需要从过滤器中选择更多日期。例如,如果2/9/16进入,还需要选择数据< = 2/9/15并且仅选择2015年的数据,忽略2012,2013,2014。循环每条记录太麻烦,需要永远运行。
答案 0 :(得分:0)
您可以先对原始数据进行更多的工作。听起来你只想要一些条件下的数据。
因此,您可以使用以下逻辑编写将nested-if语句删除到新列的VBA:
=if(or("YOUR FIELD"=2014, "YOUR FIELD"=2014),"Yes",if("YOUR FIELD"=7,"Yes","No"))
然后按照此新公式列中的所有内容进行过滤,等于"是",并将枢轴过滤器缩减为一个开关。
如果它是一个更大的数据集并且您不希望公式占用您的记忆,您也可以使用For循环来实现相同的效果。这实际上是我的首选方法。
答案 1 :(得分:0)
最有效的解决方案是在底层数据库中使用动态过程设置存储过程,以便在数据库端过滤数据。然后,该SP可以在电子表格中的列表上绘制。见http://datapigtechnologies.com/blog/index.php/running-a-sql-stored-procedure-from-excel-with-dynamic-parameters/
如果无法做到这一点,我在http://dailydoseofexcel.com/archives/2013/11/14/filtering-pivots-based-on-external-ranges/的文章中的代码会按您的要求执行,正如我在your other thread on this topic已经概述的那样
阅读该主题,您将学习如何大幅减少循环PivotItem并更改其状态所需的时间。
另请注意,在遍历PivotItems之前,您需要设置PT。 .ManualUubate在您进行更改时更新为TRUE,之后将其设置为FALSE以避免在每次更改后刷新数据透视表。