2015-09-04 116 views
0

我在网上看到了很多关于使用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方法更新所有数据透视表 - 或者全部在该工作表中,全部在工作簿中,或者也许只是共享相同源数据的全部。此外,我相信微软在按下“全部刷新”按钮时也会遇到同样的问题。

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

一种替代方法可以写一个小宏,并指示它仅刷新要的支点。 – ManishChristian

回答

0

也许我缺少的东西太多,但你是如此的告诉它​​

For Each pivotTable In ActiveSheet.PivotTables 

当然是要刷新它们全部连接到该表。

我们可以看到你玩过的代码而不更新特定的文件吗?

也有你试过:

Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh

Source

+0

人们会期望'For Each'一次刷新每个表格,而不是每个循环迭代中的所有表格。你建议'.PivotCache.Refresh' - 为什么? –

+0

我现在已将表跳过代码添加到原始问题。尽管如此,这仍然会更新所有的表格。 –

+0

根据我的工作量,我会尝试查看是否可以在今天使用它。这可能是Excel如何处理刷新;不确定。正如Nelly上面提到的可能会尝试一个小宏。我会尽快更新你的。 – Ross