On a parfois besoin de mesurer le temps avec une plus grande précision qu'une seconde. Généralement, on mesure alors le temps en millisecondes. Cette précision peut s'avérer nécessaire pour la création des logs ou encore pour mesurer la vitesse quand on veut tester la performance des macros en VBA.
Alors, "Comment obtenir le temps en millisecondes en VBA?"
Réponse rapide:
Ce n'est pas possible en VBA (de manière 100% fiable).
Réponse plus longue:
Il existe en VBA deux méthodes d'obtenir un temps plus précis qu'une seconde…
Voici donc ces deux méthodes plus en détail…
1. Obtenir le temps en CENTIÈMES de seconde en VBA
Si vous pouvez vous satisfaire de la précision à 1/100 de seconde, il est possible d'utiliser la fonction VBA Timer. Cette fonction nous donne le nombre de secondes depuis minuit, avec une précision à 1/100 de l'unité ce qui est donc 1/100 de seconde…
On peut donc utiliser le résultat de la fonction Now() qui a la précision d'une seconde, la formater de la manière dont on a besoin avec la fonction Format() et ajouter à la fin la valeur derrière la virgule de la fonction Timer…
En VBA, on obtient donc le code suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Public Function TempsAvecCentiemesDeSeconde() As String 'par Excel-Malin.com ( https://excel-malin.com ) On Error GoTo Erreur Dim Maintenant As Date Maintenant = Now() TempsAvecCentiemesDeSeconde = Format(Maintenant, "hh:mm:ss:") & Right(Format(Timer, "#0.00"), 2) Exit Function Erreur: TempsAvecCentiemesDeSeconde = "" End Function |
Vous pouvez, évidemment, formater le résultat à votre convenance. Quelques exemples (modification de la ligne n°9 du code VBA qui précède):
... Format(Maintenant, "hh:mm:ss:") ...
–> 12:05:15:29... Format(Maintenant, "mm:ss:") ...
–> 05:15:29... Format(Maintenant, "mm:ss,") ...
–> 05:15,29... Format(Maintenant, "ss,") ...
–> 15,29
2. Utilisation de GetSystemTime pour obtenir le temps en millisecondes
Cette méthode fait appel à Kernel
pour obtenir le temps de système. Le temps en millisecondes est disponible mais en réalité, on ne peut obtenir que la précision à 15 millièmes de seconde. Ce qui, finalement, rend cette méthode moins précise que la méthode utilisant le Timer pour obtenir des centièmes de seconde que j'ai montré dans la section précédente.
Je vous donne quand même le code VBA pour que vous puissiez constater par vous-mêmes…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
'par Excel-Malin.com ( https://excel-malin.com ) Private Type SYSTEMTIME xAnnee As Integer xMois As Integer xJourSemaine As Integer xJour As Integer xHeure As Integer xMinute As Integer xSeconde As Integer xMilliseconde As Integer End Type Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) Public Function TempsAvecMillisecondes() As String Dim TempsSysteme As SYSTEMTIME Dim TempsTemporaire Dim Maintenant As Date On Error GoTo Erreur GetSystemTime TempsSysteme Maintenant = Now() TempsTemporaire = Right("0" & Hour(Maintenant), 2) & ":" & Right("0" & Minute(Maintenant), 2) & ":" _ & Right("0" & Second(Maintenant), 2) & ":" & Format(TempsSysteme.xMilliseconde, "000") TempsAvecMillisecondes = TempsTemporaire Exit Function Erreur: TempsAvecMillisecondes = "" End Function |
Si vous voulez tester, vous pouvez afficher les valeurs dans une boucle:
1 2 3 4 5 6 |
Sub TestPrecisionMillisecondes() Dim i As Integer For i = 1 To 100 Debug.Print i & "-->" & TempsAvecMillisecondes Next i End Sub |
Ce qui vous donnera un résultat semblable à ceci (et qui s'affichera dans la fenêtre "Exécution" de l'éditeur VBA):
2–>11:23:59:816
…
7–>11:23:59:816
8–>11:23:59:816
9–>11:23:59:816
10–>11:23:59:816
11–>11:23:59:831
12–>11:23:59:831
…
36–>11:23:59:831
37–>11:23:59:831
38–>11:23:59:847
39–>11:23:59:847
…
Comme vous pouvez le constater, le temps en millisecondes est visible mais on passe, par exemple, de 831 ms à 847 ms…
Conclusion: Précision à 1/100 de seconde
On peut donc conclure de manière suivante: Il est impossible d'afficher de manière fiable le temps en millisecondes en VBA mais on peut travailler sans problème avec la précision à des centièmes de seconde. Ce qui, avouons-le, sera suffisant dans une très grande majorité des cas…
Pour aller plus loin en VBA…
Voici d'autres articles qui pourraient vous intéresser et vous être utiles dans votre travail avec VBA…
- Gestion des dates et du temps en VBA
- Suivre l'activité de l'utilisateur en VBA (log)
- Liste de toutes les fonctions disponibles en VBA
- Comment utiliser RECHERCHEV directement en VBA
- Calculer la SOMME en VBA
- Page sur le site Microsoft dédiée à la fonction Timer
3 commentaires sur “Comment obtenir le temps en millisecondes en VBA?”
Super, c'est ce que je cherchais…
Les centièmes de seconde, cela devrait faire l'affaire.
Merci!
On peut également utiliser les fonctions :
QueryPerfCounter du kernel32
QueryPerfFreq du Kernel32
on divise ensuite la sortie du perfcounter par le freq pour avoir le temps en nanoseconde
Je me suis permis de remanier votre fonction pour qu'elle affiche les millièmes de secondes et que l'on puisse passer en paramètres la date et le Timer
Exemple :
? TempsAvecMilliemesDeSeconde(#07/14/2022 8:45:27#,Timer)
14/07/2022 08:45:27:8359