TL;DR — Die
Timer-Funktion pausiert nichts und führt nichts nach Zeitplan aus. Sie gibt die Anzahl der seit Mitternacht verstrichenen Sekunden als Dezimalzahl zurück, und Sie lesen sie vor und nach einem Codeblock, um zu messen, wie lange dieser Code gedauert hat:
Sub HowLongDoesItTake()
Dim t As Double
t = Timer ' die Stoppuhr starten
' ... der Code, den Sie messen wollen ...
Range("A1:A100000").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
Debug.Print "Took " & Format(Timer - t, "0.00") & " seconds"
End Sub
Timer ist die am irreführendsten benannte Funktion in VBA. Ihr Name verspricht einen Countdown oder
einen Scheduler, also sucht man nach „vba timer“ und will „das alle fünf Minuten ausführen“ oder „warten,
dann auslösen“ — und Timer tut weder das eine noch das andere. Es ist eine Stoppuhr: eine
Möglichkeit, die Frage „wie lange hat das gedauert?“ zu beantworten. Diese Anleitung ruht auf dieser einen
Idee, denn sobald Sie Timer als Stoppuhr sehen, fallen seine eigentliche Aufgabe (Benchmarking) und
seine zwei Fallen (es-ist-kein-Scheduler, Mitternachts-Überlauf) unmittelbar heraus.
Was Sie lernen
- Das mentale Modell —
Timerist eine Stoppuhr (misst verstrichene Zeit), kein Countdown und kein Scheduler - Seine eigentliche Aufgabe — Benchmarking, und wie es beweist, dass ein Performance-Schalter wirklich geholfen hat
- Die häufigste falsche Erwartung — wenn Sie „alle N Minuten ausführen“ wollen, wollen Sie
Application.OnTime - Der Mitternachts-Überlauf-Bug, der negative Laufzeiten erzeugt, und der Schutz dagegen
- Seine Auflösung — etwa eine Hundertstelsekunde — und wofür sie taugt und wofür nicht
Das mentale Modell: eine Stoppuhr, die Sie zweimal ablesen
Eine Stoppuhr lässt nichts geschehen. Sie klingelt nicht, sie pausiert nicht das Rennen, sie schickt die
Läufer nicht los. Sie zeigt Ihnen nur die Zeit auf ihrem Zifferblatt, und eine Dauer bekommen Sie, indem
Sie zweimal ablesen und subtrahieren. Timer ist genau das: Der Aufruf gibt „Sekunden seit Mitternacht“
als Single zurück (Timer um 00:01:30 gibt also 90.0 zurück), und Sie messen, wie lange Code gedauert
hat, indem Sie vor und nach ihm ablesen:
Dim t As Double
t = Timer ' das Zifferblatt ablesen: z. B. 43521.14
' ... Arbeit ...
Debug.Print Timer - t ' erneut ablesen und subtrahieren: die verstrichenen Sekunden
Hier gibt es kein „Pausieren“ und kein „später auslösen“. Timer ändert nie, was Ihr Makro tut — es sagt
Ihnen nur, wie lange ein Teil davon gedauert hat. Falls Sie gehofft haben, Timer würde Ihren Code
verzögern, dann ist das Sleep oder Application.Wait, nicht
Timer.
Seine eigentliche Aufgabe: beweisen, dass eine Änderung das Makro wirklich schneller gemacht hat
Das Stoppuhr-Modell zeigt direkt darauf, wofür Timer da ist: Benchmarking. Wenn Sie
Application.ScreenUpdating abschalten, Application.Calculation auf manuell umstellen oder eine
Zelle-für-Zelle-Schleife durch ein Array ersetzen, sollten Sie nicht glauben, dass es schneller wurde —
Sie sollten es messen. Timer ist das Wie.
Sub ProveTheSwitchHelps()
Dim t As Double
t = Timer
Application.ScreenUpdating = True ' der langsame Weg, mit Absicht
WriteTenThousandRows
Debug.Print "ScreenUpdating on: " & Format(Timer - t, "0.00") & "s"
t = Timer
Application.ScreenUpdating = False ' der schnelle Weg
WriteTenThousandRows
Application.ScreenUpdating = True
Debug.Print "ScreenUpdating off: " & Format(Timer - t, "0.00") & "s"
End Sub
Das ist die ehrliche Ergänzung zu jedem Performance-Tipp: ScreenUpdating,
Calculation und der Rest sind es wert, doch Timer ist der Weg, wie Sie
wissen, dass sie dieser Arbeitsmappe geholfen haben, statt Küchenweisheiten nachzuplappern. Es ist auch
der Weg, die langsame Zeile zu finden: Umschließen Sie ein paar Verdächtige mit Timer-Ablesungen und
lassen Sie die Zahlen, nicht Ihre Intuition, sagen, wohin die Zeit geht.
Die häufigste falsche Erwartung: Timer ist kein Scheduler
Das ist das Missverständnis, das die meisten zu einer Suchmaschine treibt. Sie wollen, dass sich das Makro
alle 5 Minuten selbst ausführt oder nach einer Verzögerung etwas tut, und sie nehmen an, dass
etwas namens Timer das sein muss. Ist es nicht. Timer meldet nur verstrichene Zeit; es löst nie
etwas aus.
Benennen Sie, was Sie eigentlich wollen:
- Ein Makro später oder nach wiederkehrendem Zeitplan ausführen („alle 5 Minuten aktualisieren“, „um
9 Uhr ausführen“) —
Application.OnTime. Es übergibt Excel eine Zeit und einen Makronamen und plant den Aufruf. - Das Makro für eine feste Verzögerung pausieren —
Sleep(Millisekunden) oderApplication.Wait(ganze Sekunden). - Messen, wie lange etwas gedauert hat —
Timer. Dieses, und nur dieses.
Wenn Sie sich dabei ertappen, aus Timer eine „alle N Sekunden wiederholen“-Schleife bauen zu wollen,
halten Sie inne: Sie wollen OnTime. Timer in einer Schleife verbrennt nur die CPU beim Ablesen der Uhr.
Der Mitternachts-Überlauf-Bug
Weil Timer Sekunden seit Mitternacht misst, springt es um Mitternacht auf 0 zurück. Ein Makro, das
um 23:59:58 startet und um 00:00:03 endet, berechnet Timer - t also als ungefähr 3 - 86398 = -86395 —
eine negative Laufzeit. Es ist selten, aber real, und es hat mehr als einen verblüfften Bugbericht
„mein Makro hat minus vierundzwanzig Stunden gebraucht“ hervorgebracht.
Falls ein Lauf jemals über Mitternacht reichen könnte, sichern Sie sich dagegen ab oder messen Sie
stattdessen mit Now:
Dim elapsed As Double
elapsed = Timer - t
If elapsed < 0 Then elapsed = elapsed + 86400 ' die Sekunden eines Tages addieren
Für alles, was stundenlang laufen könnte, ist datumsbasiertes Timing vorzuziehen (Now oder eine
Kombination aus Date + Timer), damit ein Mitternachtsübergang das Ergebnis nicht verfälschen kann. Für
den Normalfall — das Messen eines Blocks, der Sekunden oder Minuten dauert — ist ein schlichtes
Timer - t perfekt.
Auflösung: eine Hundertstelsekunde
Timer aktualisiert sich unter Windows etwa alle 10 Millisekunden (rund eine Hundertstelsekunde). Das
genügt reichlich für die Fragen, für die Timer gedacht ist: „Ist Version A schneller als Version B?“,
„Wie lange dauert dieser Import?“, „Welche dieser drei Zeilen ist die langsame?“ Es reicht nicht für
Mikrobenchmarks — misst man etwas, das deutlich unter einer Hundertstelsekunde läuft, meldet es schlicht
0. Wenn Sie diese Genauigkeit brauchen, wiederholen Sie die Operation tausendfach und teilen Sie, oder
greifen Sie zur QueryPerformanceCounter-API. Für die alltägliche „schneller machen und beweisen“-Arbeit
ist Timer genau richtig.
Wie ExcelMaster hilft
Timer ist einfach, doch es gut einzusetzen ist ein kleines Bündel von Gewohnheiten: in ein Double
einlesen, in der richtigen Reihenfolge subtrahieren, das Ergebnis mit Format lesbar machen, bei langen
Läufen den Mitternachtsfall absichern und — der Teil, den man überspringt — tatsächlich den richtigen
Code umschließen, damit die Messung etwas bedeutet. Und wenn das Ziel „das nach Zeitplan ausführen“ oder
„hier pausieren“ ist, ist Timer das völlig falsche Werkzeug.
ExcelMaster wählt das richtige Werkzeug
für das, was Sie beschreiben. Bitten Sie es, „zu messen, wie lange mein Makro braucht“, und es setzt einen
sauberen Timer-basierten Benchmark mit einem formatierten Debug.Print ein; bitten Sie es, „das alle
fünf Minuten auszuführen“, und es verdrahtet stattdessen Application.OnTime; bitten Sie es, „einen Moment
zu pausieren“, und es greift zu Wait oder Sleep. Sie bekommen die Messung, die Sie wollten, nicht eine
Timer-Schleife, die einen Scheduler mimt.
Häufig gestellte Fragen
Wie messe ich in VBA, wie lange ein Makro braucht?
Lesen Sie die Timer-Funktion vor und nach dem Code, den Sie messen wollen, und subtrahieren Sie dann:
t = Timer am Anfang und Debug.Print Timer - t am Ende. Timer gibt Sekunden seit Mitternacht als
Dezimalzahl zurück, sodass die Differenz die verstrichene Zeit in Sekunden ist. Umschließen Sie sie mit
Format(..., "0.00") für ein lesbares Ergebnis.
Pausiert die VBA-Timer-Funktion meinen Code oder führt ihn nach Zeitplan aus?
Nein. Timer meldet nur die seit Mitternacht verstrichenen Sekunden — es pausiert Ihr Makro nie und
löst nie etwas aus. Zum Pausieren nutzen Sie Sleep oder Application.Wait. Um ein Makro später oder nach
wiederkehrendem Zeitplan auszuführen, nutzen Sie Application.OnTime. Timer ist rein eine Stoppuhr zum
Messen verstrichener Zeit.
Warum ist meine verstrichene Zeit in VBA negativ?
Weil Timer um Mitternacht auf null zurückspringt. Startet Ihr Makro kurz vor Mitternacht und endet kurz
danach, subtrahiert Timer - t einen großen „Vorher“-Wert von einem kleinen „Nachher“-Wert und wird
negativ. Sichern Sie sich dagegen ab, indem Sie 86400 (die Sekunden eines Tages) addieren, wenn das
Ergebnis negativ ist, oder messen Sie mit Now für Läufe, die Mitternacht überschreiten können.
Was ist der Unterschied zwischen Timer und Application.OnTime?
Timer misst verstrichene Zeit — Sie lesen es, um herauszufinden, wie lange Code gedauert hat.
Application.OnTime plant ein Makro, das zu einer bestimmten Zeit oder nach einer Verzögerung läuft.
Viele suchen nach „vba timer“ und wollen einen Scheduler; diese Aufgabe gehört Application.OnTime, nicht
Timer.
Wie genau ist die VBA-Timer-Funktion?
Timer löst unter Windows auf etwa eine Hundertstelsekunde auf (rund 10 ms). Das ist genau genug, um zwei
Ansätze zu vergleichen oder einen Import zu messen, aber Operationen, die schneller als ~10 ms sind, melden
0. Für Mikrobenchmarks führen Sie die Operation viele Male aus und teilen, oder Sie nutzen die
Windows-API QueryPerformanceCounter.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 19.08.2026.
Verwandte Anleitungen: VBA Wait · VBA Sleep · VBA ScreenUpdating · VBA Calculation · VBA DoEvents
