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

VBA Wait in Excel — Application.Wait, warum es Excel einfriert und wann Sie stattdessen Sleep nutzen

|

VBA Wait in Excel — Application.Wait, warum es Excel einfriert und wann Sie stattdessen Sleep nutzen

TL;DRApplication.Wait pausiert Ihr Makro bis zu einem Uhrzeit-Moment, nicht für eine Anzahl von Sekunden. Deshalb tut Application.Wait 5 fast nichts — 5 ist 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.Wait ist 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.Wait richtig 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, denn Application.Wait kommt nicht unter eine Sekunde.
  • Eine Pause, bei der Excel reaktionsfähig bleiben muss (Fortschritt, Abbrechen, ein sichtbarer Countdown) — eine DoEvents-Schleife, denn Application.Wait friert 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