在脚本期间延迟活动 – 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。