我正在创建一些代码,我可以单击一个按钮,它将刷新我在该工作表上的查询表。
现在,我的问题是我在更新后会有更多代码复制一些信息,但是这些代码在刷新开始后立即运行并且信息尚未被替换。
我想为刷新完成创建一个等待期,然后其余的代码可以继续。
我不想等待5秒,但是要等待一段时间,这样我就不会等待太长或太短,这取决于互联网的速度等。
我该怎么做?
修改
简单代码:
ActiveWorkbook.RefreshAll
这里我需要延迟或等待代码,直到所有刷新完成...然后
MsgBox("The Refreshing is Completed!")
朝那个方向发展。但是在它实际完成之前它不能说msgbox ....有时候取决于互联网速度,刷新需要更短或更长,所以我希望它是实际刷新时间的变量。
答案 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)
答案 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