运行以下查询以从蒸汽图中获取一些数据:
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 :(得分:1)
有趣的是,对于这个问题,答案非常简单。为了澄清,我使用了DoEvents
和类似Application.Wait Now + #12:00:12 AM#
之类的东西(等待查询运行和加载的时间足够长)。但是,即使使用这两种方法,由于某些原因,似乎数据只会在所有查询运行后加载到电子表格中。
尝试,我只是将最后一行从.Refresh BackgroundQuery:=True
更改为.Refresh BackgroundQuery:=False
这是一个疯狂的猜测,但它确实有效。
答案 1 :(得分:1)
正如您所猜测的那样,延迟执行后续命令的方法是设置.Refresh BackgroundQuery:=False
。一旦你明白这意味着什么,其实的原因显而易见。
从内置的Excel帮助
如果建立数据库连接并提交查询,则返回对程序的控制。 QueryTable在后台更新。仅在将所有数据提取到工作表后才将控制返回到过程。
您可能更熟悉异步和同步的术语。 False意味着同步运行查询。
实现相同结果的另一种方法是在后台运行查询 (异步),并在以下代码中轮询.Refreshing
属性,直到这变得虚假。这允许您执行其他操作,例如显示自定义进度条。
您还可以加入AfterRefresh
事件。
答案 2 :(得分:0)
在结束后立即尝试使用DoEvents。