2014-02-28 761 views
20

我有一個子組調用ActiveWorkbook.RefreshAll從XML源中提取新數據,然後對其執行多重修改。問題是沒有足夠的時間來完成RefreshAll命令,因此以下子和函數最終不能正確執行,導致重複行未被正確擦除。等到ActiveWorkbook.RefreshAll完成 - VBA

我一直在使用Application.Wait睡眠功能嘗試,但他們似乎暫停刷新過程了。我只想讓其餘的代碼等待刷新過程完成,然後再執行其餘的代碼。

關於如何實現這個的任何想法?現在我只能通過不調用RefreshAll來修復它,這讓我有了實現第二個流程的想法,但這不是一個好的解決方法。

請讓我知道,如果有任何不明確。謝謝

編輯 所以我嘗試了一些建議,從下面的帖子,這是我能夠想出。 做一個「記錄宏」,然後在表格屬性中取消選中「啓用後臺刷新」沒有任何結果。之後我也進行了刷新。這是錄製宏的結果是:

With ActiveWorkbook.Connections("XMLTable") 
     .Name = "XMLTable" 
     .Description = "" 
End With 
ActiveWorkbook.Connections("XMLTable").refresh 

ActiveWorkbook.Connections沒有一個BackgroundQuery選項,這樣我可以將它設置爲False。有任何想法嗎?

只是要清楚。這是一個在Excel網站上託管的XML文件,並導入到表格中。然後,我將這些數據稱爲關鍵點和其他事物。這裏的目標是允許從網站到表格的導入過程在執行任何其他命令之前完成。 感謝

EDIT2: 一個進一步的研究之後,我發現這個網頁:http://www.mrexcel.com/forum/excel-questions/564959-execute-code-after-data-connection-refresh-finished.html 看來,連接的XML類型不具有BackgroundQuery布爾值。該選項僅適用於ODBC和OLEDB連接,它們分別是xlConnectionTypeODBC和xlConnectionTypeOLEDB類型。我使用的XML連接類型爲xlConnectionTypeXMLMAP,它沒有BackgroundQuery選項。 有沒有人有任何想法去哪裏從這裏?我現在唯一想到的解決方案是在Excel表格上創建兩個獨立的宏按鈕,一個用於刷新,另一個用於數據修改,但我寧願將該選項保留到最後。

+2

使用'DoEvents'的'Activeworkbook.RefreshAll'語句之後。 – L42

+0

我從來沒有用過它。你能給我舉個例子嗎? – Mo2

+0

只需在您的'Activeworkbook.RefreshAll'後面添加'DoEvents'語句即可。爲了幫助你形象化,我將發佈回答。 – L42

回答

16

至於說:

'~~> your code here before refresh 

Activeworkbook.RefreshAll 
DoEvents 

'~~> rest of your code here after refresh 

做什麼DoEvents就像暫時允許Windows休息一下從Macro處理所有未決事件在返回到宏之前。
因此,當刷新工作簿並放入DoEvents之後,它將不會在刷新完成之前恢復宏。

+6

這似乎沒有工作。仍然得到重複。 – Mo2

+0

我已將更新添加到原始帖子。如果你有機會,請看看。謝謝 – Mo2

+1

這對我來說不適用 – Kenny

1

這裏是http://www.mrexcel.com/forum/excel-questions/510011-fails-activeworkbook-refreshall-backgroundquery-%3Dfalse.html找到了解決方案:通過所有工作簿的的PivotCaches

要麼所有的PivotCaches' backgroundquery屬性設置爲False,或循環:

Code: 
    For Each pc In ActiveWorkbook.PivotCaches 
     pc.BackgroundQuery = False 
     pc.Refresh 
    Next 

這將使所有的PivotCaches backgroundquery性質爲假。你可以與保留每個人的設置:

代碼:

For Each pc In ActiveWorkbook.PivotCaches 
    originalBGStatus = pc.BackgroundQuery 
    pc.BackgroundQuery = False 
    pc.Refresh 
    pc.BackgroundQuery = originalBGStatus 
Next 
+0

有什麼我必須啓用才能使用它?我在'pc.BackgroundQuery = False'行得到了1004錯誤我還應該提到數據不是直接導入到數據透視表中。它已經被導入到一個表格中,然後一張數據透視表就會被提供。這仍然適用於這種情況嗎? – Mo2

+0

現在我應該提到,當我轉到數據選項卡,然後單擊連接,然後選擇我的XML連接(託管在網站上)並單擊屬性時,我有「啓用後臺刷新」UNCHECKED。這與BackgroundQuery相同嗎? – Mo2

+1

