2010-09-17 12 views
20

Mein Excel-Tool führt eine lange Aufgabe aus, und ich bemühe mich, dem Benutzer gegenüber freundlich zu sein, indem ich einen Fortschrittsbericht in der Statusleiste oder in einer Zelle des Blattes zur Verfügung stelle . Aber der Bildschirm wird nicht aktualisiert oder stoppt die Aktualisierung an einem bestimmten Punkt (z. B. 33%). Die Aufgabe wird schließlich abgeschlossen, aber der Fortschrittsbalken ist nutzlos.Erzwingen einer Bildschirmaktualisierung in Excel VBA

Was kann ich tun, um eine Bildschirmaktualisierung zu erzwingen?

For i=1 to imax ' imax is usually 30 or so 
    fractionDone=cdbl(i)/cdbl(imax) 
    Application.StatusBar = Format(fractionDone, "0%") & "done..." 
    ' or, alternatively: 
    ' statusRange.value = Format(fractionDone, "0%") & "done..." 

    ' Some code....... 

Next i 

Ich verwende Excel 2003

Antwort

30

Fügen Sie eine DoEvents Funktion innerhalb der Schleife hinzu, siehe unten.

Sie können auch sicherstellen, dass die Statusleiste für den Benutzer sichtbar ist, und zurücksetzen, wenn der Code abgeschlossen ist.

Sub ProgressMeter() 

Dim booStatusBarState As Boolean 
Dim iMax As Integer 
Dim i As Integer 

iMax = 10000 

    Application.ScreenUpdating = False 
''//Turn off screen updating 

    booStatusBarState = Application.DisplayStatusBar 
''//Get the statusbar display setting 

    Application.DisplayStatusBar = True 
''//Make sure that the statusbar is visible 

    For i = 1 To iMax ''// imax is usually 30 or so 
     fractionDone = CDbl(i)/CDbl(iMax) 
     Application.StatusBar = Format(fractionDone, "0%") & " done..." 
     ''// or, alternatively: 
     ''// statusRange.value = Format(fractionDone, "0%") & " done..." 
     ''// Some code....... 

     DoEvents 
     ''//Yield Control 

    Next i 

    Application.DisplayStatusBar = booStatusBarState 
''//Reset Status bar display setting 

    Application.StatusBar = False 
''//Return control of the Status bar to Excel 

    Application.ScreenUpdating = True 
''//Turn on screen updating 

End Sub 
+0

das ist eine Menge 'doevents', wenn Sie es auf jeder Schleife tun, stattdessen tun es jede 10 oder so:' wenn ich mod 10 = 0 dann Doevents' –

6

einen Aufruf an DoEvents in der Schleife Put.

Dies wirkt sich auf die Leistung aus, sodass Sie es möglicherweise nur bei jeder z. B. 10. Iteration aufrufen möchten.
Wenn Sie jedoch nur 30 haben, ist das kaum ein Problem.

0

Dies beantwortet Ihre Frage nicht direkt, sondern stellt lediglich eine Alternative zur Verfügung. Ich habe in den vielen langen Excel-Berechnungen die meiste Zeit festgestellt, dass die Excel-Werte auf dem Bildschirm warten. Wenn dies der Fall ist, könnten Sie den folgenden Code an der Vorderseite des Unter einfügen:

Application.ScreenUpdating = False 
Application.EnableEvents = False 

und setzen dies als das Ende

Application.ScreenUpdating = True 
Application.EnableEvents = True 

ich gefunden habe, dass dies oft beschleunigt was Code Ich arbeite mit so viel, dass es unnötig ist, den Benutzer auf den Fortschritt aufmerksam zu machen. Es ist nur eine Idee, die Sie ausprobieren sollten, und ihre Effektivität ist ziemlich abhängig von Ihrem Blatt und Ihren Berechnungen.

+0

gute info ... thx – ZEE

8

Textfelder in Arbeitsblättern werden manchmal nicht aktualisiert , wenn ihre Text oder Formatierung geändert wird, und sogar der DoEvent-Befehl nicht hilft.

Da es in Excel keinen Befehl gibt, ein Arbeitsblatt in der Weise zu aktualisieren, wie ein Benutzerformular aktualisiert werden kann, ist es erforderlich, mit einem Trick Excel zum Aktualisieren des Bildschirms zu zwingen.

die folgenden Befehle scheinen den Trick zu tun:

- ActiveSheet.Calculate  
- ActiveWindow.SmallScroll  
- Application.WindowState = Application.WindowState 
+0

Hatte das Problem mit einem Formular heute. Das Formular und das Blatt wurden nicht mehr aktualisiert. das Hinzufügen des application.windowstate tricks alle paar Iterationen hat mein Problem gelöst. –

+1

funktionierte für mich mit 'ActiveWindow.SmallScroll nach unten: = 1'' ActiveWindow.SmallScroll nach oben: = 1' – Hubisan

0

Insbesondere wenn Sie mit einem Userform zu tun haben, dann könnten Sie die Repaint Methode versuchen. Möglicherweise tritt ein Problem mit DoEvents auf, wenn Sie Ereignisauslöser in Ihrem Formular verwenden. Zum Beispiel werden alle während der Ausführung einer Funktion gedrückten Tasten von DoEvents gesendet. Die Tastatureingabe wird verarbeitet, bevor der Bildschirm aktualisiert wird. Wenn Sie also Zellen in einer Tabelle ändern, halten Sie eine der Pfeiltasten auf der Tastatur gedrückt , dann wird das Zellenänderungsereignis fortgesetzt, bevor die Hauptfunktion beendet wird.

Ein UserForm wird in einigen Fällen nicht aktualisiert, weil DoEvents die Ereignisse auslöst; Repaint aktualisiert jedoch das UserForm und der Benutzer wird die Änderungen auf dem Bildschirm anzeigen, auch wenn ein anderes Ereignis unmittelbar auf das vorherige Ereignis folgt.

in dem Userform-Code ist es so einfach wie:

Me.Repaint 
-3

schreiben DoEvents kurz vor der Linie, wo Sie die Benutzeroberfläche aktualisieren, sollte es funktionieren.

+5

Welchen Wert fügt diese Antwort den anderen hinzu, die vor 4-5 Jahren geschrieben wurden? –