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