TL;DR —
Application.Waitpausiert Ihr Makro bis zu einem Uhrzeit-Moment, nicht für eine Anzahl von Sekunden. Deshalb tutApplication.Wait 5fast nichts —5ist eine Tageszeit-Seriennummer, die bereits in der Vergangenheit liegt. Sie wollen „jetzt plus fünf Sekunden“, und die Auflösung beträgt nur ganze Sekunden:
Sub PauseFiveSeconds()
' zum aktuellen Zeitpunkt PLUS fuenf Sekunden aufwachen
Application.Wait Now + TimeValue("0:00:05")
MsgBox "Five seconds later."
End Sub
Application.Wait ist das Werkzeug, zu dem die meisten zuerst greifen, wenn ein Makro „pausieren“ soll —
und das erste, das sie falsch machen, weil sein Name verbirgt, wie er funktioniert. Es ist keine Eieruhr,
die Sie auf eine Dauer stellen — es ist ein Wecker, den Sie auf einen Moment stellen. Diese Anleitung
ruht auf dieser einen Idee, denn das Wecker-Modell erklärt jede Eigenart: das Argument, die
Ganzsekunden-Grenze und die Tatsache, dass Excel, solange der Wecker gestellt ist, komplett eingefroren
ist und nichts anderes tun kann.
Was Sie lernen
- Das mentale Modell —
Application.Waitist ein Wecker (ein Moment), keine Stoppuhr (eine Dauer) - Die eine Regel, über die jeder stolpert — das Argument ist eine absolute Zeit, keine Zeitspanne
- Warum es nur auf ganze Sekunden auflöst und was Sie für Pausen unter einer Sekunde nutzen
- Warum es Excel einfriert — kein Neuzeichnen, keine Klicks, keine Statusleisten-Updates —, während es wartet
- Das ehrliche Urteil, wann
Application.Waitrichtig ist und wann Sleep oder eine DoEvents-Schleife das Werkzeug ist, das Sie eigentlich wollten
Das mentale Modell: ein Wecker, keine Stoppuhr
Sie sagen einem Wecker nicht „klingle in acht Stunden“. Sie sagen ihm „klingle um 7:00 Uhr“.
Application.Wait funktioniert genau so: Sie geben ihm einen Zeitpunkt zum Aufwachen, und es
blockiert, bis die Systemuhr diesen Punkt erreicht. Es zählt keine Dauer herunter.
Diese eine Tatsache ist die Quelle des Bugs Nummer eins. Weil das Argument ein Moment ist, können Sie
nicht die Anzahl der gewünschten Sekunden hinschreiben — Sie müssen jetzt, plus die gewünschten Sekunden
schreiben, und „die gewünschten Sekunden“ bauen Sie mit TimeValue:
Application.Wait Now + TimeValue("0:00:05") ' aufwachen bei jetzt + 5 Sekunden -> wartet ~5s
Application.Wait Now + TimeValue("0:01:30") ' aufwachen bei jetzt + 1 Min 30s
Application.Wait "14:30:00" ' aufwachen um 14:30 Uhr heute (ein konkreter Moment)
Now ist das aktuelle Datum samt Uhrzeit; TimeValue("0:00:05") ist die Dauer von fünf Sekunden als
Zeitwert ausgedrückt; addiert man beides, ergibt das den Moment fünf Sekunden ab jetzt. Genau das
braucht Application.Wait.
Die Regel, über die jeder stolpert: das Argument ist eine absolute Zeit
Hier ist der Fehlschlag, der die Leute zu Suchmaschinen treibt. Sie lesen „Wait pausiert das Makro“ und schreiben:
Application.Wait 5 ' FALSCH - wartet NICHT 5 Sekunden
Für VBA ist 5 nicht „fünf Sekunden“. Es ist die Seriennummer 5, und die ist ein Datum/eine
Uhrzeit — fünf Tage nach dem 1900er-Nullpunkt, um Mitternacht, ein Moment, der Jahrzehnte in der
Vergangenheit liegt. Application.Wait schaut auf die Uhr, sieht, dass dieser Moment längst vorüber ist,
und kehrt praktisch sofort zurück. Das Makro wirft keinen Fehler; es wartet einfach nicht. Genau dieses
stille „es hat nicht pausiert und sich nicht beschwert“ macht es so verwirrend.
Dieselbe Falle in subtilerer Form: Application.Wait Now + 5 wartet fünf Tage, denn 5 zu einem
Datum addiert bedeutet fünf Tage, nicht fünf Sekunden. Verpacken Sie die Dauer immer in TimeValue (oder
TimeSerial):
Application.Wait Now + 5 ' wartet 5 TAGE - fast nie das Gemeinte
Application.Wait Now + TimeValue("0:00:05") ' wartet 5 Sekunden - korrekt
Application.Wait Now + TimeSerial(0, 0, 5) ' dasselbe, aus Zahlen gebaut
Wenn Sie sich eine Zeile von dieser Seite merken, dann Now + TimeValue(...).
Nur ganze Sekunden — für alles Feinere Sleep nutzen
TimeValue kann keine Sekundenbruchteile ausdrücken. Die feinste Pause, die Application.Wait einlegen
kann, ist eine Sekunde; ein TimeValue("0:00:00.25") gibt es nicht. Wenn Sie eine Viertelsekunde
Pause brauchen — um eine Abfrageschleife zu drosseln, Anfragen zu entzerren, eine Animation anzustoßen —,
kann Application.Wait das nicht.
Das ist die saubere Trennlinie zwischen den beiden Warte-Werkzeugen. Ganze Sekunden, kein Declare nötig
— Application.Wait. Millisekundengenau unter einer Sekunde — die Sleep-Windows-API.
Wenn Sie sich wünschen, Application.Wait würde Millisekunden nehmen, sind Sie ihm bereits entwachsen —
wechseln Sie zu Sleep.
Der Teil, den jeder vergisst: es friert Excel komplett ein
Während Application.Wait blockiert, tut Excel nichts anderes. Es läuft auf Excels einzigem Thread
und gibt diesen Thread nicht frei, um Nachrichten abzuarbeiten. Also während der Wartezeit:
- zeichnet sich der Bildschirm nicht neu,
- erscheint eine gerade gesetzte Statusleisten-Meldung nicht,
- stauen sich Klicks und Tastenanschläge unbearbeitet,
- und ist die Wartezeit lang genug, stempelt Windows „Keine Rückmeldung“ auf das Fenster.
Das ist die Falle, die Application.Wait zum falschen Werkzeug für den häufigsten Grund macht, aus dem
man es einsetzt. Ist Ihr Ziel „einen Countdown anzeigen“, „den Benutzer den Fortschritt sehen lassen“
oder „ihn Abbrechen drücken lassen“, arbeitet Application.Wait aktiv gegen Sie — es friert genau die
Oberfläche ein, die Sie am Leben halten wollten.
Eine reaktionsfähige Pause ist eine völlig andere Konstruktion: eine kurze Schleife, die mit
DoEvents abgibt, damit Excel weiteratmet, während die Zeit vergeht.
' Eine Pause, die Excel am Leben und abbrechbar haelt - NICHT Application.Wait
Dim finishAt As Double
finishAt = Timer + 5 ' Timer = Sekunden seit Mitternacht
Do While Timer < finishAt
DoEvents ' Excel neu zeichnen und Klicks verarbeiten lassen
If gCancel Then Exit Do
Loop
Beachten Sie, was das nutzt: Timer, um die verstrichenen Sekunden zu messen, und
DoEvents, um das Fenster am Leben zu halten. Application.Wait gibt Ihnen weder das eine noch das
andere.
Das ehrliche Urteil: wann Application.Wait wirklich richtig ist
Application.Wait verdient seinen Platz in genau einer Situation: Sie brauchen eine Pause von einer
ganzen Anzahl Sekunden, und es ist Ihnen wirklich gleichgültig, dass Excel dabei eingefroren ist. Der
Lehrbuchfall ist, einer externen Datenquelle einen Moment zum Nachziehen zu geben — Sie haben gerade eine
DDE/RTD-Anfrage, eine Webabfrage oder eine QueryTable-Aktualisierung ausgelöst und wollen ein paar
Sekunden warten, bis die Daten eintreffen, bevor Sie das Ergebnis lesen. Es ist einfach, es braucht keine
API-Deklaration und es gibt die CPU frei (es dreht nicht durch), sodass eine kurze, nicht-interaktive
Ganzsekunden-Pause ein guter Einsatz ist.
Für alles andere benennen Sie, was Sie eigentlich wollen:
- Pause unter einer Sekunde (eine Schleife drosseln, Aufrufe entzerren) —
Sleep, dennApplication.Waitkommt nicht unter eine Sekunde. - Eine Pause, bei der Excel reaktionsfähig bleiben muss (Fortschritt, Abbrechen, ein sichtbarer
Countdown) — eine
DoEvents-Schleife, dennApplication.Waitfriert das Fenster ein. - Etwas später nach Zeitplan ausführen (alle 5 Minuten, um 9 Uhr) —
Application.OnTime, gar keine Wartepause.
Ein eingefrorenes Excel ist das korrekte Verhalten von Application.Wait, kein Bug. Der Bug besteht
darin, es einzusetzen, wenn ein eingefrorenes Excel nicht das war, was Sie wollten.
Wie ExcelMaster hilft
Die Wahl zwischen Application.Wait, Sleep, einer DoEvents-Schleife und OnTime ist eine
Ermessensentscheidung, die davon abhängt, ob Sie Timing unter einer Sekunde brauchen, ob Excel
reaktionsfähig bleiben muss und ob die Verzögerung einmalig ist oder ein Zeitplan. Machen Sie es falsch,
frieren Sie entweder Excel ein, obwohl Sie es am Leben halten wollten, oder Sie schreiben
Application.Wait 5 und wundern sich, warum nichts pausiert.
ExcelMaster trifft diese Entscheidung
für Sie. Beschreiben Sie, was Sie wollen — „ein paar Sekunden warten, bis die Abfrage aktualisiert ist“
oder „warten, aber lass mich abbrechen“ —, und es wählt die richtige Konstruktion:
Application.Wait Now + TimeValue(...) für eine einfache Ganzsekunden-Pause, eine Sleep-Deklaration für
Drosselung unter einer Sekunde oder eine abgesicherte DoEvents-Schleife, wenn das Fenster reaktionsfähig
bleiben muss. Kein Vertun um eine Seriennummer, kein eingefrorenes Makro, wo Sie ein lebendiges wollten.
Häufig gestellte Fragen
Wie lasse ich ein Makro in VBA 5 Sekunden warten?
Nutzen Sie Application.Wait Now + TimeValue("0:00:05"). Das Argument von Application.Wait ist ein
Moment zum Aufwachen, keine Dauer, also addieren Sie den Fünf-Sekunden-TimeValue zu Now (der
aktuellen Zeit). Application.Wait 5 zu schreiben funktioniert nicht — VBA liest 5 als
Datum/Uhrzeit-Seriennummer in der Vergangenheit, sodass das Makro überhaupt nicht pausiert.
Warum pausiert Application.Wait 5 mein Makro nicht?
Weil 5 als Tageszeit-Seriennummer interpretiert wird (ungefähr Mitternacht am fünften Tag des Jahres
1900), die bereits in der Vergangenheit liegt. Application.Wait blockiert, bis die Uhr den übergebenen
Moment erreicht, und dieser Moment ist längst vorbei, also kehrt es sofort zurück. Sie müssen einen
zukünftigen Moment übergeben, etwa Now + TimeValue("0:00:05").
Kann Application.Wait kürzer als eine Sekunde pausieren?
Nein. Application.Wait löst nur auf ganze Sekunden auf, weil TimeValue keine Sekundenbruchteile
ausdrücken kann. Für eine Pause unter einer Sekunde — etwa 250 Millisekunden — nutzen Sie stattdessen die
Windows-Sleep-API (Sleep 250), die Millisekunden nimmt.
Warum friert Excel ein oder zeigt „Keine Rückmeldung“ während Application.Wait?
Weil Application.Wait Excels einzigen Thread blockiert und ihn während des Wartens keine Nachrichten
verarbeiten lässt, sodass sich der Bildschirm nicht neu zeichnen kann und Klicks nicht bearbeitet werden.
Für eine Pause, bei der Excel am Leben bleiben muss — um Fortschritt zu zeigen oder Abbrechen zuzulassen
—, nutzen Sie eine kurze Schleife, die DoEvents aufruft, statt Application.Wait.
Was ist der Unterschied zwischen Application.Wait und Sleep?
Application.Wait ist in Excel eingebaut, braucht keine Deklaration, wartet bis zu einem Uhrzeit-Moment
und löst auf ganze Sekunden auf. Sleep ist ein Windows-API-Aufruf, den Sie deklarieren müssen; es
wartet eine Anzahl von Millisekunden (Genauigkeit unter einer Sekunde) und braucht auf 64-Bit-Excel das
PtrSafe-Attribut. Nutzen Sie Application.Wait für einfache Ganzsekunden-Pausen und Sleep, wenn Sie
feineres Timing brauchen. Beide frieren Excel ein, während sie warten.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 19.08.2026.
Verwandte Anleitungen: VBA Sleep · VBA Timer · VBA DoEvents · VBA StatusBar · VBA ScreenUpdating
