运行以下查询以获取蒸汽图表的一些数据:
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秒钟,并且脚本执行立即而不是等待先前的数据加载之前。有没有办法延迟执行后续脚本命令,直到将所有数据加载到电子表格中?
正如您正确猜测的那样,延迟执行后续命令的方法是设置.Refresh BackgroundQuery:=False
。一旦您理解这意味着什么,实际上是显而易见的。
来自内置的Excel帮助
最终在建立数据库连接并提交查询后立即将控件返回到该过程。查询可在后台更新。false仅在将所有数据获取到工作表之后才能返回该过程。
您可能更熟悉这些术语,同步和同步。false表示同步运行查询。
实现相同结果的另一种方法是在 中运行查询背景(异步)和以下代码在以下代码中进行轮询.Refreshing
属性,直到该属性变为false。这使您可以做其他事情,例如显示自定义进度栏。
还有一个AfterRefresh
事件,您可以挂接。
有趣的是,对于这个问题,答案非常简单。为了澄清,我同时使用了DoEvents
和诸如Application.Wait Now + #12:00:12 AM#
之类的东西(等待查询运行和加载的时间足够多)。但是,即使使用这两种方法,出于某种原因,似乎只有在所有查询运行后才将数据加载到电子表格。
实验,我只是将最后一行从.Refresh BackgroundQuery:=True
更改为.Refresh BackgroundQuery:=False
,这是一个疯狂的猜测,但它起作用了。
尝试在结束后立即使用doevents。