Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: RefreshAll

RefreshAll
Dieter
Morgen zusammen,
ich habe ein Makro, das als erstes mit dem Befehl ActiveWorkbook.RefreshAll
Daten aus einer SQL-Tabelle holt.
Die Aktion dauert ein paar Sekunden.
In der Zwischenzeit ist mein Makro mit den weiteren Berechnungen der Daten schon fertig.
Wie kann ich mein Makro dazu bringen, solange zu warten, bis "ActiveWorkbook.RefreshAll" abgeschlossen ist ?
Gruß Dieter
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: RefreshAll
11.02.2011 09:43:39
Holger,
Hallo,
ich weiß nicht wie du die SQl Daten holst, aber ich mache das mit
Call ShellWait 
Hier die Function, vielleicht hilft dir das. Mit Application.Wait würde
ich nicht arbeiten.
Public Function ShellWait(ByVal Exec As String, _
Optional WindowStyle As VbAppWinStyle = vbMinimizedFocus) _
As Long
Dim nTaskId As Long
Dim nHProcess As Long
Dim nExitCode As Long
Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400
Application.StatusBar = "SQL Abfrage wird ausgeführt ..."
nTaskId = Shell(Exec, WindowStyle)
nHProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, nTaskId)
Do
DoEvents
GetExitCodeProcess nHProcess, nExitCode
Loop While nExitCode = STILL_ACTIVE
CloseHandle nHProcess
ShellWait = nExitCode
Application.StatusBar = "SQL Abfrage erfolgreich ausgeführt!"
End Function

Anzeige
AW: RefreshAll
11.02.2011 10:13:36
Dieter
Hallo,
ich habe mir eine Abfrage "gebaut".
Daten, Aus anderen Quelle, von Microsoft Query.
Wenn ich dann in der Menüleiste auf Daten aktualisieren Klicke (= ActiveWorkbook.RefreshAll) werden die Daten geholt, allerdings zu langsam für mein Makro.
GD
AW: RefreshAll
11.02.2011 10:24:15
Holger,
Ach so. Ok dann setze ich auf Offen,
weil damit kenne ich mich nicht aus.
Einziger Gedanke: Application.Wait wenn du ungefähr weißt,
wie lang es dauern wird, aber das ist wie geschrieben eigentlich großer
Schwachsinn.
Anzeige
AW: RefreshAll
12.02.2011 06:27:29
fcs
Hallo Dieter,
es gibt meines Wissens unter VBA keine Möglichkeit festzustellen, ob die Aktualisierung aller Abfragen abgeschlossen ist.
Die einzige Möglichkeit, die ich sehe, wäre nach der RefreshAll-Anweisung die weitere Bearbeitung per Makro zeitverzögert zu starten. Alternativ die Aktualisierung der Abfragen und die anschliessende Aufbereitung der Daten per Makro getrennt manuell zu starten.
Gruß
Franz
Sub DatenAktualisieren()
ActiveWorkbook.RefreshAll
'Zeitverzögerte Ausführung der weiteren Aktualisierung - hier 5 Sekunden
Application.OnTime earliesttime:=Now + TimeSerial(Hour:=0, Minute:=0, Second:=5), _
Procedure:="DatenAktualisierenTeil2"
Application.StatusBar = "Achtung Datenaktualisierung läuft noch!"
End Sub
Sub DatenAktualisierenTeil2()
MsgBox "Jetzt werden Daten aufbereitet!" 'Testzeile
'Hier dann die weiteren Anweisungen zur Datenaufbereitung
Application.StatusBar = False
End Sub

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Excel VBA Refresh All: So wartest Du auf die Aktualisierung