您有正確的設置 - 您不希望刷新在後臺運行。不要直接進入一個樞軸......反饋......「我猜這仍然很重要。此外,請看看這個http://stackoverflow.com/questions/19916824/excel-2013-1004-runtime-error-refresh-query-table-backgroundquery-false –

32

我有同樣的問題,但DoEvents沒有幫助我,因爲我的數據連接啓用了後臺刷新。相反,使用Wayne G. Dunn的答案作爲起點,我創建了以下解決方案,這對我來說工作得很好;

Sub Refresh_All_Data_Connections() 

    For Each objConnection In ThisWorkbook.Connections 
     'Get current background-refresh value 
     bBackground = objConnection.OLEDBConnection.BackgroundQuery 

     'Temporarily disable background-refresh 
     objConnection.OLEDBConnection.BackgroundQuery = False 

     'Refresh this connection 
     objConnection.Refresh 

     'Set background-refresh value back to original value 
     objConnection.OLEDBConnection.BackgroundQuery = bBackground 
    Next 

    MsgBox "Finished refreshing all data connections" 

End Sub 

MSGBOX僅用於測試,一旦你快樂的代碼等待即可消除。

而且,我更喜歡的ThisWorkbookActiveWorkbook,因爲我知道那裏的代碼駐留,以防萬一焦點的變化將目標工作簿。十個中有九個是無關緊要的,但我喜歡在謹慎的方面犯錯。

編輯:剛剛看到您使用xlConnectionTypeXMLMAP連接沒有BackgroundQuery選項的編輯,抱歉。我會離開上面的任何人(像我)尋找一種方式來刷新OLEDBConnection類型。

+1

這對我有效,但是使用'ODBCConnection'而不是' OLEDB'。 – Dan

+0

這不適用於我說運行時錯誤1004應用程序定義或對象定義的錯誤 – newguy

+1

明智的解決方案 – Matt

0

試試這個:

ActiveSheet.Calculate

我用它在其中控制數據集的按鈕變化值的工作表。在每次點擊時,excel會通過此命令運行,圖形會立即更新。

1

這可能並不理想,但請嘗試使用「Application.OnTime」來暫停其餘代碼的執行,直到經過足夠的時間以確保所有刷新過程都已完成。

如果刷新列表中的最後一張表是僅包含一個標誌以指示刷新完成的虛表,該怎麼辦?這個表將在過程開始時被刪除,然後,使用「Application.OnTime」,一個Sub將每隔15秒左右運行一次,檢查是否填充了虛擬表。如果填充,請停止「Application.OnTime」檢查程序並繼續處理其餘的程序。

有點won but,但它應該工作。

0

我遇到了同樣的問題,並嘗試了所有上述解決方案,但沒有成功。最後通過刪除整個查詢並創建一個新問題來解決問題。它具有與沒有工作的設置完全相同的設置(字面上與我僅複製舊的查詢定義相同)。我不知道爲什麼這解決了問題,但它確實如此。希望這可以幫助某人。

0

如果您不是使用Excel Web Query結婚的,則可以嘗試將URL作爲單獨的工作簿打開。通過該路線,您可以在完成Web請求後處理生成的數據,就像關閉「啓用後臺刷新」一樣。

好的是,Excel在請求期間顯示進度條,而不是在目標單元中凍結/顯示加載消息。

見我的回答這個問題:How can I post-process the data from an Excel web query when the query is complete?

這種做法的代價是你必須要管理處理你找回自己的數據 - Excel將不把它放在一個給定的目的地,讓您。

在我們嘗試了類似於您似乎已經做過的事情之後,我們最終走上了這條路線。

3

雖然@Wayne G. Dunn在代碼中給出了。這裏是你不想編碼的地方。並取消選中禁用後臺刷新。

enter image description here

3

免責聲明:據報道,下面的代碼casued一些崩潰!小心使用。

根據 THIS answer在Excel 2010及以上 CalculateUntilAsyncQueriesDone

停止宏直到刷新完成
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone

+0

這導致我的Excel崩潰。 AsyncQueries通常與多維數據集數據刷新相關。 – rohrl77

+0

同樣在這裏excel墜毀當我跑這個 – newguy

+0

墜毀excel 2016.希望我更仔細閱讀。 – Greenspark

2

,必須關閉 「後臺刷新」 爲所有查詢。如果啓用了後臺刷新,則在刷新發生時Excel會提前工作,並且您遇到問題。

數據>連接>屬性>(選中)啓用後臺刷新

+0

我試圖在數據刷新後將數據從一個標籤複製/粘貼到另一個標籤。該粘貼保持空白,但禁用「後臺刷新」後,它的工作完美。謝謝@ tim.s – CowboyBebop