2013-04-25 76 views
6

以我過去後Auto refresh pivottables data in excel on first run內的外部數據源和數據透視表一起,我發現我的第一執行查詢外部數據源被刷新,需要大約1分鐘執行。並在我的第二次運行中,數據透視表被更新。刷新兩個時間表

是否有解決方案(VBA代碼)以刷新兩個時間表內外部數據源和數據透視表一起通過點擊command button(如果假設我們設定一個計時器)?

+0

'第一件事第一'這意味着你應該確保你的查詢刷新之前,你更新PT。取決於你創建查詢的方式,你可以像描述的那樣控制'AfterRefresh事件'(或類似)[該描述](http://msdn.microsoft.com/en-us/library/ff835922%28v=office.14 %29.aspx)...比你能刷新你的PT確保你的數據是最新的。 – 2013-04-25 18:53:08

+0

我的數據每晚更新。 – user42995 2013-04-25 19:03:09

+0

'Application.OnTime'怎麼樣? – 2013-04-25 19:14:34

回答

17

在連接屬性下,取消選中「啓用後臺刷新」。這將在連接被告知時刷新,而不是在其他進程發生的背景中。

在禁用後臺刷新的情況下,您的VBA過程將等待您的外部數據刷新,然後再移至下一行代碼。

然後你只需修改下面的代碼:

ActiveWorkbook.Connections("CONNECTION_NAME").Refresh 
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh 

您也可以關閉後臺刷新在VBA:

ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False 
+0

謝謝,我已將'BackgroundQuery'設置爲'false'。我解決了我在之前的文章中指定的問題。非常感謝你花費寶貴的時間。 – user42995 2013-04-25 21:38:34

+0

謝謝,這是一個演出和簡潔的答案!我也想更新我的數據透視表,但沒有數據源刷新,我想我需要一個奇蹟。 – fuadj 2017-11-09 19:50:40

8

我用上面的答案,但利用了RefreshAll方法。我也改變了它,以允許多個連接,而不必指定名稱。然後我將它鏈接到電子表格上的按鈕。

Sub Refresh() 

    Dim conn As Variant 

    For Each conn In ActiveWorkbook.Connections 
     conn.ODBCConnection.BackgroundQuery = False 
    Next conn 

    ActiveWorkbook.RefreshAll 
End Sub 
0

自動刷新工作簿例如每5秒。 應用到模塊

Public Sub Refresh() 
'refresh 
ActiveWorkbook.RefreshAll 

alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss 
    Application.OnTime alertTime, "Refresh" 

End Sub 

應用到工作簿上打開

Private Sub Workbook_Open() 
alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss 
Application.OnTime alertTime, "Refresh" 
End Sub 

:)

4

我認爲這是一個簡單的使Excel等到刷新完成的方式,而不必將Background Query屬性設置爲False。爲何混淆了人們的喜好?

Excel 2010(及更高版本)具有稱爲CalculateUntilAsyncQueriesDone的此方法,您必須在調用RefreshAll方法後調用它。 Excel將等待計算完成。

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 

我通常把這些東西一起做高手全算不中斷,發送我的模型給別人之前。這樣的事情:

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 
Application.CalculateFullRebuild 
Application.CalculateUntilAsyncQueriesDone