2015-09-04 185 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