在脚本中延迟活动-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帮助

最终在建立数据库连接并提交查询后立即将控件返回到该过程。查询可在后台更新。false仅在将所有数据获取到工作表之后才能返回该过程。

您可能更熟悉这些术语,同步和同步。false表示同步运行查询。

实现相同结果的另一种方法是在 中运行查询背景(异步)和以下代码在以下代码中进行轮询.Refreshing属性,直到该属性变为false。这使您可以做其他事情,例如显示自定义进度栏。

还有一个AfterRefresh事件,您可以挂接。

有趣的是,对于这个问题,答案非常简单。为了澄清,我同时使用了DoEvents和诸如Application.Wait Now + #12:00:12 AM#之类的东西(等待查询运行和加载的时间足够多)。但是,即使使用这两种方法,出于某种原因,似乎只有在所有查询运行后才将数据加载到电子表格。

实验,我只是将最后一行从.Refresh BackgroundQuery:=True更改为.Refresh BackgroundQuery:=False,这是一个疯狂的猜测,但它起作用了。

尝试在结束后立即使用doevents。

相关内容

  • 没有找到相关文章