2008-09-09 15 views
3

Ich habe einen Datenbank-Berichtgenerator in Excel erstellt. Ich versuche, ein Dialogfeld zu erstellen, das Statusinformationen anzeigt, während das Programm ausgeführt wird.Wie erstelle ich ein Statusdialogfeld in Excel

Wenn ich den Bericht erzeuge, obwohl das Dialogfeld angezeigt wird, kann ich die angezeigten Informationen nicht aktualisieren/aktualisieren. In den meisten Fällen wird das Dialogfeld nur teilweise angezeigt. Ich habe versucht, die .repaint-Methode zu verwenden, aber ich bekomme immer noch die gleichen Ergebnisse. Ich sehe nur das vollständige Dialogfeld, nachdem der Bericht generiert wurde.

Antwort

2

Der folgende Code funktioniert gut, wenn Sie Aktionen in Excel (XP oder höher) ausführen.

Für Aktionen, die außerhalb Excel erfolgen, beispielsweise zu einer Datenbank verbinden und Abrufen von Daten der beste dies bietet, ist die Möglichkeit, Dialoge vor und nach der Aktion zu zeigen (zB „Getting data“, „Got Daten“)

erstellen Sie ein Formular "frmStatus" genannt, ein Label auf die Form setzen genannt "Label1".

Festlegen der Formulareigenschaft 'ShowModal' = false, damit der Code ausgeführt werden kann, 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 
0

Das Dialogfeld wird auch auf demselben UI-Thread ausgeführt. Es ist also zu beschäftigt, sich neu zu streichen. Nicht sicher, ob VBA über gute Multi-Threading-Funktionen verfügt.

4

Ich habe die eigene 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 über den Fortschritt anzeigen möchten und die Notwendigkeit eines Aktualisierungsdialogs überhaupt vermeidet.

Ok @JonnyGold, hier ist ein Beispiel für die Art von Sache, die ich verwendet ...

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!

+0

Bitte können Sie ein Beispiel hinzufügen, danke. – JonnyGold

6

Versuchen Sie, eine DoEvents Anruf in Ihre Schleife hinzuzufügen. Das sollte ermöglichen, dass das Formular & andere Anforderungen erneut zu zeichnen.

2

ein leeres Blatt in Ihrer Arbeitsmappe Legen das Blatt zB Umbenennen. "Informationen"

Sheets("information").Select 
Range("C3").Select 
ActiveCell.FormulaR1C1 = "Updating Records" 
Application.ScreenUpdating = False 
Application.Wait Now + TimeValue("00:00:02") 

Weiter Makro

Sheets("information").Select 
Range("C3").Select 
Application.ScreenUpdating = True 
ActiveCell.FormulaR1C1 = "Preparing Information" 
Application.ScreenUpdating = False 
Application.Wait Now + TimeValue("00:00:02") 

Weiter Makro

Etc Alternativ eine leere Zelle irgendwo auf dem vorhandenen Blatt auswählen, anstatt ein neues Blatt einfügen

Range("C3").Select 
ActiveCell.FormulaR1C1 = "Updating Records" 
Application.ScreenUpdating = False 
Application.Wait Now + TimeValue("00:00:02") 

usw.