使用VBA更新Excel切片器select的性能较差
我正在模拟使用VBA的Excel切片器上的一个点击,但已经遇到了严重的性能问题。
用户在X轴上点击date列图。 当点击一列时,在包含date列表的切片机中select相应的date。 该名单将继续与时俱进。
(据我所知)设置非OLAP数据源的切片器select(我的情况)是为每个切片器项目单独设置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
以前也有类似的问题:
一次select多个切片器项目而不刷新
数据透视切片更新要慢,我可以暂停所有function,直到切片更新完成?
有build议是:
Application.EnableEvents = false
要么
Application.Calculation = xlCalculationManual
更新:我也注意到,尽pipeclosures事件和计算,所有透视表实际上是重新计算!
对我而言,这些选项都不起作用,不会提高性能。 计算确实推迟了,没有事件被触发。 不过,selected = true的每次迭代大约需要1.5秒。 总共需要大约5分钟的时间才能完成。
我的切片机连接到多个表中的23个数据透视表(!)。 底层数据(MS Access数据库连接)大约有60,000行,大约有20个variables。
任何帮助表示赞赏。
数据透视表具有可以设置为True
的ManualUpdate
属性。 为您的所有枢轴设置此属性可能有助于加速您的代码。
请尝试在上面的更新切片器代码是:
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
然后在更新切片器后添加这个:
For Each ws In wb.Sheets For Each PT In ws.PivotTables PT.ManualUpdate = False Next PT Next ws
了解更多信息:
加快数据透视表过滤VBA代码
closuresPT Calc
MSDN:ManulaUpdate
希望有所帮助!
你需要做的是复制切片机和复制该领域作为切片机和报告filter见http://www.powerpivotpro.com/2010/12/another-way-to-get-and-use-slicer-values -in-公式/
然后使用CurrentPage属性来select该项目:
Private Sub SelectPivotItem(FieldName As String, Itemname As String) Dim PT As PivotTable, PTF As PivotField, PTI As PivotItem Set PT = shtInt.PivotTables("PivotTable1") Set PTF = PT.PivotFields(FieldName) PTF.ClearAllFilters PTF.CurrentPage = Itemname End Sub
这大大有助于提高性能。 同样的方法适用于在VBA中select多个PivotItems。
- 将数据透视表设置为ManualUpdate。
- 在进行多个切片器select时,隐藏包含切片器影响的数据透视表的所有图纸。
完成后不要忘记将数据透视表设置为ManualUpdate,并在需要时将表单设置为可见
这很奇怪,因为即使使用Application.ScreenUpdating = False这仍然有很大的帮助。
我通过这样做了3分钟到3秒的PivotItemsselectmacros。 相当明显的差异。
不幸的是,对于切片商来说,这个速度还是很慢的,大约30多岁 我期待切换回VBA和PivotItems做这个,并避免完全使用Slicers,除非我能find另一种方法来提高性能。