2012-01-19 303 views
16

我正在创建一些代码,我可以点击一个按钮,它会刷新我在该表上的查询表。Excel vba刷新等待

现在,我的问题是,我有更多的代码后新鲜,复制一些信息,但此代码正在刷新开始后,信息尚未被取代后立即运行。

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

我不想只是等待5秒,但对于更新周期,所以,我不会等待太长或太短,这取决于网络速度等

我怎样才能做到这一点?

编辑:

简单代码:

ActiveWorkbook.RefreshAll 

在这里,我需要延迟或等待代码,直到所有的清爽结束......然后

MsgBox("The Refreshing is Completed!") 

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

+2

您是否正在使用'querytable.refresh false'来指定非背景刷新? –

+0

到目前为止只有ActiveWorkbook.RefreshAll但我需要一个循环来检查完成刷新。多数民众赞成我是怎么想到的 – dave123

+1

你可能可以通过刷新它们单独刷新''对于i = 1到ActiveWorkbook.querytables.count:ActiveWorkbook.querytables(i).refresh false:next' –

回答

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添加查询,然后执行TestRefreshing测试效果。您可以将行.BackgroundQuery = False更改为True以得到错误的结果。

Testpage用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> 
+0

这不允许我使用VBA进行刷新并等待它完成刷新 – dave123

+0

是的。刚刚测试过它。在属性中更改并在其后立即调用带有Debug.Print的RefreshAll。它始终返回所需的值,从不为空值 – DKSan

+0

这仍然不允许在下一代码运行之前等待一段时间。如果我在Debug.Print之后添加MsgBox(“完成刷新”),则在刷新完成之前MsgBox出现。 – dave123

6

我刚刚也有类似的问题,我们通过下面的解决了这个问题:

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

ActiveWorkbook.RefreshAll 

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

-1

如果你想让你的脚本在vba中等待,你必须使用睡眠。但睡眠有时在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 
0

'从[email protected] 2014年8月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 
7

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

添加以下行RefreshAll方法之后,做的伎俩:

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 

我希望它为你工作了。

确保您禁用事件来加快速度。

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

+0

这是伟大的,真的工作。谢谢 –

+0

不客气。很高兴我能帮上忙。 –

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将不把它放在一个给定的目的地,让您。

在我们尝试了类似于您似乎已经做过的事情之后,我们最终走上了这条路线。

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

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

+0

它没有为我工作 –

+0

您是否首先激活了工作簿? (我知道它是一个愚蠢的问题,但是我的代码没有工作的次数,因为我忘了做简单的事情是不真实的)。 MyWorkbook.Activate Then.RefreshAll – DDuffy

+1

当然可以。 'Application.CalculateUntilAsyncQueriesDone'最终解决了这个问题。 –

1

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

这将在后台关闭刷新,等待刷新完成。

enter image description here