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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top