Ich erstelle Code, in dem ich auf eine einzelne Schaltfläche klicken kann. Dadurch werden die Abfragetabellen aktualisiert, die ich auf diesem Blatt habe.
Mein Problem ist nun, dass ich nach dem Aktualisieren mehr Code habe, der einige Informationen kopiert. Dieser Code wird jedoch unmittelbar nach dem Start der Aktualisierung ausgeführt, und die Informationen wurden noch nicht ersetzt.
Ich möchte eine Wartezeit erstellen, bis die Aktualisierung abgeschlossen ist, und der Rest des Codes kann fortgesetzt werden.
Ich möchte nicht nur 5 Sekunden warten, sondern auf die Auffrischungsphase, sodass ich nicht zu lange oder zu kurz warte, je nach Internetgeschwindigkeit usw.
Wie kann ich das machen?
Bearbeiten:
Einfacher Code:
ActiveWorkbook.RefreshAll
Hier brauche ich die Verzögerung oder den Wartecode, bis die Aktualisierung abgeschlossen ist ... Dann
MsgBox("The Refreshing is Completed!")
Etwas in diese Richtung. Es kann jedoch nicht die msgbox sagen, bevor sie tatsächlich beendet ist ... Je nach Geschwindigkeit des Internets dauert das Aktualisieren kürzer oder länger, daher möchte ich, dass es eine Variable der tatsächlichen Aktualisierungszeit ist.
In den Eigenschaften des externen Datenbereichs Ihrer Web-Abfrage haben Sie ein Kontrollkästchen mit der Aufschrift "Hintergrundaktualisierung aktivieren", das Sie deaktivieren sollten, um den gewünschten Effekt zu erzielen.
Schauen Sie unten auf dieser Seite nach: http://www.mrexcel.com/tip103.shtml für Bilder
Bearbeiten:
Hier sind zwei Makros, die den gewünschten Effekt zeigen:
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
Führen Sie AddWebquery aus, um die Abfrage hinzuzufügen, und führen Sie dann TestRefreshing aus, um den Effekt zu testen. Sie können die Zeile .BackgroundQuery = False
in True
ändern, um das falsche Ergebnis zu erhalten.
Testseite mit 10 Sekunden Schlaf:
<!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>
Ich hatte gerade ein ähnliches Problem und wir haben es folgendermaßen gelöst:
For i = 1 To ActiveWorkbook.Connections.Count
ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery = False
'MsgBox ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery
Next
ActiveWorkbook.RefreshAll
Auf diese Weise können wir sicherstellen, dass die backgroundQuery
-Eigenschaft aller Verbindungen definitiv false
ist, bevor die Aktualisierung aufgerufen wird.
Ich arbeitete mit einem PowerPivot-Modell und wollte die Daten vor dem Speichern und Schließen des Modells aktualisieren. Das Modell wurde jedoch erst geschlossen, bevor die Aktualisierung abgeschlossen war, und das Modell wurde beim Öffnen fortgesetzt.
Wenn Sie die folgende Zeile direkt nach der RefreshAll-Methode hinzufügen, wurde der Trick ausgeführt:
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Ich hoffe es funktioniert auch für dich.
Stellen Sie sicher, dass Sie Ereignisse deaktivieren, um die Abläufe zu beschleunigen.
Beachten Sie, dass ich Excel 2010 verwende. Ich bin nicht sicher, ob diese Methode in älteren Versionen verfügbar ist.
Eine andere Möglichkeit wäre die Verwendung des Befehls Workbooks.Open, um die URL stattdessen als separate Arbeitsmappe zu laden.
So haben Sie sofort nach Beendigung des Anrufs vollen Zugriff auf die Daten der Webanforderung. Außerdem zeigt Excel während des Ladevorgangs eine Fortschrittsleiste, anstatt wie bei einer Webabfrage einfrieren.
Siehe meine Antwort zu dieser Frage: Wie kann ich die Daten einer Excel-Webabfrage nachverarbeiten, wenn die Abfrage abgeschlossen ist?
Der Kompromiss bei diesem Ansatz besteht darin, dass Sie die Verarbeitung der Daten, die Sie zurückerhalten, selbst verwalten müssen - Excel legt sie nicht an einem bestimmten Ort ab.
Wir sind diesen Weg gegangen, nachdem wir etwas Ähnliches ausprobiert haben, was Sie anscheinend getan haben.
'Von [email protected] 2014-08-11 ' Hier ist eine einfache Version, mit der Sie die vollständige Kontrolle haben. __ 'Anstelle RefreshAll erstellen Sie die folgende Subroutine: ' Rufen Sie die Routine von auf Ihre Excl VBA, wo immer Sie sie ausführen möchten, 'und nichts anderes passiert, bis sie fertig ist .' Ein weiterer Vorteil ist, dass keine Pivot-Tabellen aktualisiert werden, sodass sie nicht eingreifen. Wenn Sie über Pivots verfügen, die auf den aktualisierten Daten basieren, können Sie eine ähnliche Aktualisierung durchführen ' für Ihre Pivots, nachdem die Abfrageaktualisierung abgeschlossen ist.
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
ActiveWorkbook.RefreshAll
Do While Application.CalculationState <> xlDone
DoEvents
Loop
Ich weiß, es ist eine alte Frage, aber das hat bei mir funktioniert. Auch funktioniert das Warten, während Formeln berechnet werden.
Wenn Sie Ihr Skript in VBA warten lassen möchten, müssen Sie sleep verwenden. Aber Schlaf funktioniert manchmal nicht in Excel VBA.
http://99students.com/macro-sleep-vba/
Stattdessen versuche es mit
Application.Wait (Now + TimeValue("0:01:00"))
Beispielcode
Sub Setting_Sleep_Without_Sleep_Function()
MsgBox Now
Application.Wait DateAdd("s", 10, Now)
MsgBox Now
End Sub
Versuchen Sie diesen Ansatz:
With Selection.ListObject.QueryTable
.BackgroundQuery = False
.Refresh
End With
Wenn Sie dies folgendermaßen formulieren, scheint die BackgroundQuery-Eigenschaft in Background nicht zu False zu ändern.
Selection.ListObject.QueryTable.Refresh BackgroundQuery = False ' doesn't work