Excel vba刷新等待

Excel vba刷新等待,excel,refresh,wait,vba,Excel,Refresh,Wait,Vba,我正在创建一些代码,我可以单击一个按钮,它将刷新我在该工作表上的查询表 现在,我的问题是在刷新之后有更多的代码复制了一些信息,但是这些代码在刷新开始后立即运行,而这些信息还没有被替换 我想创建一个等待刷新完成的时间段,然后剩下的代码就可以继续了 我不想仅仅等待5秒钟,而是等待刷新时间,这样我就不会等待太长或太短,这取决于互联网速度等 我该怎么做 编辑: 简单代码: ActiveWorkbook.RefreshAll 在这里,我需要延迟或等待代码,直到所有的刷新完成。。。然后 MsgBox("T

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

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

我想创建一个等待刷新完成的时间段,然后剩下的代码就可以继续了

我不想仅仅等待5秒钟,而是等待刷新时间,这样我就不会等待太长或太短,这取决于互联网速度等

我该怎么做

编辑:

简单代码:

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

MsgBox("The Refreshing is Completed!")

朝那个方向的东西。但是在msgbox实际完成之前,它不能说它是msgbox。。。。有时,根据互联网速度的不同,刷新时间会缩短或延长,因此我希望它是实际刷新时间的一个变量

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

请看一下本页底部的图片

编辑:

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

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秒睡眠的测试页面:

<!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.
2.

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

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

ActiveWorkbook.RefreshAll

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

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

与其这样,不如试试

Application.Wait(现在+时间值(“0:01:00”))

示例代码

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

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

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

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

在RefreshAll方法之后添加以下行,完成了以下操作:

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
我希望它对你也有用

确保禁用事件以加快速度


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

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

这使您能够在调用完成后立即从web请求中完全访问数据。另外,Excel在加载时会显示一个进度条,而不是像Web查询一样冻结

见我对这个问题的回答:

这种方法的折衷之处在于,您必须自己管理处理返回的数据——Excel不会为您将数据放在给定的目标中

在我们尝试了与您似乎一直在做的事情非常相似的事情之后,我们最终选择了这条路线。

ActiveWorkbook.RefreshAll
ActiveWorkbook.RefreshAll
        Do While Application.CalculationState <> xlDone
            DoEvents
        Loop
在Application.Calculation状态xlDone时执行 多芬特 环
我知道这是个老问题,但这对我来说很有效。 也适用于公式计算时的等待。

取消选中中的“启用后台刷新” 数据->连接->属性

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

试试这种方法:

With Selection.ListObject.QueryTable
  .BackgroundQuery = False
  .Refresh
End With
当您这样说时,BackgroundQuery=False似乎不会将BackgroundQuery属性更改为False

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

是否使用
querytable.refresh false
指定非后台刷新?到目前为止,仅使用ActiveWorkbook.RefreshAll,但我需要一个循环来检查何时完成刷新。这就是我想象的,你可以通过将I=1分别刷新到ActiveWorkbook.querytables.count:ActiveWorkbook.querytables(I).refresh false:next来做到这一点。遗憾的是,刷新时不允许等待一段时间,查看文档似乎只适用于基于sql源的querytables,您正在使用web查询吗?这不允许我使用VBA刷新并等待它完成刷新是的。刚刚测试过。在属性中更改,并使用调试调用RefreshAll。之后立即打印。它总是返回所需的值,从不为空。这仍然不允许在运行下一个代码之前等待一段时间。如果我在Debug.Print之后添加MsgBox(“完成刷新”)。。。然后在刷新完成之前出现MsgBox。您使用的是哪个Excel版本?我刚刚创建了一个页面,它休眠10秒,然后输出一个表。正如预期的那样,我的makro停止了10秒,并在direct Console中打印了返回的值。看起来它可以工作,但是如果你选择一个更大的网站,其中包含更多的信息。然后运行TestRefresh宏,它仍然不起作用。是否有一种方法可以让excel知道它的刷新,并创建一个循环。在刷新时喜欢=true循环直到刷新=False。。。。朝那个方向的东西,因为这不是