使用VBA在数据透视表中使用特定文本筛选项目

我一直在试图构build一个代码来过滤包含特定文本片段的数据透视表中的所有项目。 我最初设想我可以使用星号(*)来表示我的文本之前或之后的任何string,但是VBA会将其作为字符来读取。 这是在Userform列表框中显示数据透视表数组所必需的。 看看我试过了:

Sub FilterCstomers() Dim f As String: f = InputBox("Type the text you want to filter:") With Sheets("Customers Pivot").PivotTables("Customers_PivotTable") .ClearAllFilters .PivotFields("Concatenation for filtering").CurrentPage = "*f*" End With End Sub 

尝试使用下面的代码来筛选字段“筛选级联”中的所有项目,这些项目与InputBox收到的通配符*和stringf Like

 Option Explicit Sub FilterCstomers() Dim PvtTbl As PivotTable Dim PvtItm As PivotItem Dim f As String f = InputBox("Type the text you want to filter:") ' set the pivot table Set PvtTbl = Sheets("Customers Pivot").PivotTables("Customers_PivotTable") With PvtTbl.PivotFields("Concatenation for filtering") .ClearAllFilters For Each PvtItm In .PivotItems If PvtItm.Name Like "*" & f & "*" Then PvtItm.Visible = True Else PvtItm.Visible = False End If Next PvtItm End With End Sub 

你可以调整Shai的答案来显着加快速度,方法是:

  1. 因为不需要,移除IF的TRUE分支
  2. 在代码执行时将ManualUpdate设置为TRUE,以在每次更改任何PivotItems的可见状态时停止重新计算数据透视表。
  3. closures屏幕更新和计算(如果工作簿中有易失性function),直到完成

    如果你想让你的比较不区分大小写,你可能还想在其中放一个Option CompareText。

而且,如果用户input数据透视表中不存在的内容,您可能需要进行一些error handling。

你可能想给我的博客上这个东西读,因为数据透视表是非常缓慢的过滤,并讨论了许多方法来加快速度

这里是Shai代码的一个重做例子:

 Option Explicit Option Compare Text Sub FilterCstomers() Dim pt As PivotTable Dim pf As PivotField Dim pi As PivotItem Dim f As String f = InputBox("Type the text you want to filter:") With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With Set pt = Sheets("Customers Pivot").PivotTables("Customers_PivotTable") Set pf = pt.PivotFields("Concatenation for filtering") pt.ManualUpdate = True With pf .ClearAllFilters On Error GoTo ErrHandler For Each pi In .PivotItems If Not pi.Name Like "*" & f & "*" Then pi.Visible = False End If Next pi End With ErrHandler: If Err.Number <> 0 Then pf.ClearAllFilters pt.ManualUpdate = False On Error GoTo 0 With Application .ScreenUpdating = True .Calculation = xlCalculationAutomatic End With End Sub