首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Excel vba刷新等待

Excel vba刷新等待
EN

Stack Overflow用户
提问于 2012-01-19 19:38:26
回答 9查看 86.1K关注 0票数 21

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

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

我希望创建一个等待刷新完成的时间段,然后可以继续执行其余的代码。

我不想只等待5秒,而是等待刷新时间,这样我就不会等待太长或太短,这取决于网速等。

我该怎么做呢?

编辑:

简单的代码:

代码语言:javascript
运行
复制
ActiveWorkbook.RefreshAll

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

代码语言:javascript
运行
复制
MsgBox("The Refreshing is Completed!")

那个方向上的一些东西。但在它实际完成之前,它不能说msgbox ...有时根据网速的不同,刷新需要更短或更长的时间,所以我希望它是实际刷新时间的一个变量。

EN

回答 9

Stack Overflow用户

发布于 2014-11-06 20:59:57

我正在使用一个PowerPivot模型,我想在保存和关闭该模型之前刷新数据。但是,excel只是在刷新完成之前关闭了模型,模型在打开时继续刷新。

在RefreshAll方法后面添加下面这行代码,就完成了这个任务:

代码语言:javascript
运行
复制
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone

我希望它也适用于你。

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

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

票数 13
EN

Stack Overflow用户

发布于 2012-01-19 21:48:59

在您的Web查询的外部数据范围属性中,您有一个类似于“启用后台刷新”的复选框,您应该取消选中它以获得所需的效果。

看看这个页面的底部:http://www.mrexcel.com/tip103.shtml查看图片

编辑:

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

代码语言:javascript
运行
复制
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添加查询,然后执行TestRefreshing测试效果。您可以将行.BackgroundQuery = False更改为True以获得错误的结果。

带有10秒睡眠的测试页面:

代码语言:javascript
运行
复制
<!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>
票数 9
EN

Stack Overflow用户

发布于 2012-10-12 17:01:31

我刚刚遇到了一个类似的问题,我们已经通过以下方法解决了它:

代码语言:javascript
运行
复制
For i = 1 To ActiveWorkbook.Connections.Count
    ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery = False
    'MsgBox ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery
Next

ActiveWorkbook.RefreshAll

这样,在调用false之前,我们就能够确保所有连接的backgroundQuery属性都是明确的刷新。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8925403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档