Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 基于VBA的多条件过滤_Excel_Vba_Pivot Table - Fatal编程技术网

Excel 基于VBA的多条件过滤

Excel 基于VBA的多条件过滤,excel,vba,pivot-table,Excel,Vba,Pivot Table,我在数据透视表上有四个过滤器,一年中的一周(1,2至52),日期(2012年1月1日至2016年2月7日),年份(2012年至2016年),城市(纽约至旧金山) 这是可行的,但需要永远运行,因为它循环每个记录。试着找到一个更有效的方法来做这件事。任何人都可以使用currentpage或pivotfield.add实现相同的功能?欣赏非常感谢 特殊要求:透视表链接到数据库。因此,当新日期闪烁时,需要从过滤器中选择更多日期。例如,如果2/9/16进入,还需要选择数据,您可以先对原始数据做更多的工作。

我在数据透视表上有四个过滤器,一年中的一周(1,2至52),日期(2012年1月1日至2016年2月7日),年份(2012年至2016年),城市(纽约至旧金山)

这是可行的,但需要永远运行,因为它循环每个记录。试着找到一个更有效的方法来做这件事。任何人都可以使用currentpage或pivotfield.add实现相同的功能?欣赏非常感谢


特殊要求:透视表链接到数据库。因此,当新日期闪烁时,需要从过滤器中选择更多日期。例如,如果2/9/16进入,还需要选择数据,您可以先对原始数据做更多的工作。听起来您只需要具有几个设置条件的数据

因此,您可以编写VBA,将嵌套的if语句放入具有以下逻辑的新列中:


=如果(或(“您的领域”=2014,“您的领域”=2014),“是”,如果(“您的领域”=7,“是”,“否”))

然后按此新公式列中等于“是”的所有内容进行过滤,然后将透视过滤器减少为一个开关


如果它是一个较大的数据集,并且您不希望公式占用内存,那么您也可以使用For循环来实现相同的效果。实际上,这是我首选的方法。

最有效的解决方案是在底层数据库中设置一个带有动态过程的存储过程,这样可以在数据库端过滤数据。然后,SP可以在电子表格中绘制列表。看

如果这是不可能的,我的文章在有代码,将做你想要的,因为我已经概述了在

阅读该线程,您将了解如何大幅减少循环数据透视项并更改其状态所需的时间


另外,请注意,在遍历数据透视项之前,您需要设置PT。ManualUpdate在进行更改时将其设置为TRUE,然后将其设置为FALSE,以避免每次更改后都刷新数据透视表。

是否建议在“我的数据库链接”顶部插入另一列?还是有点慢。顺便问一下,我如何使用循环??谢谢你的回复
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