Excel vba刷新等待

时间:2012-01-19 11:38:26

标签: excel-vba refresh wait vba excel

我正在创建一些代码,我可以单击一个按钮,它将刷新我在该工作表上的查询表。

现在,我的问题是我在更新后会有更多代码复制一些信息,但是这些代码在刷新开始后立即运行并且信息尚未被替换。

我想为刷新完成创建一个等待期,然后其余的代码可以继续。

我不想等待5秒,但是要等待一段时间,这样我就不会等待太长或太短,这取决于互联网的速度等。

我该怎么做?

修改

简单代码:

ActiveWorkbook.RefreshAll

这里我需要延迟或等待代码,直到所有刷新完成...然后

MsgBox("The Refreshing is Completed!")

朝那个方向发展。但是在它实际完成之前它不能说msgbox ....有时候取决于互联网速度,刷新需要更短或更长,所以我希望它是实际刷新时间的变量。

9 个答案:

答案 0 :(得分:9)

在Web查询的外部数据范围属性中,您有一个复选框,上面写着“启用后台刷新”,您应该取消选中该复选框以达到所需的效果。

请查看此页面底部:http://www.mrexcel.com/tip103.shtml了解图片

编辑:

这是两个显示所需效果的宏:

Sub AddWebquery()
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://de.selfhtml.org/html/tabellen/anzeige/table_tr_th_td.htm", _
        Destination:=Range("$A$1"))
        .Name = "table_tr_th_td"
        .BackgroundQuery = False
        .RefreshStyle = xlInsertDeleteCells
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "1"
        .Refresh BackgroundQuery:=False
    End With
End Sub

Sub TestRefreshing()
    Range("A1").Clear
    ActiveWorkbook.RefreshAll
    Debug.Print "Test: " & Range("A1").Value
End Sub

执行AddWebquery以添加Query,然后执行TestRefreshing以测试效果。您可以将第.BackgroundQuery = False行更改为True,以获得错误的结果。

10秒睡眠的测试页:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>SO-Test</title>
    </head>
    <body>
        <?php
        sleep(10);
        ?>
        <table border="1">
            <thead>
                <tr><th>1</th></tr>
            </thead>
            <tbody>
                <tr><td>2</td></tr>
            </tbody>
        </table>
    </body>
</html>

答案 1 :(得分:7)

我刚刚遇到了类似的问题,我们通过以下方式解决了这个问题:

For i = 1 To ActiveWorkbook.Connections.Count
    ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery = False
    'MsgBox ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery
Next

ActiveWorkbook.RefreshAll

像这样我们可以在调用刷新之前确保所有连接backgroundQuery属性肯定是false

答案 2 :(得分:7)

我正在使用PowerPivot模型,我希望在保存并关闭模型之前刷新数据。但是,excel只是在刷新完成之前关闭了模型,并且模型在打开时恢复了刷新。

在RefreshAll方法之后立即添加以下行,可以解决问题:

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone

我希望它也适合你。

确保禁用事件以加快速度。

请注意,我使用的是Excel 2010,我不确定此方法是否适用于旧版本。

答案 3 :(得分:1)

取消选中“启用后台刷新” 数据 - &gt;连接 - &gt;特性

这将在后台禁用刷新并等待刷新完成。

enter image description here

答案 4 :(得分:0)

如果你想让你的脚本在vba中等待,你必须使用sleep。但是睡眠有时在Excel vba中不起作用。

http://99students.com/macro-sleep-vba/

而不是尝试

Application.Wait (Now + TimeValue("0:01:00"))

示例代码

Sub Setting_Sleep_Without_Sleep_Function()
 MsgBox Now
 Application.Wait DateAdd("s", 10, Now)
 MsgBox Now
End Sub

答案 5 :(得分:0)

&#39;来自A.G.Johnson@Live.com 2014-08-11 &#39;这是一个简单的版本,可让您完全控制。 &#39;而不是使用RefreshAll,创建以下子例程: &#39;从Excl VBA中调用例程,无论你想在哪里执行它, &#39;在完成之前别无其他事情发生。 &#39;另一个好处是它不会刷新任何数据透视表,因此它们不会干扰, &#39;如果你有依赖刷新数据的枢轴,你可以运行类似的刷新 &#39;查询刷新完成后,为您的枢轴。

sub RefreshQueries()
    dim ws as worksheet
    dim qt as QueryTable
    For each ws in thisworkbook.worksheets
        For each qt in ws.querytables
            qt.refresh
        next qt
    next ws
end sub

答案 6 :(得分:0)

另一种方法是使用Workbooks.Open命令将URL作为单独的工作簿加载。

这使您可以在呼叫结束后立即完全访问Web请求中的数据。另外,Excel在加载时显示进度条,而不是像Web查询一样冻结。

请参阅我对此问题的回答:How can I post-process the data from an Excel web query when the query is complete?

这种方法的权衡是你必须管理处理你自己得到的数据 - Excel不会把它放在你给定的目的地。

在我们尝试了与你似乎一直非常相似的事情后,我们最终走上了这条路线。

答案 7 :(得分:0)

ActiveWorkbook.RefreshAll
        Do While Application.CalculationState <> xlDone
            DoEvents
        Loop

我知道这是一个老问题,但这对我有用。 也适用于公式计算时等待。

答案 8 :(得分:0)

尝试这种方法:

With Selection.ListObject.QueryTable
  .BackgroundQuery = False
  .Refresh
End With

按以下方式进行说明时,BackgroundQuery = False似乎不会将BackgroundQuery属性更改为False。

Selection.ListObject.QueryTable.Refresh BackgroundQuery = False  ' doesn't work