使用通配符过滤枢轴而不进行迭代

时间:2016-04-28 22:57:12

标签: excel vba excel-vba pivot-table

我想设置报表过滤器,以便枢轴只包含使用通配符的某个单词。

Excel枢轴行(VBA中的xlRowField)可以使用PivotFilters.Add2进行过滤,例如,

ActiveSheet.PivotTables("PivotTable1").PivotFields("RowField").PivotFilters.Add2 _
Type:=xlCaptionContains, Value1:="this"

但我需要过滤报告f(VBA中的xlPageField)。我知道我可以迭代pivotitems:

For i = 1 To PivotItems.Count
    If PivotItems(i) Like "*this*" Then
            PivotItems(i).Visible = true
    else
            PivotItems(i).Visible = false
    End If
next

但我说的是一个非常大的数据集,其中迭代需要永远,而GUI过滤不会超过一秒钟:

enter image description here enter image description here

我尝试将GUI过滤记录到一个宏中,结果是Excel只记录了一个手动过滤,好像我手动去了每个项目并进行了检查。

演示数据集

----------------------------
| Name    | Class | Grade  |
----------------------------
| Joe     |   B1   | 100   |
----------------------------
| Steve   |   B2   | 80    |
----------------------------
| Rebecca |   C    | 99    |
----------------------------
| Sharon  |   D    | 78    |
----------------------------

您可以将其下载为CSV:

Name,Class,Grade
Joe,B1,100
Steve,B2,80
Rebecca,C,99
Sharon,D,78

演示Pivot

-------------------------------------
| Class | (Multiple Items) e.g. B*  | How do I do it without iteration?
-------------------------------------

---------------------------------
| Row Labels  |   Sum of Grade  |
---------------------------------
| Joe         |       100       |
---------------------------------
| Steve       |       80        |
---------------------------------
| Grand Total |       180       |
---------------------------------

1 个答案:

答案 0 :(得分:1)

也许这会更快(尽管我还没有在大型数据集上对其进行测试)。

制作名为" searchText"在某个地方的纸张上。

列出一个名为" helper"在数据集的末尾。

放下公式:

  =NOT(ISERROR(SEARCH(searchText,B2)))
帮助列中的

,其中B表示包含您要搜索的数据的列。

使用此代码:

Dim shtSearch As Worksheet
Dim shtPivot As Worksheet
Dim myPivot As PivotTable
Dim helperPF As PivotField

Set shtSearch = Sheets("Sheet1")
shtSearch.Range("searchText").Value = "b" 'put in whatever you are searching for.

Set shtPivot = Sheets("Sheet4")
Set myPivot = shtPivot.PivotTables("myPivot")
Set helperPF = myPivot.PivotFields("helper")

With helperPF
    .Orientation = xlPageField
    .Position = 1
End With

helperPF.CurrentPage = "TRUE"

myPivot.PivotCache.Refresh