我在网上看到了很多关于使用VBA刷新数据透视表的问题。大多数建议这样的代码:
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
虽然这种答案可能会给出预期的结果,但可能会付出相当大的代价。
我有一张大工作表; 11列乘771427行。然后将整个工作表定义为三个其他工作表中每个工作表中每列三个数据透视表的源数据(它们执行不同类型的分析)。我总共拥有199个数据透视表。
如果我使用“数据”菜单中的“全部刷新”按钮,则更新过程需要很多小时。由于没有进度报告来解释原因,或者确认Excel没有挂起,我使用构建VBA代码首先在新工作表中列出数据透视表,然后逐个刷新指定的数据透视表。通过更新列表,我现在可以看到正在取得的进展。
然而,我最近偶然发现数据集发生了变化,导致我手动刷新了我的一个数据透视表,令我惊恐的是所有的数据透视表都在更新 - 几分钟而不是几小时。
如果数据透视表和工作表名称不是我想要更新的名称,则使用VBA代码进一步测试以跳过.RefreshTable
方法( 见下文 ) ,让我相信.RefreshTable
方法正在更新所有数据透视表 - 要么全部在工作表中,要么全部在工作簿中,或者可能只是共享相同源数据的所有数据透视表。此外,我相信当您按下“全部刷新”按钮时,Microsoft会遇到同样的问题。
Sub RefreshPivotTables()
Dim Pt As PivotTable
Dim St As Worksheet
For Each St In ActiveWorkbook.Worksheets
For Each pt In St.PivotTables
If pt.Name = "PivotTable151" And St.Name = "Sheet3" Then
Set pvtTable = pt.TableRange1.PivotTable
pvtTable.RefreshTable
End If
Next
Next
End Sub
我正在使用Excel 2010.那么这里发生了什么?如何改进上述答案以节省重复刷新?
答案 0 :(得分:0)
也许我也错过了一些东西,但你是在告诉它
For Each pivotTable In ActiveSheet.PivotTables
所以当然它会刷新所有连接到那张表的东西。
我们可以看到您使用的代码不更新特定文件吗?
你也尝试过:
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh