2017-09-05 77 views
0

运行下面的查询从蒸汽图表抓住一些数据:拖延活动 - 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秒钟才能完成,并且脚本立即执行,而不是等待先前的数据先加载加工。有没有办法延迟后续脚本命令的执行,直到所有数据都加载到电子表格中?

+0

请参阅此链接:https://stackoverflow.com/questions/1544526/how-to-pause-for-specific-amount-of-time-excel-vba – PKatona

+0

@PKatona我对这个解决方案的问题是它指定了一段时间。我真的在问,是否有一种方法可以让excel确认查询仍在运行,并等待数据填充以继续执行脚本。 –

回答

1

正如你所猜测的那样,延迟执行后续命令的方法是设置.Refresh BackgroundQuery:=False。一旦你明白这意味着什么,其原因实际上是显而易见的。

从内置Excel帮助

真正的控制,因为一旦数据库建立连接并提交查询返回的过程。 QueryTable在后台更新。 False仅在将所有数据提取到工作表后才将控制权返回给过程。

您可能更加熟悉这些术语的异步和同步。 False表示同步运行查询。

另一种方式来达到同样的结果是在后台(异步),直到变成假的运行查询并在下面的代码民意测验.Refreshing财产。这使您可以执行其他操作,例如显示自定义进度栏。

还有一个你可以挂钩的AfterRefresh事件。

0

尝试在结束后使用DoEvents。

+0

不起作用。 DoEvents只允许其他后台进程获得执行时间。它与在后台运行的VBA方法无关。 – robinCTS

1

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

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