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

VBA Timer in Excel — Messen, wie lange Ihr Makro braucht (und warum es kein Scheduler ist)

|

VBA Timer in Excel — Messen, wie lange Ihr Makro braucht (und warum es kein Scheduler ist)

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 — Timer ist 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 pausierenSleep (Millisekunden) oder Application.Wait (ganze Sekunden).
  • Messen, wie lange etwas gedauert hatTimer. 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