Excel vba刷新等待

dav*_*123 17 excel vba refresh excel-vba wait

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

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

我想创建一个等待刷新完成的时间段,然后其余的代码可以继续.

我不想只等待5秒钟,但是在刷新期间,我不会等待太长或太短,这取决于互联网速度等.

我怎样才能做到这一点?

编辑:

简单代码:

ActiveWorkbook.RefreshAll
Run Code Online (Sandbox Code Playgroud)

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

MsgBox("The Refreshing is Completed!")
Run Code Online (Sandbox Code Playgroud)

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

DKS*_*San 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
Run Code Online (Sandbox Code Playgroud)

执行AddWebquery以添加Query,然后执行TestRefreshing以测试效果.您可以更改行.BackgroundQuery = FalseTrue有错误的结果.

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>
Run Code Online (Sandbox Code Playgroud)


Rem*_*ima 7

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

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

ActiveWorkbook.RefreshAll
Run Code Online (Sandbox Code Playgroud)

像这样我们能够在调用刷新之前确定所有连接backgroundQuery属性false.


Eja*_*med 7

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

在RefreshAll方法之后添加以下行,就可以了:

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Run Code Online (Sandbox Code Playgroud)

我希望它对你也有用.

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

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

  • 更新:我注意到这种方法有时在桌面应用程序的 Excel 365 订阅版本上运行得不太可靠。Excel 只是长时间没有响应。将后台刷新属性设置为 False 似乎是唯一的选择。但是,如果您正在使用 OLAP 连接,您可能也无法做到这一点,请告诉我是否有人也面临类似的问题。 (2认同)