VBA更高效的'透明切片'代码

时间:2013-09-20 14:22:51

标签: vba excel-vba pivot-table excel

我一直在Excel 2010的摘要表上使用六个切片器。每个切片器连接到26个数据透视表。

我过去使用过以下代码来清除切片器的选择,并且它在微小延迟时工作得很好。但是,这次代码需要6-7秒才能完全执行,这似乎不值得使用。

Dim oSlicerC As SlicerCache

For Each oSlicerC In ActiveWorkbook.SlicerCaches
    oSlicerC.ClearManualFilter
Next oSlicerC

我一直在寻找一种方法来加速宏/使其更有效率,但我在网上找不到任何东西。我尝试将ScreenUpdatingDisplayAlertsEnableEvents设置为False,我尝试在代码开头设置CalculationxlCalculationManual但是这没多大帮助。

我考虑过遍历每个SlicerItem以取消选择每一个,但是在几个切片器中最多有100个项目,我不确定它会更快。

有没有人对我如何能够做到这一点有任何想法?我不是在寻找代码,因为我想自己采取一些措施,但我不确定我应该选择哪条路径,或者是否有更有效的替代方案来替代我已经使用的代码。非常感谢!

3 个答案:

答案 0 :(得分:4)

我遇到了类似的问题:

Dim oSlicerC As SlicerCache
For Each oSlicerC In ActiveWorkbook.SlicerCaches
If oSlicerC.FilterCleared = False Then oSlicerC.ClearManualFilter
Next oSlicerC`

答案 1 :(得分:0)

这是一个老帖子,但还有另一种可能性。

如果您在excel表中有数据,则可以调用该表

tbl.AutoFilter.ShowAllData

这也将非常快速地重置所有切片器。

在我的程序之间有173'561行和其他内容。

对于上面的每个例子:6.88秒 我的例子:6.92秒

也许存在一种情况更快的情况。 例如它必须重置不仅仅是几个切片,我的版本应该更快。

答案 2 :(得分:0)

我看到它是很久以前发布的,但这仍然可能有用: 我刚刚为sliceritems定义了2个参数,并在循环第一个项目时,运行了另一个循环以取消全选。 '''

For Each oSi In oScR.SlicerItems
    If oSi.HasData Then
        For Each oSiT In oScR.SlicerItems:
            If oSiT.HasData Then oSiT.Selected = False
        Next
        oSi.Selected = True

    End If
Next

'''