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

Posted

技术标签:

【中文标题】加快数据透视表过滤 VBA 代码【英文标题】:Speed up pivot table filtering VBA code 【发布时间】:2010-10-20 08:29:38 【问题描述】:

我有一个带有数据透视字段的数据透视表,其中包含许多项目。 我有 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

但没用。

【问题讨论】:

【参考方案1】:

哦!我刚刚解决了那个:

在代码的开头,像这样关闭自动更新:

PivotTable.ManualUpdate = True

然后在代码的最后,重新开启:

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

我发现此线程正在搜索帮助编写确定数据透视表值是否应该可见的代码。您的 oPivotField 背后是什么?这就是我缺少的部分!

【讨论】:

【参考方案2】:

PivotTable 对象有一个 ManualUpdate 属性,这可能是您正在寻找的。​​p>

相关代码见http://www.ozgrid.com/VBA/hide-pivot-fields.htm

【讨论】:

【参考方案3】:

pivottable.ManualUpdate [= 设置] 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 作者:杰夫·韦伯、史蒂夫·桑德斯 打印 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】:

尝试添加以下内容。在我的情况下也有助于提高速度。

开头:

Application.Calculation = xlCalculationManual

最后:

Application.Calculation = xlCalculationAutomatic

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于加快数据透视表过滤 VBA 代码的主要内容,如果未能解决你的问题,请参考以下文章

同步数据透视表 - VBA 代码不起作用

过滤数据透视表的最后一项 (vba)

VBA:根据单元格值过滤数据透视表

VBA数据透视表:添加过滤器

Excel 2013 过滤多个 OLAP 数据透视表

VBA:根据先前定义的变量过滤数据透视表