问题
I am creating some code where I can click on a single button and it will refresh the querytables that I have on that sheet.
Now, my problem is that I have more code after the fresh that copies some of the information, but this code is being run right after the refresh has started and the information has not yet been replaced.
I want to create a waiting period for the refresh to complete and then the rest of the code can continue.
I don't want to just wait for 5 seconds but for the refreshing period, so that I am not waiting too long or too short, depending on Internet speed etc.
How can I do this?
Edit:
Simple code:
ActiveWorkbook.RefreshAll
Here I need the delay or waiting code till all the refreshing is finished... Then
MsgBox("The Refreshing is Completed!")
Something in that direction. But it can't say the msgbox before it is actually finished.... Sometimes depending on internet speed the refreshing takes shorter or longer, so I want it to be a variable of the actual refreshing time.
回答1:
In the External Data Range Properties of your Web-Query you have a checkbox saying something like "Enable background refresh" which you should uncheck to achieve the desired effect.
Have a look at the bottom of this page: http://www.mrexcel.com/tip103.shtml for pictures
Edit:
Here are two macros that show the desired effect:
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
Execute AddWebquery to add the Query, then execute TestRefreshing to test the effect. You can change the line .BackgroundQuery = False
to True
to have the wrong result.
Testpage with 10 second sleep:
<!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>
回答2:
I've just had a similar issue, and we've solved it by the following:
For i = 1 To ActiveWorkbook.Connections.Count
ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery = False
'MsgBox ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery
Next
ActiveWorkbook.RefreshAll
Like this we're able to make sure all the connections backgroundQuery
property is definately false
before calling the refresh.
回答3:
I was working with a PowerPivot model, and I wanted to Refresh the data before I saved and closed the Model. However, excel just closed the model before the refresh was complete, and the model resumed refreshing on opening.
Adding the following line right after the RefreshAll method, did the trick:
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
I hope it works for you too.
Make sure that you Disable Events to speed things up.
Note that I am using Excel 2010, I am not sure if this method is available in older versions.
回答4:
Uncheck the "Enable Background Refresh" in the Data -> Connection -> Properties
This will disable refresh in background and wait for Refresh to complete.
回答5:
If you want to make your script wait in vba you have to use sleep. But sleep sometimes won't work in Excel vba.
http://99students.com/macro-sleep-vba/
Instead of that try with
Application.Wait (Now + TimeValue("0:01:00"))
Sample Code
Sub Setting_Sleep_Without_Sleep_Function()
MsgBox Now
Application.Wait DateAdd("s", 10, Now)
MsgBox Now
End Sub
回答6:
Another way to go would be to use the Workbooks.Open command to load the URL as a separate workbook instead.
That gives you full access to the data from the web request right after the call finishes. Plus, Excel shows a progress bar while it loads, instead of freezing up like with a Web Query.
See my answer on this question: How can I post-process the data from an Excel web query when the query is complete?
The tradeoff of that approach is you have to manage processing the data you get back yourself - Excel won't put it in a given destination for you.
We ended up going this route after we tried something pretty similar to what you seem to have been doing.
回答7:
ActiveWorkbook.RefreshAll
Do While Application.CalculationState <> xlDone
DoEvents
Loop
I know its an old question, but this worked for me. Also works for waiting while formulas calculate.
回答8:
'From A.G.Johnson@Live.com 2014-08-11 'Here's a simple version that will allow you complete control. 'Instead of using RefreshAll, create the following subroutine: 'Call the routine from your Excl VBA wherever you want to execute it, 'and nothing else happens until it is done. 'Another benefit is that it does not refresh any Pivot tables, so they don't interfere, ' and if you have pivots that rely on the refreshed data, you can run a similar refresh ' for your pivots after the query refresh is completed.
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
回答9:
Try this approach:
With Selection.ListObject.QueryTable
.BackgroundQuery = False
.Refresh
End With
When you put it this following way, the BackgroundQuery = False doesn't seem to change the BackgroundQuery property to False.
Selection.ListObject.QueryTable.Refresh BackgroundQuery = False ' doesn't work
来源:https://stackoverflow.com/questions/8925403/excel-vba-refresh-wait