2015-07-10 10 views
5

Próbuję użyć następującego kodu, aby wyświetlić czas potrzebny na wykonanie serii komend. W tym przypadku spodziewałem się, że powróci z "10" lub czymś podobnym.VBA - Wyświetlanie, jak długo sub zajął

Zamiast wraca z:

enter image description here

co się dzieje i jak mogę sformatować to prawidłowo?

Sub timeyWimey() 

    Dim t1 As Date 
    Dim t2 As Date 
    Dim timeTaken As Date 

     t1 = Now() 
     Application.Wait (Now + TimeValue("0:00:10")) 
     t2 = Now() 

     timeTaken = t2 - t1 

     MsgBox timeTaken 

End Sub 

EDIT:

Kod końcowy po kilku świetnych odpowiedzi:

Sub timeyWimey() 

    'Dim t1 As Double 
    'Dim t2 As Double 


     t1 = Now() 
     Application.Wait (Now + TimeValue("0:00:10")) 
     t2 = Now() 

     timeTaken = t2 - t1 

     MsgBox Format(timeTaken, "nn:ss.000") 

End Sub 

Wyniki w:

enter image description here

BAM! Problem rozwiązany! Dziękuję wszystkim za pomoc!

Odpowiedz

2

Data jest przechowywana jako wartość numeryczna w MS Access i MS Excel. Jeśli więc w twoim bezpośrednim oknie (Ctrl + G G) wpisz ?Cdbl(now()) otrzymasz numer taki: 42195.5204050926.

Całe liczby przedstawiają liczbę dni, które upłynęły od 1899 r. 30 grudnia, a liczba dziesiętna pokazuje, ile minęło bieżącego dnia.

Więc w kodzie są w zasadzie mówi coś takiego:

timeTaken = 42195.5222337963 - 42195.5204050926 

W tym przykładzie Właśnie sprawdziłem Now() raz, a następnie ponownie kilka minut później. Więc zakończyłem z 0.0018287037.

Teraz jeśli pójdę do wyświetlania że za pomocą zmiennej Date takie jak w przykładzie, jestem po prostu mówiąc, co raz to było w 0.0018287037 które na dzień 30 grudnia 1899, 00:02:38.

można wizualnie zobaczyć wracając do natychmiastowego okna i wpisując ?cdate(0.0018287037) i otrzymasz wynik takiego: 12:02:38 AM. Aby zrobić krok dalej można następnie wpisz ?cdate(1.0018287037) i otrzymasz wynik mówiąc: 1899-12-31 12:02:38 AM

Więc w tej sytuacji można po prostu wystarczy zmienić:

MsgBox timeTaken 

do:

MsgBox Format(timeTaken, "nn:ss") 

Uwaga: Na zrzucie ekranu nie zauważyłem napisu "Excel", ale ta odpowiedź powinna być nadal ważna.

+0

Dziękuję. To zdecydowanie wyjaśnia problem. Pozwól mi chwilę się nad tym zastanowić. – timbram

+0

W jaki więc sposób działa format liczb po przecinku (ilość bieżącego dnia)? Jeśli ponownie uruchomisz mój skrypt, zachowując wszystko jako podwójne, otrzymam informację, że czas, który upłynął (10 sekund), to 0.00005787036934635. Czy to procent dnia czy coś takiego? – timbram

+0

Dołączyłem sposób, w jaki można sformatować podwójne na końcu mojej odpowiedzi. A '0.00005787036934635' to w zasadzie procent na dzień. Na przykład, gdyby było 0,5, to byłoby 12: 00 popołudnie, ponieważ minęło pół dnia. – Newd

1

Zwykle używasz DateDiff function do obliczenia różnicy między dwiema datami, ale myślę, że w twoim przypadku będziesz chciał czegoś innego, ponieważ DateDiff nie da ci milisekund.Zamiast tego, po prostu zamień swoje połączenie na funkcję "Teraz" przez Timer(), która jest tylko liczbą sekund (ostrożnie, ale daje tylko czas, jaki minął od północy, więc t2 - t1 może być ujemny, a jeśli twoje polecenia trwają kilka dni nie uzyskasz żadnego znaczącego wyniku).

+0

Dzięki, to zadziała świetnie dla moich celów. – timbram

1

Możesz wypróbować funkcję timera. Jak wskazują inne odpowiedzi, mogą istnieć pewne zastrzeżenia.

Dim startTime As Double, endTime As Double 
startTime = Timer 

Application.Wait (Now + TimeValue("0:00:10")) 

endTime = Timer 
msgBox endTime - startTime 
+0

Nienawidzę tego i kocham to! :) Nienawidzę tego bałaganu z czasami jest tak dużo bólu w VBA! Wciąż jednak radzenie sobie z czasem może być złożoną bestią w DOWOLNYM języku! Ta metoda działa, a dla mojego obecnego procesu nie martwię się o milisekundy i nie będę go uruchamiał przez noc ani nic. – timbram