加快数据透视表过滤VBA代码

时间:2009-04-18 23:42:38

标签: excel vba excel-vba pivot-table

我有一个带有枢轴字段的数据透视表,包含许多项目。 我有VBA代码逻辑来决定是否应该显示数据透视值。 问题是excel重新计算显示或隐藏的每个字段的数据透视表,这使得它非常慢。 在设置了所有值之后,我想要一次只重新计算一次的东西。 我尝试使用Application.Calculation = xlCalculationManual,但它没有帮助。

我正在使用的vba代码是这样的

For i = 1 To oPivotField.PivotItems.Count
    If (oPivotField.PivotItems(i).Name = "TestCondition") Then
        oPivotField.PivotItems(i).Visible = True   'Recalulates pivot table
    Else
        oPivotField.PivotItems(i).Visible = False 'Recalulates pivot table
    End If
Next

我要手动取消选中“全部显示”框并重新检查我想要的字段。这会导致Excel重新计算一次并仅显示我想要的透视项目。 我想通过VBA代码做同样的事情。

我甚至尝试过使用

Application.ScreenUpdating = False
Application.DisplayAlerts = False

但没有用。

5 个答案:

答案 0 :(得分:7)

哦!我刚刚解决了那个问题:

在代码的开头,关闭自动更新,如下所示:

PivotTable.ManualUpdate = True

然后在代码的最后,将其重新打开:

ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh

我发现这个线程正在寻找帮助编写代码的帮助,该代码确定数据透视表值是否应该可见。你的oPivotField背后是什么?那是我错过的部分!

答案 1 :(得分:4)

PivotTable个对象具有ManualUpdate属性,可能就是您要查找的内容。

请参阅http://www.ozgrid.com/VBA/hide-pivot-fields.htm了解相关代码

答案 2 :(得分:0)

尝试添加以下内容。在我的情况下帮助提供额外的速度。

一开始:

Application.Calculation = xlCalculationManual

最后:

Application.Calculation = xlCalculationAutomatic

答案 3 :(得分:0)

pivottable.ManualUpdate [= setting]
True会导致RefreshTable清除数据透视表中的数据,而不是刷新它 False允许RefreshTable正常工作 默认值为False 调用过程结束后,此属性将自动重置为False(重要

在您进行更新之前,此属性应设置为true(例如,更改数据透视表项Visible属性)
所以你的代码看起来像是:

For i = 1 To oPivotField.PivotItems.Count
    If (oPivotField.PivotItems(i).Name = "TestCondition") Then
        oPivotField.Parent.ManualUpdate = True
        oPivotField.PivotItems(i).Visible = True  'doesn't recalculate pivot table because ManualUpdate is set to True
    Else
        oPivotField.Parent.ManualUpdate = True
        oPivotField.PivotItems(i).Visible = False 'doesn't recalculate pivot table because ManualUpdate is set to True
    End If
Next

'setting pivot table ManualUpdate property to False might be redundant at this point because it gets reset to false immediately after you set Visible property of oPivotField
oPivotField.Parent.ManualUpdate = False
oPivotField.Parent.Update()

作为结论,ManualUpdate属性更改不会停留很长时间(在我的测试中,我可以看到它会尽快重置为false,因此我建议您在需要时将其设置为true对枢轴项进行更改)

有关Excel更新的更多信息,您可以查看以下内容:
Pivot Refresh vs. Update – is there a real difference?

参考文献:
标题:使用VBA和.NET编程Excel
作者: Jeff Webb,Steve Saunders
打印ISBN: 978-0-596-00766-9 | ISBN 10: 0-596-00766-3
电子书ISBN: 978-0-596-15951-1 | ISBN 10: 0-596-15951-X

答案 4 :(得分:-1)

保存工作簿的副本并将其另存为“excel 93-2007”文件。然后尝试你的代码。希望这会对你有所帮助。