Wie erstelle ich ein Statusdialogfeld in Excel?
Frage
Ich habe einen Datenbankberichtgenerator in Excel erstellt.Ich versuche, ein Dialogfeld zu erstellen, das Statusinformationen anzeigt, während das Programm ausgeführt wird.
Wenn ich den Bericht erstelle, erscheint zwar das Dialogfeld, ich kann die angezeigten Informationen jedoch nicht aktualisieren/aktualisieren.Meistens wird das Dialogfeld nur teilweise angezeigt.Ich habe versucht, die .repaint-Methode zu verwenden, erhalte aber immer noch die gleichen Ergebnisse.Ich sehe das vollständige Dialogfeld erst, nachdem der Bericht erstellt wurde.
Lösung
Der folgende Code funktioniert gut, wenn Sie Aktionen in Excel (XP oder höher) ausführen.
Für Aktionen, die außerhalb von Excel stattfinden, zum Beispiel das Herstellen einer Verbindung zu einer Datenbank und das Abrufen von Daten, bietet dies vor allem die Möglichkeit, Dialoge vor und nach der Aktion anzuzeigen (z. B. „Daten abrufen“, „Daten erhalten“)
Erstellen Sie ein Formular mit dem Namen „frmStatus“, versehen Sie das aufgerufene Formular mit einem Etikett „Label1“.
Legen Sie die Formulareigenschaft fest 'ShowModal' = false, Dadurch kann der Code ausgeführt werden, während das Formular angezeigt wird.
Sub ShowForm_DoSomething()
Load frmStatus
frmStatus.Label1.Caption = "Starting"
frmStatus.Show
frmStatus.Repaint
'Load the form and set text
frmStatus.Label1.Caption = "Doing something"
frmStatus.Repaint
'code here to perform an action
frmStatus.Label1.Caption = "Doing something else"
frmStatus.Repaint
'code here to perform an action
frmStatus.Label1.Caption = "Finished"
frmStatus.Repaint
Application.Wait (Now + TimeValue("0:00:01"))
frmStatus.Hide
Unload frmStatus
'hide and unload the form
End Sub
Andere Tipps
Versuchen Sie, ein hinzuzufügen DoEvents Rufen Sie in Ihrer Schleife auf.Dadurch sollte das Formular neu gezeichnet und andere Anfragen akzeptiert werden können.
Ich habe die Statusleiste von Excel (unten links im Fenster) verwendet, um Fortschrittsinformationen für eine ähnliche Anwendung anzuzeigen, die ich in der Vergangenheit entwickelt habe.
Es funktioniert sehr gut, wenn Sie nur Textaktualisierungen zum Fortschritt anzeigen möchten, und vermeidet überhaupt die Notwendigkeit eines Aktualisierungsdialogs.
Ok @JonnyGold, hier ist ein Beispiel für die Art von Dingen, die ich verwendet habe ...
Sub StatusBarExample()
Application.ScreenUpdating = False
' turns off screen updating
Application.DisplayStatusBar = True
' makes sure that the statusbar is visible
Application.StatusBar = "Please wait while performing task 1..."
' add some code for task 1 that replaces the next sentence
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = "Please wait while performing task 2..."
' add some code for task 2 that replaces the next sentence
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = False
' gives control of the statusbar back to the programme
End Sub
Hoffe das hilft!
Fügen Sie ein leeres Blatt in Ihr Arbeitsmappen ein, um das Blatt umbenennen, z."Information"
Sheets("information").Select
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Makro fortsetzen
Sheets("information").Select
Range("C3").Select
Application.ScreenUpdating = True
ActiveCell.FormulaR1C1 = "Preparing Information"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Makro fortsetzen
Usw. Wählen Sie alternativ eine leere Zelle irgendwo auf dem vorhandenen Blatt aus, anstatt ein neues Blatt einzuführen
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Usw
Das Dialogfeld wird auch im selben UI-Thread ausgeführt.Es ist also zu beschäftigt, sich selbst neu zu streichen.Ich bin mir nicht sicher, ob VBA über gute Multithreading-Fähigkeiten verfügt.