TL;DR — La fonction
Timerne 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 —
Timerest 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.OnTimequ'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 fixe —
Sleep(millisecondes) ouApplication.Wait(secondes entières). - Mesurer combien de temps quelque chose a pris —
Timer. 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
