【发布时间】:2015-07-14 19:54:32
【问题描述】:
我有一个用户表单,用户将在其中检查他们想要过滤一组数据透视表的所有项目。问题是我有大约 40 个数据透视表和 250 多个用户可以过滤的选项。理想情况下,我计划将数据透视表过滤器设置为一组值,但我找不到避免循环遍历数组和过滤器选项的解决方案。请在下面找到我的代码。非常感谢任何优化建议。谢谢!
Private Sub Filter_btn_Click()
Dim i As Integer
Dim n As Integer
Dim filter_num As Integer
Dim pivot_num As Integer
Dim MyArray() As String
Dim pt As PivotTable
Application.ScreenUpdating = False
Set dashboard = Sheets("Dashboard")
'Adding all selected items to array
n = 0
For i = 0 To Supplier_Listbox.ListCount - 1
If Supplier_Listbox.Selected(i) = True Then
ReDim Preserve MyArray(n)
MyArray(n) = Supplier_Listbox.List(i)
n = n + 1
End If
Next
i = 0
For pivot_num = 1 To 41
Set pt = dashboard.PivotTables("PivotTable" & pivot_num)
filter_num = 0
With pt.PivotFields("FilterItems")
'Include first item in filter to avoid error
.PivotItems(1).Visible = True
' PivotItems.Count is 270
For i = 2 To .PivotItems.Count
' Attempted to make the code a little faster with first if statement. Will avoid function if all array items have been checked
If filter_num = n Then
.PivotItems(i).Visible = False
' Call to function
ElseIf IsInArray(.PivotItems(i), MyArray) Then
.PivotItems(i).Visible = True
filter_num = filter_num + 1
Else:
.PivotItems(i).Visible = False
End If
Next
'Check if first item is actually in array, if not, remove filter
If IsInArray(.PivotItems(1), MyArray) Then
.PivotItems(1).Visible = True
Else:
.PivotItems(1).Visible = False
End If
End With
Next
Unload Me
Application.ScreenUpdating = True
End Sub
【问题讨论】:
-
循环有什么问题?或者,你为什么要优化这段代码?我怀疑真正的问题是包含 250 个选项的 40 个数据透视表。
-
嗨,Bryon,是的,我同意问题在于数量。当数据透视表的数量和选项的数量都受到限制时,此代码可以快速运行。虽然这可能是不可能的,但我想知道是否有一种方法可以像使用列一样用一行设置每个数据透视表的过滤器。
-
如果使用
PivotField.VisibleItemsList将字段指定为OLAP,则可以完成。不确定它是否更快。如果您想尝试,请使用数据透视表上的Data Model选项。我怀疑这可能需要转换所有表格。
标签: vba excel optimization pivot-table