webentwicklung-frage-antwort-db.com.de

Excel VBA-Aktualisierung warten

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. 

17
dave123

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>
9
DKSan

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.

7
RemarkLima

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.

7
Ejaz Ahmed

Deaktivieren Sie das Kontrollkästchen "Hintergrundaktualisierung aktivieren" in Daten -> Verbindung -> Eigenschaften

Dies deaktiviert die Aktualisierung im Hintergrund und wartet, bis die Aktualisierung abgeschlossen ist.

 enter image description here

1
Ashish Chandra

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.

0
mcw0933

'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
0
A.G.Johnson
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.

0
DDuffy

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
0
Krishna

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
0
ggv