2015-07-10 88 views
5

我想用下面的代碼來顯示一系列命令運行需要多長時間。在這個例子中,我預計它會回來「10」或類似的東西。VBA - 顯示子運行多長時間

相反,它回來了:

enter image description here

這是怎麼回事,我該如何正確格式化這個?

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 

編輯:

一些偉大的答案後的最終代碼:在

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 

結果:

enter image description here

BAM!問題解決了!謝謝大家的幫助!

回答

2

日期的數值存儲在MS Access和MS Excel中。因此,如果在您的直接窗口中(Ctrl + G),請鍵入?Cdbl(now()),您將得到一個如下所示的數字:42195.5204050926

整個數字描述了自1899年12月30日以來經過了多少天,小數點顯示了當天有多少時間已過。

因此,在你的代碼,你基本上是說這樣的事情:

timeTaken = 42195.5222337963 - 42195.5204050926 

在這個例子中,我只是檢查Now()一次,然後再次幾分鐘後。所以我結束了0.0018287037

現在,如果我去顯示使用Date變量,如你的榜樣,我基本上說什麼時候是它在0.0018287037這是1899年12月30日,上午12時02分38秒。

您可以直觀地通過返回到您的直接窗口,輸入?cdate(0.0018287037)看到這一點,你會得到這樣的結果:12:02:38 AM。把它一步,那麼你可以鍵入?cdate(1.0018287037),你會得到一個結果,他說:1899-12-31 12:02:38 AM

所以在你的情況,你可以只是簡單地改變:

MsgBox timeTaken 

要:

MsgBox Format(timeTaken, "nn:ss") 

注意:我沒有注意到它在截圖中說「Excel」,儘管這個答案應該仍然有效。

+0

謝謝。所以這絕對解釋了這個問題。讓我稍微想一想。 – timbram

+0

那麼,小數點後的數字格式(通過當天的數量)是如何工作的?如果重新運行我的腳本,保持一切爲雙打,我知道已經過去的時間(10秒)是0.00005787036934635。這是一天中的某個比例嗎? – timbram

+0

我附加了如何將雙重格式化到我的答案結尾。而'0.00005787036934635'基本上是一天的百分比。例如,如果它是0.5,那將是12:00noon,因爲一天的一半已經過去了。 – Newd

1

通常情況下,您會使用DateDiff function來計算兩個日期之間的差異,但我認爲在您的情況下您需要其他的東西,因爲DateDiff不會給你毫秒。相反,只需將您的呼叫替換爲Timer()的「現在」功能,這只是幾秒鐘(但請注意,它只會給您自午夜以來的時間,因此t2-t1可能爲負數,並且如果您的命令持續多次幾天你不會得到任何有意義的結果)。

+0

謝謝,這將很適合我的目的。 – timbram

1

您可以嘗試定時器功能。正如其他答案所示,可能會有一些警告。

Dim startTime As Double, endTime As Double 
startTime = Timer 

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

endTime = Timer 
msgBox endTime - startTime 
+0

我討厭它,我喜歡它! :)我討厭與時間混淆是VBA中的一大痛苦!儘管如此,處理時間在任何語言中都可能是一個複雜的野獸! 這種方法的工作原理,對於我目前的過程,我沒有太多擔心毫秒,並且不會在夜間或任何事情上運行它。 – timbram