2016-06-16 7 views
3

Ich habe erstellt VBA-Code, der ein Excel-Blatt aktualisiert, aktualisiert die Datenverbindung und speichert das Excel-Blatt.Capture/Read Nachricht in der Excel-Anwendung Statusleiste angezeigt

Das Problem: Während die Datenverbindung immer noch aktualisiert wird, wechselt der VBA-Code zum nächsten Schritt von Speichern des Excel, und ein Popup-Fenster mit der Aufforderung zum Abbrechen der Aktualisierung wird angezeigt (was nicht der Fall sein sollte) weil die Aktualisierung stattfinden muss und eine Benutzereingabe den Zweck des VBA-Codes vereitelt. Im Folgenden ist ein Ausschnitt:

wkb.Connections("Connection2").Refresh 
    While (InStr(1, Application.DisplayStatusBar, "Running background query") > 0) 

    Wend 
wkb.Save 
wkb.RefreshAll 
    While (InStr(1, Application.StatusBar, "Running background query") > 0) 

    Wend 
wkb.Save 

enter image description here Frage: Wie kann ich diesen Text in der Statusleiste erfassen, so dass ich kann warten, bis es verschwindet? Application.StatusBar tut nicht den Trick.

+0

Würde ein 'DoEvents' Befehl statt einer' While..Wend' Schleife arbeiten? https://support.microsoft.com/en-us/kb/118468 –

+2

Die einfachste Lösung ist, die Hintergrund-Abfrage-Option in den Verbindungseigenschaften zu deaktivieren, wenn es verfügbar ist. – Rory

+0

Ihre erste überprüft, ob die Statusleiste angezeigt wird 'While Application.StatusBar =" Testen von Ddddddd ": DoEvents: Wend' –

Antwort

2

Hier ein paar Dinge zu versuchen:

1) Gehen Sie auf die Verbindungseigenschaften und deaktivieren Sie „Hintergrundaktualisierung aktivieren“. Es sollte warten, bis die Aktualisierung abgeschlossen ist, bevor Sie die nächste Codezeile ausführen. Oder in Code:

ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False 

2) Versuchen Sie, die Methode CalculateUntilAsyncQueriesDone

Connections("CONNECTION_NAME").Refresh 
Application.CalculateUntilAsyncQueriesDone 

Wenn Sie in Excel 2010 arbeiten oder später sollte es warten, bis dies alles geschehen ist.

3) Mögliche dritte Option, nur DoEvents Befehl

Connections("CONNECTION_NAME").Refresh 
DoEvents 
+0

Alex Ds Antwort war sehr hilfreich, aber ich suche nach Möglichkeiten, den Text der Statusleiste zu erfassen. Ich werde zurückschreiben, wenn ich einen Weg finde. –

Verwandte Themen