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

VBA Timer dans Excel — mesurer combien de temps prend votre macro (et pourquoi ce n'est pas un planificateur)

|

VBA Timer dans Excel — mesurer combien de temps prend votre macro (et pourquoi ce n'est pas un planificateur)

TL;DR — La fonction Timer ne met rien en pause et n'exécute rien selon un planning. Elle renvoie le nombre de secondes écoulées depuis minuit sous forme décimale, et vous la lisez avant et après un bloc de code pour mesurer combien de temps ce code a pris :

Sub HowLongDoesItTake()
    Dim t As Double
    t = Timer                     ' demarrer le chronometre
    ' ... le code que vous voulez mesurer ...
    Range("A1:A100000").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
    Debug.Print "Took " & Format(Timer - t, "0.00") & " seconds"
End Sub

Timer est la fonction la plus mal nommée de VBA. Son nom promet un compte à rebours ou un planificateur, si bien qu'on cherche « vba timer » en voulant « exécuter ceci toutes les cinq minutes » ou « attendre, puis déclencher » — et Timer ne fait ni l'un ni l'autre. C'est un chronomètre : un moyen de répondre à « combien de temps cela a-t-il pris ? ». Ce guide repose sur cette seule idée, car dès que vous voyez Timer comme un chronomètre, son vrai rôle (le benchmarking) et ses deux pièges (ce-n'est-pas-un-planificateur, le passage à minuit) en découlent directement.

Ce que vous allez apprendre

  • Le modèle mental — Timer est un chronomètre (il mesure le temps écoulé), pas un compte à rebours ni un planificateur
  • Son vrai rôle — le benchmarking, et comment il prouve qu'un interrupteur de performance a réellement aidé
  • L'attente erronée numéro un — si vous voulez « exécuter toutes les N minutes », c'est Application.OnTime qu'il vous faut
  • Le bug du passage à minuit qui produit des temps écoulés négatifs, et la garde pour l'éviter
  • Sa résolution — environ un centième de seconde — et ce à quoi cela convient ou non

Le modèle mental : un chronomètre qu'on lit deux fois

Un chronomètre ne déclenche rien. Il ne sonne pas, il ne met pas la course en pause, il ne fait pas partir les coureurs. Il vous indique seulement l'heure sur son cadran, et vous obtenez une durée en le lisant deux fois et en soustrayant. Timer est exactement cela : l'appeler renvoie « les secondes depuis minuit » sous forme de Single (donc Timer à 00:01:30 renvoie 90.0), et vous mesurez la durée d'un code en le lisant avant et après :

Dim t As Double
t = Timer               ' lire le cadran : p. ex. 43521.14
' ... travail ...
Debug.Print Timer - t   ' relire et soustraire : les secondes ecoulees

Il n'y a ici aucune « pause » ni aucun « déclenchement différé ». Timer ne change jamais ce que fait votre macro — il vous dit seulement combien de temps une partie de celle-ci a duré. Si vous espériez que Timer retarde votre code, c'est Sleep ou Application.Wait, pas Timer.

Son vrai rôle : prouver qu'un changement a réellement accéléré la macro

Le modèle du chronomètre pointe droit sur ce à quoi sert Timer : le benchmarking. Quand vous désactivez Application.ScreenUpdating, passez Application.Calculation en manuel ou remplacez une boucle cellule par cellule par un tableau, vous ne devriez pas croire que c'est devenu plus rapide — vous devriez le mesurer. Timer, c'est le moyen.

Sub ProveTheSwitchHelps()
    Dim t As Double

    t = Timer
    Application.ScreenUpdating = True         ' la methode lente, expres
    WriteTenThousandRows
    Debug.Print "ScreenUpdating on:  " & Format(Timer - t, "0.00") & "s"

    t = Timer
    Application.ScreenUpdating = False        ' la methode rapide
    WriteTenThousandRows
    Application.ScreenUpdating = True
    Debug.Print "ScreenUpdating off: " & Format(Timer - t, "0.00") & "s"
End Sub

C'est le complément honnête de chaque astuce de performance : ScreenUpdating, Calculation et le reste valent la peine, mais Timer est ce qui vous permet de savoir qu'ils ont aidé ce classeur-ci au lieu de répéter le folklore. C'est aussi ainsi que vous trouvez la ligne lente : encadrez quelques suspects de lectures de Timer et laissez les chiffres, pas votre intuition, vous dire où passe le temps.

L'attente erronée numéro un : Timer n'est pas un planificateur

C'est l'idée fausse qui envoie la plupart des gens vers un moteur de recherche. Ils veulent que la macro s'exécute toute seule toutes les 5 minutes, ou fasse quelque chose après un délai, et ils supposent qu'une chose appelée Timer doit forcément être là pour ça. Ce n'est pas le cas. Timer ne fait que rapporter le temps écoulé ; il ne déclenche jamais rien.

Nommez ce que vous voulez vraiment :

  • Exécuter une macro plus tard, ou selon un planning répété (« rafraîchir toutes les 5 minutes », « exécuter à 9 h ») — Application.OnTime. Il remet à Excel une heure et un nom de macro et planifie l'appel.
  • Mettre la macro en pause pendant un délai fixeSleep (millisecondes) ou Application.Wait (secondes entières).
  • Mesurer combien de temps quelque chose a prisTimer. Celui-ci, et lui seul.

Si vous vous surprenez à vouloir bâtir une boucle « répéter toutes les N secondes » à partir de Timer, arrêtez : c'est OnTime qu'il vous faut. Timer dans une boucle ne fait que consommer le CPU à lire l'horloge.

Le bug du passage à minuit

Parce que Timer mesure les secondes depuis minuit, il se remet à 0 à minuit. Ainsi, une macro qui démarre à 23:59:58 et se termine à 00:00:03 calcule Timer - t comme environ 3 - 86398 = -86395 — un temps écoulé négatif. C'est rare, mais bien réel, et cela a produit plus d'un rapport de bug déroutant du type « ma macro a pris moins vingt-quatre heures ».

Si une exécution peut un jour chevaucher minuit, prémunissez-vous-en, ou mesurez plutôt avec Now :

Dim elapsed As Double
elapsed = Timer - t
If elapsed < 0 Then elapsed = elapsed + 86400   ' ajouter les secondes d'une journee

Pour tout ce qui pourrait tourner pendant des heures, préférez un minutage fondé sur la date (Now, ou une combinaison Date + Timer) afin qu'un passage de minuit ne puisse pas corrompre le résultat. Pour le cas courant — chronométrer un bloc qui dure des secondes ou des minutes — un simple Timer - t est parfait.

Résolution : un centième de seconde

Timer se met à jour environ toutes les 10 millisecondes (à peu près un centième de seconde) sous Windows. C'est amplement suffisant pour répondre aux questions auxquelles Timer est destiné : « la version A est-elle plus rapide que la version B ? », « combien de temps prend cet import ? », « laquelle de ces trois lignes est la lente ? ». Ce n'est pas assez pour des micro-benchmarks — chronométrer quelque chose qui s'exécute bien en dessous d'un centième de seconde affichera simplement 0. Quand il vous faut cette précision, répétez l'opération des milliers de fois et divisez, ou descendez à l'API QueryPerformanceCounter. Pour le travail quotidien « le rendre plus rapide et le prouver », Timer est exactement ce qu'il faut.

Comment ExcelMaster aide

Timer est simple, mais bien l'utiliser tient à un petit faisceau d'habitudes : le lire dans un Double, soustraire dans le bon ordre, Formater le résultat pour qu'il soit lisible, se prémunir du cas de minuit sur les longues exécutions, et — la partie que l'on saute — encadrer réellement le bon code pour que la mesure ait un sens. Et quand le but est « exécuter ceci selon un planning » ou « faire une pause ici », Timer est le mauvais outil de bout en bout.

ExcelMaster choisit le bon outil pour ce que vous décrivez. Demandez-lui de « chronométrer la durée de ma macro » et il glisse un benchmark propre fondé sur Timer avec un Debug.Print formaté ; demandez-lui d'« exécuter ceci toutes les cinq minutes » et il câble plutôt Application.OnTime ; demandez-lui de « faire une pause un instant » et il se tourne vers Wait ou Sleep. Vous obtenez la mesure que vous vouliez, pas une boucle Timer qui joue au planificateur.

Questions fréquentes

Comment mesurer combien de temps prend une macro en VBA ?

Lisez la fonction Timer avant et après le code que vous voulez mesurer, puis soustrayez : t = Timer au début, et Debug.Print Timer - t à la fin. Timer renvoie les secondes depuis minuit sous forme décimale, donc la différence est le temps écoulé en secondes. Enveloppez-le avec Format(..., "0.00") pour un résultat lisible.

La fonction VBA Timer met-elle mon code en pause ou l'exécute-t-elle selon un planning ?

Non. Timer ne fait que rapporter les secondes écoulées depuis minuit — il ne met jamais votre macro en pause et ne déclenche jamais rien. Pour faire une pause, utilisez Sleep ou Application.Wait. Pour exécuter une macro plus tard ou selon un planning répété, utilisez Application.OnTime. Timer est purement un chronomètre pour mesurer le temps écoulé.

Pourquoi mon temps écoulé VBA est-il négatif ?

Parce que Timer se remet à zéro à minuit. Si votre macro démarre juste avant minuit et se termine juste après, Timer - t soustrait une grande valeur « avant » d'une petite valeur « après » et devient négatif. Prémunissez-vous-en en ajoutant 86400 (les secondes d'une journée) lorsque le résultat est négatif, ou mesurez avec Now pour les exécutions qui peuvent traverser minuit.

Quelle est la différence entre Timer et Application.OnTime ?

Timer mesure le temps écoulé — vous le lisez pour savoir combien de temps un code a pris. Application.OnTime planifie l'exécution d'une macro à une heure précise ou après un délai. On cherche souvent « vba timer » en voulant un planificateur ; ce rôle revient à Application.OnTime, pas à Timer.

Quelle est la précision de la fonction VBA Timer ?

Timer a une résolution d'environ un centième de seconde (à peu près 10 ms) sous Windows. C'est assez précis pour comparer deux approches ou chronométrer un import, mais les opérations plus rapides que ~10 ms afficheront 0. Pour les micro-benchmarks, exécutez l'opération de nombreuses fois et divisez, ou utilisez l'API Windows QueryPerformanceCounter.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 19/08/2026.

Guides associés : VBA Wait · VBA Sleep · VBA ScreenUpdating · VBA Calculation · VBA DoEvents