![]() |
爱喝酒的开水瓶 · nginx一个端口配置多域名服务_51CTO ...· 1 年前 · |
![]() |
彷徨的斑马 · numpy中是否有动态数组?· 1 年前 · |
![]() |
飘逸的炒饭 · 6.2 特征提取-scikit-learn中文社区· 1 年前 · |
![]() |
喝醉的卤蛋 · JavaScript/js 转 ...· 1 年前 · |
我正在创建一些代码,我可以在其中单击一个按钮,它将刷新我在该工作表上的查询表。
现在,我的问题是,在刷新之后,我有更多的代码来复制一些信息,但是这些代码是在刷新开始后立即运行的,并且这些信息还没有被替换。
我希望创建一个等待刷新完成的时间段,然后可以继续执行其余的代码。
我不想只等待5秒,而是等待刷新时间,这样我就不会等待太长或太短,这取决于网速等。
我该怎么做呢?
编辑:
简单的代码:
ActiveWorkbook.RefreshAll
在这里,我需要延迟或等待代码,直到所有刷新完成...然后
MsgBox("The Refreshing is Completed!")
那个方向上的一些东西。但在它实际完成之前,它不能说msgbox ...有时根据网速的不同,刷新需要更短或更长的时间,所以我希望它是实际刷新时间的一个变量。
在您的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
以获得错误的结果。
带有10秒睡眠的测试页面:
<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SO-Test</title>
</head>
sleep(10);
<table border="1">
<thead>
<tr><th>1</th></tr>
</thead>
<tbody>
<tr><td>2</td></tr>
</tbody>
</table>
</body>
</html>
我刚刚遇到了一个类似的问题,我们已经通过以下方法解决了它:
For i = 1 To ActiveWorkbook.Connections.Count
ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery = False
'MsgBox ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery
ActiveWorkbook.RefreshAll
这样,在调用
false
之前,我们就能够确保所有连接的
backgroundQuery
属性都是明确的刷新。
如果你想让你的脚本在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
‘从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,我不确定此方法在旧版本中是否可用。
另一种方法是使用Workbooks.Open命令将URL作为单独的工作簿加载。
这使您可以在调用完成后立即完全访问web请求中的数据。此外,Excel在加载时会显示进度条,而不是像Web查询那样冻结。
请看我对这个问题的回答: How can I post-process the data from an Excel web query when the query is complete?
这种方法的权衡是,您必须自己处理返回的数据- Excel不会为您将其放在给定的目的地。
在我们尝试了一些与你似乎正在做的事情非常相似的事情后,我们最终走上了这条路线。