Jon*_*nas 3 excel vba pivot-table excel-vba
我正在模拟使用VBA的Excel Slicer的单击,但是遇到了严重的性能问题。
用户单击X轴上带有日期的柱形图。单击列时,在包含日期列表的切片器中选择相应的日期。该列表将随着时间而继续增长。
(据我所知)为非OLAP数据源(我的情况)设置切片器选择的唯一方法是为每个切片器项分别设置selected = true。由于在每个设置上触发了重新计算,这对于包含许多项目的切片器来说非常慢。
显示问题的小代码示例:
On Error GoTo Err_Handler:
Dim SC As SlicerCache
Set SC = ActiveWorkbook.SlicerCaches("Slicer_DATE")
Dim SI As SlicerItem
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
For Each SI In SC.SlicerItems
SI.Selected = True
Next
Err_Handler:
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Run Code Online (Sandbox Code Playgroud)
之前曾问过类似的问题:
枢轴切片器更新变慢,我可以暂停所有功能,直到切片器更新完成吗?
那里的建议是:
Application.EnableEvents = false
Run Code Online (Sandbox Code Playgroud)
要么
Application.Calculation = xlCalculationManual
Run Code Online (Sandbox Code Playgroud)
更新:我还注意到,尽管关闭了事件和计算功能,但实际上所有数据透视表都在重新计算!
对我来说,这些选项都不起作用,也不能提高性能。确实确实推迟了计算,并且不会触发任何事件。尽管如此,selected = true的每次迭代仍需要约1.5秒。整个操作大约需要5分钟。
我的切片器连接到多张纸上的23个数据透视表(!)。基础数据(MS Access DB连接)大约有60,000行,带有约20个变量,数量并不多。
任何帮助表示赞赏。
数据透视表具有ManualUpdate
可以设置为的属性True
。为所有枢轴设置此属性可能有助于加快代码速度。
请尝试在更新切片器代码所在的位置上方添加以下内容:
Dim PT As PivotTable
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
For Each ws In wb.Sheets
For Each PT In ws.PivotTables
PT.ManualUpdate = True
Next PT
Next ws
Run Code Online (Sandbox Code Playgroud)
在更新切片器之后,添加以下内容:
For Each ws In wb.Sheets
For Each PT In ws.PivotTables
PT.ManualUpdate = False
Next PT
Next ws
Run Code Online (Sandbox Code Playgroud)
有关更多信息:
加速数据透视表过滤VBA代码
关闭PT Calc
MSDN:ManulaUpdate
希望有帮助!