🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA StatusBar in Excel — Makrofortschritt ohne UserForm anzeigen (und die Nachricht, die für immer hängen bleibt)

|

VBA StatusBar in Excel — Makrofortschritt ohne UserForm anzeigen (und die Nachricht, die für immer hängen bleibt)

TL;DRApplication.StatusBar = "..." schreibt Ihren eigenen Text in die Leiste am unteren linken Rand des Excel-Fensters. Es ist die leichtestmögliche Fortschrittsanzeige — eine Zeile, kein UserForm, kein Flackern, und sie übersteht ScreenUpdating = False. Der Haken ist das Zurücksetzen: Was Sie geschrieben haben, bleibt nach dem Ende des Makros dort hängen, bis Sie die Leiste mit Application.StatusBar = False (nicht mit einem leeren String) an Excel zurückgeben. Stellen Sie sie in einem Fehlerhandler wieder her, damit ein Absturz keine veraltete Nachricht am Fenster angeheftet lässt:

Sub LongJob()
    Application.ScreenUpdating = False
    On Error GoTo CleanExit
    Dim i As Long, n As Long
    n = 10000
    For i = 1 To n
        ' ... Arbeit an Zeile i erledigen ...
        If i Mod 250 = 0 Then
            Application.StatusBar = "Processing " & i & " of " & n & " (" & Int(i / n * 100) & "%)"
        End If
    Next i
CleanExit:
    Application.StatusBar = False        ' die Leiste an Excel zurueckgeben - NICHT als "" lassen
    Application.ScreenUpdating = True
End Sub

Wenn ein Makro länger als ein, zwei Sekunden läuft, ist die erste Frage des Benutzers „lebt das Ding noch?“. Die Statusleiste beantwortet sie zum Preis einer einzigen Zeile. Diese Anleitung ruht auf einer Idee — die Statusleiste ist geliehen: Sie schreiben hinein, und Sie müssen sie zurückgeben. Excel holt sie sich nicht von selbst zurück, sodass der ganze Unterschied zwischen einer professionellen Fortschrittsanzeige und einem Fenster, in das ein eingefrorenes „Processing 73%...“ eingebrannt ist, eine einzige Zurücksetz-Zeile ausmacht.

Was Sie lernen

  • Das mentale Modell — die Statusleiste gehört Excel, Sie leihen sie sich und müssen sie zurückgeben
  • Das Schreib-und-Zurücksetz-Muster und warum = False besser ist als = ""
  • Die Fortschritts-Prozent-Redewendung, die „wie lange noch?“ beantwortet
  • Warum sich der Text in einer engen Schleife nicht aktualisiert — und wo DoEvents hineinpasst
  • Wann der Einzeiler genügt und wann eine echte UserForm-Fortschrittsleiste ihren Aufwand rechtfertigt
  • Wie sie mit ScreenUpdating und der CleanExit-Wiederherstellung zusammenspielt

Das mentale Modell: die Leiste gehört Excel

Standardmäßig verwaltet Excel den Streifen am unteren linken Rand des Fensters. Er zeigt „Bereit“ oder „Berechnen“ oder die Summe Ihrer ausgewählten Zellen. Wenn Sie Application.StatusBar einen String zuweisen, übernehmen Sie diesen Platz — Excel postet dort keine eigenen Meldungen mehr und zeigt stattdessen Ihre an. Von diesem Moment an gehört die Leiste Ihnen, bis Sie sie zurückgeben.

Das Zurückgeben ist eine Zeile: Application.StatusBar = False. Das löscht nicht nur den Text — es gibt Excel die Kontrolle zurück, sodass die Leiste wieder „Bereit“ und dergleichen anzeigt. Das ist die eine Tatsache, über die jeder stolpert, daher lohnt es sich, sie klar auszusprechen:

Application.StatusBar = "Working..."   ' jetzt gehoert die Leiste Ihnen
Application.StatusBar = False          ' Sie geben sie zurueck; Excel verwaltet sie wieder

Warum False, nicht ein leerer String

Der Instinkt, wenn Sie fertig sind, ist, die Meldung zu löschen: Application.StatusBar = "". Das sieht sauber aus und ist falsch. Ein leerer String ist immer noch Ihre Nachricht — eine leere. Excel weicht Ihnen weiter aus, sodass die Leiste leer bleibt und nie zurückkehrt zu „Bereit“ oder der Summe der Auswahl. Es ist derselbe Bug wie zurückgelassener veralteter Text, nur schwerer zu bemerken, weil das Symptom eine verdächtig stumme Statusleiste ist statt einer sichtbaren eingefrorenen Meldung.

Application.StatusBar = False ist die einzige Zuweisung, die sagt „ich bin fertig, nimm sie zurück“. Machen Sie es zum Reflex: Die Zeile, die die Statusleiste einschaltet, hat ein passendes = False im CleanExit-Handler, genau wie ScreenUpdating = True es hat.

Die Fortschritts-Prozent-Redewendung

Der Grund, warum Leute nach einer „VBA-Fortschrittsleiste“ suchen, ist fast immer dieser: eine Schleife, die lange genug läuft, dass der Benutzer sehen muss, wie sie sich bewegt. Die Statusleiste leistet das ohne zusätzliche UI:

Dim i As Long, n As Long
n = UBound(data)
For i = 1 To n
    ' ... Arbeit ...
    If i Mod 100 = 0 Then
        Application.StatusBar = "Row " & i & " of " & n & " - " & Format(i / n, "0%")
    End If
Next i

Zwei Details lassen es sich richtig anfühlen. Erstens: in einem Intervall aktualisieren (i Mod 100 = 0), nicht bei jeder Iteration — die Statusleiste 10.000 Mal zu beschreiben ist selbst langsam, und der Benutzer kann Zahlen, die so schnell vorbeifliegen, nicht lesen. Zweitens: Fortschritt in Bezug auf ein Gesamt anzeigen (i von n, ein Prozentwert), nicht bloß einen Spinner, damit der Benutzer abschätzen kann, wie lange es noch dauert. Das ist der Unterschied zwischen „irgendetwas passiert“ und „Sie sind zu zwei Dritteln fertig“.

Warum sich der Text nicht aktualisiert — und wo DoEvents hineinpasst

Hier ist die Falle, die Leute in die Foren treibt: Sie setzen Application.StatusBar in einer Schleife, und der Text ändert sich auf dem Bildschirm nie — er zeigt den ersten Wert und friert ein, obwohl Ihr Code ihn eindeutig neu zuweist. Die Statusleiste zeichnet sich, wie alles andere, erst dann neu, wenn Excel einen Moment bekommt, um seine Nachrichtenwarteschlange abzuarbeiten. Eine enge VBA-Schleife gibt diesen Moment nie her, sodass das Neuzeichnen nie geschieht.

Die Lösung ist DoEvents — es gibt Excel kurz die Kontrolle zurück, sodass sich die Leiste tatsächlich neu zeichnet:

If i Mod 100 = 0 Then
    Application.StatusBar = "Row " & i & " of " & n
    DoEvents                      ' Excel die Leiste neu zeichnen lassen
End If

Verwenden Sie es im selben Intervall wie die Aktualisierung, nicht bei jeder Iteration — DoEvents hat seine eigenen Kosten und Re-Entrancy-Risiken. Und beachten Sie: Dies ist die eine Stelle, an der sich die Statusleiste besser verhält als ein UserForm unter ScreenUpdating = False: Die Statusleiste aktualisiert sich problemlos bei abgeschalteter Bildschirmaktualisierung, während eine UserForm-Fortschrittsleiste ein ausdrückliches .Repaint braucht.

Wann der Einzeiler genügt — und wann nicht

Für die große Mehrheit der Makros ist Application.StatusBar die richtige Fortschrittsanzeige, und zu einem UserForm zu greifen ist Over-Engineering. Es ist eine Zeile, es stiehlt keinen Fokus, es flackert nicht, und es verträgt sich mit ScreenUpdating = False. Ziehen Sie es standardmäßig vor.

Eine UserForm-Fortschrittsleiste rechtfertigt ihren zusätzlichen Code nur, wenn Sie ausdrücklich etwas brauchen, das die Statusleiste nicht geben kann: eine grafische sich füllende Leiste, eine Abbrechen-Schaltfläche, eine mehrzeilige Aufschlüsselung oder Branding in einem Dialog, den der Benutzer nicht übersehen kann. Das sind manchmal echte Bedürfnisse — aber sie sind die Ausnahme, und sie bringen Fokus-, Neuzeichen- und Modalitäts-Kopfschmerzen mit sich, die die Statusleiste komplett umgeht. Beachten Sie zudem, dass Application.DisplayStatusBar True sein muss, damit die Leiste überhaupt sichtbar ist; hat ein früheres Makro oder eine Einstellung sie ausgeblendet, wird Ihr Text zwar geschrieben, aber nicht angezeigt.

Wie ExcelMaster hilft

Eine gute Fortschrittsanzeige ist eine Zeile zum Schreiben und eine Zeile zum Zurücksetzen, plus das Urteilsvermögen, in einem Intervall zu aktualisieren, DoEvents nur dort hinzuzufügen, wo sich die Leiste neu zeichnen muss, und mit = False in einem Fehlerhandler wiederherzustellen, damit ein Absturz keine veraltete Nachricht am Fenster anheftet. Verpassen Sie das Zurücksetzen, liefern Sie eine Arbeitsmappe aus, die für immer „Processing 47%...“ anzeigt.

ExcelMaster verdrahtet das für Sie. Bitten Sie es, „den Fortschritt anzuzeigen, während dies über 50.000 Zeilen läuft“, und es schreibt den Prozentwert in einem sinnvollen Intervall in die Statusleiste, kombiniert ihn mit DoEvents, damit er sich tatsächlich bewegt, und setzt die Leiste mit Application.StatusBar = False in derselben CleanExit-Wiederherstellung wie ScreenUpdating zurück — so bekommen Sie eine Fortschrittsanzeige, die sich benimmt und hinter sich aufräumt.

Häufig gestellte Fragen

Wie zeige ich in Excel VBA eine Fortschrittsleiste an?

Der leichteste Weg ist Application.StatusBar = "...", das Ihren Text in die Leiste am unteren linken Rand des Fensters schreibt — kein UserForm nötig. Aktualisieren Sie sie in einem Intervall innerhalb Ihrer Schleife (zum Beispiel If i Mod 100 = 0 Then), zeigen Sie den Fortschritt als „Zeile i von n“ oder als Prozentwert an, und setzen Sie sie mit Application.StatusBar = False zurück, wenn Sie fertig sind. Eine grafische UserForm-Fortschrittsleiste lohnt den zusätzlichen Code nur, wenn Sie eine sich füllende Leiste oder eine Abbrechen-Schaltfläche brauchen.

Wie setze ich Application.StatusBar in VBA zurück?

Setzen Sie Application.StatusBar = False. Das gibt die Kontrolle über die Leiste an Excel zurück, sodass es wieder „Bereit“ und seine eigenen Meldungen anzeigt. Verwenden Sie nicht Application.StatusBar = "" — ein leerer String ist immer noch Ihre Nachricht, sodass Excel Ihnen weiter ausweicht und die Leiste leer bleibt, statt zum normalen Verhalten zurückzukehren.

Warum aktualisiert sich mein Statusleisten-Text nicht, während das Makro läuft?

Weil eine enge VBA-Schleife Excel nie seine Nachrichtenwarteschlange abarbeiten lässt, sodass sich die Leiste nie neu zeichnet. Fügen Sie DoEvents direkt nach dem Setzen des Textes ein (im selben Intervall wie die Aktualisierung), um Excel einen Moment zu geben, ihn neu zu zeichnen. Anders als eine UserForm-Fortschrittsleiste aktualisiert sich die Statusleiste bei ScreenUpdating = False korrekt.

Funktioniert die Statusleiste bei abgeschaltetem ScreenUpdating?

Ja. Application.StatusBar aktualisiert sich selbst dann, wenn Application.ScreenUpdating = False ist, was einer der Gründe ist, warum sie für lange Makros ein besserer Standard ist als eine UserForm-Fortschrittsleiste. Möglicherweise brauchen Sie trotzdem DoEvents, damit sich der Text in einer engen Schleife neu zeichnet. Stellen Sie außerdem sicher, dass Application.DisplayStatusBar True ist, sonst ist die Leiste ausgeblendet und Ihr Text erscheint nicht.

StatusBar oder eine UserForm-Fortschrittsleiste — was sollte ich nehmen?

Nutzen Sie Application.StatusBar für fast alles: eine Zeile, kein Flackern, kein Fokusklau, und sie übersteht ScreenUpdating = False. Bauen Sie eine UserForm-Fortschrittsleiste nur, wenn Sie ausdrücklich eine grafische sich füllende Leiste, eine Abbrechen-Schaltfläche oder einen mehrzeiligen Status brauchen, den die einzeilige Leiste nicht zeigen kann.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 18.08.2026.

Verwandte Anleitungen: VBA DoEvents · VBA DisplayAlerts · VBA ScreenUpdating · VBA On Error · VBA MsgBox