2009-06-02 8 views

Répondre

41

Vous pouvez utiliser la méthode décrite here comme suit: -

Créer un nouveau module de classe appelé StopWatch Placez le code suivant dans le module de classe StopWatch:

Private mlngStart As Long 
Private Declare Function GetTickCount Lib "kernel32"() As Long 

Public Sub StartTimer() 
    mlngStart = GetTickCount 
End Sub 

Public Function EndTimer() As Long 
    EndTimer = (GetTickCount - mlngStart) 
End Function 

Vous utilisez le code comme suit :

Dim sw as StopWatch 
Set sw = New StopWatch 
sw.StartTimer 

' Do whatever you want to time here 

Debug.Print "That took: " & sw.EndTimer & "milliseconds" 

D'autres méthodes décrivent l'utilisation de la minuterie VBA fonction mais ceci n'est précis qu'à un centième de seconde (centiseconde).

+3

Notez que si 'GetTickCount' résout en millseconds, il a une précision d'environ 16ms [voir ce MSDN article] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724408%28v=vs.85%29.aspx) –

+0

Juste une question: comment cela peut-il calculer la différence de temps entre 2 valeurs stocké dans Excel? – patex1987

+0

La question est sur la façon de calculer les différences entre deux horodatages dans VBA –

-1

Outre la méthode décrite par AdamRalph (GetTickCount()), vous pouvez le faire:

  • Utilisation des QueryPerformanceCounter() et QueryPerformanceFrequency() Fonctions API
    How do you test running time of VBA code?
  • ou, pour les environnements sans accès à l'API Win32 (comme VBScript), ceci:
    http://ccrp.mvps.org/ (vérifiez la section de téléchargement pour les objets COM installables "Minuterie haute performance", ils sont gratuits.)
+0

Y at-il des pro ou con à utiliser QPC au lieu de Tickcount? – Oorang

+0

L'utilisation de QueryPerformanceCounter() nécessite beaucoup plus de code. C'est peut-être utile si vous traitez déjà des compteurs de perf dans votre code.Je voulais juste mentionner l'alternative, je ne pense pas que les résultats soient différents. Je pense que cela se résume à GetTickCount() en interne de toute façon. :) – Tomalak

8

Si vous avez juste besoin de temps écoulé en Centisecondes, vous n'avez pas besoin de l'API TickCount. Vous pouvez simplement utiliser la méthode VBA.Timer qui est présente dans tous les produits Office.

Public Sub TestHarness() 
    Dim fTimeStart As Single 
    Dim fTimeEnd As Single 
    fTimeStart = Timer 
    SomeProcedure 
    fTimeEnd = Timer 
    Debug.Print Format$((fTimeEnd - fTimeStart) * 100!, "0.00 "" Centiseconds Elapsed""") 
End Sub 

Public Sub SomeProcedure() 
    Dim i As Long, r As Double 
    For i = 0& To 10000000 
     r = Rnd 
    Next 
End Sub 
1

GetTickCount et compteur de performance sont nécessaires si vous voulez aller microsecondes .. Pour millisenconds vous pouvez simplement utiliser quelque chose comme ça ..

'at the bigining of the module 
Private Type SYSTEMTIME 
     wYear As Integer 
     wMonth As Integer 
     wDayOfWeek As Integer 
     wDay As Integer 
     wHour As Integer 
     wMinute As Integer 
     wSecond As Integer 
     wMilliseconds As Integer 
End Type 

Private Declare Sub GetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) 


'In the Function where you need find diff 
Dim sSysTime As SYSTEMTIME 
Dim iStartSec As Long, iCurrentSec As Long  

GetLocalTime sSysTime 
iStartSec = CLng(sSysTime.wSecond) * 1000 + sSysTime.wMilliseconds 
'do your stuff spending few milliseconds 
GetLocalTime sSysTime ' get the new time 
iCurrentSec=CLng(sSysTime.wSecond) * 1000 + sSysTime.wMilliseconds 
'Different between iStartSec and iCurrentSec will give you diff in MilliSecs 
0

Vous pouvez également utiliser la formule =NOW() calcilated dans la cellule:

Dim ws As Worksheet 
Set ws = Sheet1 

ws.Range("a1").formula = "=now()" 
ws.Range("a1").numberFormat = "dd/mm/yyyy h:mm:ss.000" 
Application.Wait Now() + TimeSerial(0, 0, 1) 
ws.Range("a2").formula = "=now()" 
ws.Range("a2").numberFormat = "dd/mm/yyyy h:mm:ss.000" 
ws.Range("a3").formula = "=a2-a1" 
ws.Range("a3").numberFormat = "h:mm:ss.000" 
var diff as double 
diff = ws.Range("a3") 
0

Toutes mes excuses à réveiller ce vieux poste, mais je m'y suis une réponse:
Ecrire une fonction pour milliseconde comme ceci:

Public Function TimeInMS() As String 
TimeInMS = Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2) 
End Function  

Utilisez cette fonction dans votre sous:

Sub DisplayMS() 
On Error Resume Next 
Cancel = True 
Cells(Rows.Count, 2).End(xlUp).Offset(1) = TimeInMS() 
End Sub 
Questions connexes