TL;DR —
Application.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 überstehtScreenUpdating = False. Der Haken ist das Zurücksetzen: Was Sie geschrieben haben, bleibt nach dem Ende des Makros dort hängen, bis Sie die Leiste mitApplication.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
= Falsebesser 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