Schritt-für-Schritt-Anleitung

  1. Verwende ActiveWorkbook.RefreshAll: Dieser Befehl aktualisiert alle Datenquellen in dem aktiven Workbook. Beispiel:

    ActiveWorkbook.RefreshAll
  2. Warten auf die Aktualisierung: Um sicherzustellen, dass Dein Makro wartet, bis die Aktualisierung abgeschlossen ist, kannst Du die Funktion ShellWait verwenden. Hier ist eine einfache Implementierung:

    Public Function ShellWait(ByVal Exec As String, _
    Optional WindowStyle As VbAppWinStyle = vbMinimizedFocus) _
    As Long
       Dim nTaskId As Long
       Dim nHProcess As Long
       Dim nExitCode As Long
       Const STILL_ACTIVE = &H103
       Const PROCESS_QUERY_INFORMATION = &H400
       Application.StatusBar = "SQL Abfrage wird ausgeführt ..."
       nTaskId = Shell(Exec, WindowStyle)
       nHProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, nTaskId)
       Do
           DoEvents
           GetExitCodeProcess nHProcess, nExitCode
       Loop While nExitCode = STILL_ACTIVE
       CloseHandle nHProcess
       ShellWait = nExitCode
       Application.StatusBar = "SQL Abfrage erfolgreich ausgeführt!"
    End Function
  3. Verwende Application.OnTime: Wenn Du die Datenaktualisierung zeitlich verzögert starten möchtest, kannst Du den folgenden Code verwenden:

    Sub DatenAktualisieren()
       ActiveWorkbook.RefreshAll
       ' Zeitverzögerte Ausführung der weiteren Aktualisierung - hier 5 Sekunden
       Application.OnTime earliesttime:=Now + TimeSerial(Hour:=0, Minute:=0, Second:=5), _
       Procedure:="DatenAktualisierenTeil2"
       Application.StatusBar = "Achtung Datenaktualisierung läuft noch!"
    End Sub
    
    Sub DatenAktualisierenTeil2()
       MsgBox "Jetzt werden Daten aufbereitet!" ' Testzeile
       ' Hier dann die weiteren Anweisungen zur Datenaufbereitung
       Application.StatusBar = False
    End Sub

Häufige Fehler und Lösungen

  • Fehler: Excel Refresh All not working
    Lösung: Überprüfe, ob die Datenquellen korrekt verbunden sind. Manchmal hilft es, die Datenverbindung zu aktualisieren oder die Abfrage neu zu erstellen.

  • Fehler: ActiveWorkbook.RefreshAll wait funktioniert nicht
    Lösung: Stelle sicher, dass Du die richtige Syntax verwendest und die Funktion ShellWait korrekt implementiert ist.


Alternative Methoden

  • Manuelle Aktualisierung: Du kannst auch die Daten manuell über das Menü Daten > Alle Aktualisieren aktualisieren, wenn Du keine VBA-Lösungen verwenden möchtest.

  • Verwendung von ThisWorkbook.RefreshAll: Wenn Du die Aktualisierung in einem bestimmten Workbook durchführen möchtest, kannst Du ThisWorkbook.RefreshAll verwenden.


Praktische Beispiele

  • Daten aus SQL abfragen: Wenn Du Daten aus einer SQL-Datenbank abfragen möchtest, kannst Du das folgende Beispiel verwenden:

    Sub SQLDatenAktualisieren()
       ActiveWorkbook.RefreshAll
       ' Hier kann weitere Logik folgen, die auf die aktualisierten Daten zugreift
    End Sub
  • Warten bis die Aktualisierung abgeschlossen ist: Nutze die ShellWait Funktion, um sicherzustellen, dass Dein Makro nicht vorzeitig fortfährt.


Tipps für Profis

  • Verwende DoEvents: Um die Reaktionsfähigkeit Deines Makros zu erhöhen, verwende DoEvents in Schleifen, um Excel nicht zu blockieren.

  • Fehlerbehandlung einbauen: Implementiere Fehlerbehandlungsroutinen, um unerwartete Probleme bei der Datenaktualisierung zu lösen. Hier ein Beispiel:

    On Error GoTo Fehlerbehandlung
    ActiveWorkbook.RefreshAll
    Exit Sub
    
    Fehlerbehandlung:
    MsgBox "Ein Fehler ist aufgetreten: " & Err.Description

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass ActiveWorkbook.RefreshAll abgeschlossen ist?
Du kannst die ShellWait Funktion verwenden, um zu warten, bis der Prozess abgeschlossen ist.

2. Was mache ich, wenn Excel Refresh All nicht funktioniert?
Überprüfe die Verbindungen zu den Datenquellen und stelle sicher, dass alle Abfragen korrekt konfiguriert sind.

3. Gibt es eine Möglichkeit, die Aktualisierung in bestimmten Zeitintervallen durchzuführen?
Ja, Du kannst die Application.OnTime Methode verwenden, um die Aktualisierung in festgelegten Intervallen auszuführen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige