2017-06-20 239 views
1

我有一个数据透视表,手动创建。用户需要能够对其进行过滤的方式不能通过报告过滤器或切片器来完成,所以我认为VBA将是一条可行的路。我已经构建了一个骨架用户表单,现在处于编写代码的棘手阶段。使用VBA用户窗体过滤数据透视表(特别是报表过滤器和切片器不能)

我在尝试使用PivotFilters函数,但这不起作用。我承认我在VBA是一个全新的新手,所以这可能是我犯的一个简单错误,或者PivotFilters可能不适合这项工作?这里有一个例子:

'ok button - this is the big one, telling the button what to do with the selected options! 

Private Sub CommandButton1_Click() 

'targeting our familiar pivot table 

Dim pvt As PivotTable 
Set pvt = ActiveSheet.PivotTables("PivotTable1") 

'Whether to filter out low sample size brands 
Dim pvtFieldSasz As PivotField 
Set pvtFieldSasz = pvt.PivotFields("SampleSize") 

If OptionButton1 = True Then 

pvt.pvtFieldSasz.PivotFilters.ClearAllFilters 
pvt.pvtFieldSasz.PivotFilters.Add2 Type:=xlCaptionEquals, Value1:="Reliable Sample" 

End If 





End 

上面的例子东西,可以用报告过滤器或切片器来完成,但我希望把所有的相关选项在用户的形式,使之成为一站式为用户的商店。

我得到的错误信息是“运行时错误'438':对象不支持属性或方法”。

我还没有转移到棘手的问题上,因为我想掌握基础知识。作为我想在不同过滤器中实现的示例:

根据用户选择的选项,过滤器将引用三个单独列中的一个。用户将有三个选项按钮,其中他们一次只能选择一个。如果他们选择OptionButton1,我希望数据透视表在字段X = 1上过滤。如果他们选择OptionButton2,它应该在字段Y = 1上过滤。OptionButton3对应于字段Z = 1。这些字段X,Y或Z实际上将作为行或列显示在数据透视表中,但它们是源数据的一部分,并且包含在数据透视表后面的选择中。

谢谢你的耐心帮助这个磕磕绊绊的新手 - 非常感谢任何提示!

+0

编辑追加错误信息 –

+0

我找到了你的问题并且正在写答案,但是将来你应该在错误信息发生的地方添加错误信息。 – OpiesDad

+0

好点,会做 - 谢谢。 –

回答

1

的问题是在这些2行:

pvt.pvtFieldSasz.PivotFilters.ClearAllFilters 
pvt.pvtFieldSasz.PivotFilters.Add2 Type:=xlCaptionEquals, Value1:="Reliable Sample" 

首先,pvtFieldSasz已经表示枢轴字段。尝试使用pvt.pvtFieldSasz指定它将不起作用,因为pvtFieldSasz不是数据透视表的属性或方法,pvt。相反,您应该只使用pvtFieldSasz。这在接下来的陈述中也是一个问题。

其次,ClearAllFilters方法不适用于pivotField的PivotFilters属性。相反,它适用于pivotField本身。

结合这两个问题的工作代码:

pvtFieldSasz.ClearAllFilters 
pvtFieldSasz.PivotFilters.Add2 Type:=xlCaptionEquals, Value1:="Reliable Sample" 

一点题外话,我还指定的,而不是使用ActiveSheetActiveSheet可以有问题的板材,所以

Set pvt = Sheets("Sheet1").PivotTables("PivotTable1") 
+0

谢谢你的帮助 - 遵循你的建议已经消除了错误消息,欢呼!但是,提交我的用户窗体并不实际过滤数据透视表。我想知道这是否是因为我试图过滤的字段不是数据透视图中的行,但是微软的文档似乎认为即使是“隐藏的”字段(即不用作“行,列,页面或数据”字段)属于PivotFields集合。我已经检查过我给出的字段名称和值是否有效,它们看起来是有效的,所以我有点卡住了...... –

+0

除了上面我的评论,我已经将我的新问题发布到Excel论坛,它看起来像PivotFilters实际上不在数据透视表中显示的字段上工作。耻辱。 https://www.mrexcel.com/forum/excel-questions/1010679-visual-basic-applications-pivotfilters-no-effect-pivot-table-puzzled.html#post4851382 –

+1

我会问一个关于这个新问题,如果你需要别的帮助。但是,如果您想实现这一目标,我会在数据集中推荐一个“帮手”列。使按钮更改一个隐藏的单元格为某个值,因此OptionButton1将另一个工作表中的单元格A1更改为“X”。然后在你的数据的“帮助者”列中做一些事情,比如'IF(Helper!$ A $ 1 =“X”,IF(FieldXColumn2 =“1”,1,0),IF(Helper!$ A $ 1 =“Y “,IF(FieldYColumn2 =”1“,1,0),....))'然后在你的”助手“列中过滤数据透视表。设置隐藏单元后刷新数据透视表。 – OpiesDad