【发布时间】:2014-02-25 05:07:30
【问题描述】:
我正在使用 VBA 模拟单击 Excel 切片器,但遇到了严重的性能问题。
用户单击 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
之前有人问过类似的问题:
Selecting multiple slicer items at once without a refresh
Pivot Slicer Update To Slow, Can I pause all functions until slicer update is complete?
建议是:
Application.EnableEvents = false
或
Application.Calculation = xlCalculationManual
更新:我还注意到,尽管关闭了事件和计算,但实际上所有数据透视表都在重新计算!
对我来说,这些选项都不起作用,也不会提高性能。计算确实被推迟了,并且没有触发任何事件。尽管如此, selected=true 的每次迭代仍需要大约 1.5 秒。该操作总共需要大约 5 分钟才能完成。
我的切片器连接到多个工作表中的 23 个数据透视表 (!)。基础数据(MS Access DB 连接)大约有 60,000 行,其中包含约 20 个变量,数量并不多。
感谢任何帮助。
【问题讨论】:
标签: vba excel pivot-table