2017-09-05 105 views
0

運行下面的查詢從蒸汽圖表抓住一些數據:拖延活動 - VBA

With ActiveSheet.QueryTables.Add(Connection:= _ 
    "URL;http://steamcharts.com/app/" & games(x), Destination:=Range("A" & lastRowData)) 
    .Name = " & games(x) & " 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .WebSelectionType = xlAllTables 
    .WebFormatting = xlWebFormattingNone 
    .WebPreFormattedTextToColumns = True 
    .WebConsecutiveDelimitersAsOne = True 
    .WebSingleBlockTextImport = False 
    .WebDisableDateRecognition = False 
    .WebDisableRedirections = False 
    .Refresh BackgroundQuery:=True 
End With 

然後,我有其他動作後記像

//Run analysis 

我遇到的問題當腳本正確執行時,「分析」部分運行,但無法按預期工作,因爲在查詢加載時,它可能需要5秒鐘才能完成,並且腳本立即執行,而不是等待先前的數據先加載加工。有沒有辦法延遲後續腳本命令的執行,直到所有數據都加載到電子表格中?

+0

請參閱此鏈接:https://stackoverflow.com/questions/1544526/how-to-pause-for-specific-amount-of-time-excel-vba – PKatona

+0

@PKatona我對這個解決方案的問題是它指定了一段時間。我真的在問,是否有一種方法可以讓excel確認查詢仍在運行,並等待數據填充以繼續執行腳本。 –

回答

1

正如你所猜測的那樣,延遲執行後續命令的方法是設置.Refresh BackgroundQuery:=False。一旦你明白這意味着什麼,其原因實際上是顯而易見的。

從內置Excel幫助

真正的控制,因爲一旦數據庫建立連接並提交查詢返回的過程。 QueryTable在後臺更新。 False僅在將所有數據提取到工作表後纔將控制權返回給過程。

您可能更加熟悉這些術語的異步和同步。 False表示同步運行查詢。

另一種方式來達到同樣的結果是在後臺(異步),直到變成假的運行查詢並在下面的代碼民意測驗.Refreshing財產。這使您可以執行其他操作,例如顯示自定義進度欄。

還有一個你可以掛鉤的AfterRefresh事件。

0

嘗試在結束後使用DoEvents。

+0

不起作用。 DoEvents只允許其他後臺進程獲得執行時間。它與在後臺運行的VBA方法無關。 – robinCTS

1

有趣的是,對於這個問題,答案很簡單。爲了澄清,我使用了DoEventsApplication.Wait Now + #12:00:12 AM#(等待足夠多的時間來運行和加載查詢)。但是,即使使用這兩種方法,出於某種原因,似乎數據只會在所有查詢運行後才加載到電子表格中。

試驗中,我只是將最後一行從.Refresh BackgroundQuery:=True更改爲.Refresh BackgroundQuery:=False,這是一個瘋狂的猜測,但它工作。