VBA用于在多个值过滤器上过滤数据透视表 - 是否可以?

时间:2017-06-22 11:14:18

标签: excel vba excel-vba filter pivot-table

我有一个数据透视表,我创建了一个UserForm,允许用户选择某些过滤选项。我想根据链接到列的各种条件过滤行,具体取决于用户输入。但是,我似乎无法过滤多个值过滤器上的行。这似乎也不可能来自前端,但我仍然希望VBA能找到方法。

这是相关代码(在UserForm的OK按钮后面)开始的方式:

'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 = Sheets("Summary").PivotTables("PivotTable1")

'allowing multiple filters to be used at once
pvt.AllowMultipleFilters = True

'and identifying the row that we want to filter - n.b. this would need to change if corporate wanted to use another field as their lowest level row.
Dim pvtFieldBrand As PivotField
Set pvtFieldBrand = pvt.PivotFields("final brand")

'clearing any filters already set
pvtFieldBrand.ClearAllFilters  

然后过滤器。
这个工作是孤立的:

'Filtering depending on whether 1+, 2+ or all 3 audiences favour it

Dim pvtFieldNoAud As PivotField 'then hide the column - at the top of this script, in fact, just in case it's not already hidden
Set pvtFieldNoAud = pvt.PivotFields("Sum of # Audiences")


If OptionButton3 = True Then
pvtFieldBrand.PivotFilters.Add2 Type:=xlValueIsBetween, DataField:=pvtFieldNoAud, Value1:=1, Value2:=3

End If

If OptionButton4 = True Then
pvtFieldBrand.PivotFilters.Add2 Type:=xlValueIsBetween, DataField:=pvtFieldNoAud, Value1:=2, Value2:=3

End If

If OptionButton5 = True Then
pvtFieldBrand.PivotFilters.Add2 Type:=xlValueEquals, DataField:=pvtFieldNoAud, Value1:=3

End If

然后是这些过滤器,我打算将它们作为多选项,但它们只能完全隔离 - 不能相互组合,也不能与其他任何过滤器结合使用:

'Only show if favoured by the selected audiences

Dim pvtFieldWW As PivotField
Set pvtFieldWW = pvt.PivotFields("Sum of WW overindex?")

Dim pvtFieldUU As PivotField
Set pvtFieldUU = pvt.PivotFields("Sum of UU overindex?")

Dim pvtFieldRR As PivotField
Set pvtFieldRR = pvt.PivotFields("Sum of RR overindex?")


If CheckBox1 = True Then
pvtFieldBrand.PivotFilters.Add2 Type:=xlValueIsGreaterThan, DataField:=pvtFieldWW, Value1:=0
End If

If CheckBox2 = True Then
pvtFieldBrand.PivotFilters.Add2 Type:=xlValueIsGreaterThan, DataField:=pvtFieldUU, Value1:=0
End If

If CheckBox3 = True Then
pvtFieldBrand.PivotFilters.Add2 Type:=xlValueIsGreaterThan, DataField:=pvtFieldRR, Value1:=0
End If

等等。

我需要用户能够以最多6种方式过滤此数据透视表。它可能是从前端的Slicers和Report Filters完成的,但我想限制用户的选项和用户错误的可能性,所以我计划在UserForm中保留所有相关选项,然后锁定一些功能,以便它们不能对数据透视表进行任何其他更改。任何想法都非常感激!

1 个答案:

答案 0 :(得分:0)

有一个简单的解决方法,使您可以在数据透视表上使用多个过滤器。这是您可以使用的逐步方法。

第1步::将Helper Columns添加到数据源中,并带有新的标题以及每行中的任何常量值。 (每个额外的过滤器需要一个辅助列。如果要使用3个过滤器,则需要两个辅助列) enter image description here

步骤2:将Helpercolumn属性添加到数据透视表的行字段中。 enter image description here

步骤3:选择所有行属性都在一行中的表格布局。 enter image description here

步骤4:现在,您可以应用不同的过滤器,在行字段中为每个属性应用一个。这将产生与将多个过滤器用于“标题1”相同的结果。

第5步::如果现在将其应用于VBA,则代码可能如下所示:

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

ActiveSheet.PivotTables("PivotTable1").AllowMultipleFilters = True

With pvt.PivotFields("Heading 1")
    .ClearAllFilters
    .PivotFilters.Add2 Type:=xlValueIsGreaterThan, DataField:=ActiveSheet.PivotTables("PivotTable1").PivotFields("Sum of Heading 2"), Value1:=2
End With
With pvt.PivotFields("Help 1")
    .ClearAllFilters
    .PivotFilters.Add2 Type:=xlValueIsSmallerThan, DataField:=ActiveSheet.PivotTables("PivotTable1").PivotFields("Sum of Heading 2"), Value1:=11
End With
With pvt.PivotFields("Help 2")
    .ClearAllFilters
    .PivotFilters.Add2 Type:=xlValueIsGreaterThan, DataField:=ActiveSheet.PivotTables("PivotTable1").PivotFields("Sum of Heading 3"), Value1:=4
End With