2013-10-21 186 views
1

Win7上的MS Excel Professional Plus v14。VBA Excel - 相等日期不等於

我在比較日期/時間的平等方面遇到問題。

看起來相等的兩個日期2013/12/16 12:19:33都被標註爲日期。一個是日期數組,另一個是日期變量。 arrPP稍後重新定義。當我這樣做則DateDiff(「S」,DATE1,DATE2)它產生0

Dim arrPP() As Date   ' During runtime shows type is Date(1 to 2, 1 to 1) 
Dim dNextStartTime as Date 

'...code removed ... 

    If arrPP(iPP_START, lPP_index) <= dNextStartTime Then 
     GoTo PP_OUT 
    End If 

即使他們是平等的,上面的計算結果爲假,在錯誤的道路取。這很難追查,並導致意外/錯誤的結果。

關於日期平等,有沒有官方的「gotcha」?是否存在需要比較的隱藏毫秒,或將比較限制在秒級別的方法?

我已經嘗試了其他幾種替代方法,包括在數組元素前放置CDate。

失敗:

If Not(arrPP(iPP_START, lPP_index) > dNextStartTime) Then 
     GoTo PP_OUT 
    End If 

PASS:(但誰也想做到這一點?)

If arrPP(iPP_START, lPP_index) <= dNextStartTime Or _ 
     DateDiff("s",arrPP(iPP_START,lPP_index),dNextStartTime) = 0 Then 
     GoTo PP_OUT 
    End If 
+0

'VBA Excel - 同等日期不評估爲平等'你如何填充日期?這個對我有用。 –

回答

4

這是最有可能是由於浮點precission問題。日期存儲爲雙精度浮點數,其中整數部分是日期,小數部分是時間。

爲了測試是否是arrPP(iPP_START,lPP_index)dNextStartTime它可能是最好使用

If DateDiff("s",dNextStartTime,arrPP(iPP_START,lPP_index)) <= 0 Then 

注意,當第一次約會的參數比第二較早DateDiff回報獨到之處。

爲了演示兩個明顯相等的日期可能是不相等的,嘗試運行此

Sub demo() 
    Dim d1 As Date, d2 As Date 

    d1 = #12/17/1986 12:19:33 PM# 

    d2 = #12/17/1986# 
    d2 = d2 + 12#/24#    ' Add 12 hour 
    d2 = d2 + 19#/60#/24#  ' Add 19 minutes 
    d2 = d2 + 33#/60#/60#/24# ' Add 33 seconds 

    Debug.Print d1; d2 
    Debug.Print d1 = d2 
    Debug.Print d1 - d2 
End Sub 

立即窗口輸出

17/12/1986下午12時19分33秒17/12/1986 12:19:33 PM.m.

3.63797880709171E-12

+0

嗯。有趣的是,DateDiff()變爲0,但a = b變爲false。也許DateDiff()是爲了處理不精確?這似乎會導致人們很多問題! –

+0

'DateDiff'計算指定分辨率的差異(在這種情況下爲秒)我剛添加的示例顯示由於大約0.3微秒的浮動精度而產生的差異 –

+0

底線,比較浮點值是否相等(無論它們表示什麼)是一個糟糕的主意 –

1

VBA的Excel - 平等的日期不計算爲等於

這對我的作品。

我想它歸結爲如何將日期存儲在日期變量或日期數組。你如何填充日期?

這是我做的測試。如果我誤解了您的查詢,請告訴我。

Sub Sample() 
    Dim dt As Date 
    Dim MyAr(1, 1) As Date 

    dt = #12/16/2013 12:19:33 PM# 
    MyAr(1, 1) = #12/16/2013 12:19:33 PM# 

    If (MyAr(1, 1) > dt) Then 
     MsgBox "MyAr is greater" 
    ElseIf (MyAr(1, 1) < dt) Then 
     MsgBox "MyAr is lesser" 
    Else 
     MsgBox "They are equal" '<~~ This is what I get 
     Debug.Print DateDiff("s", MyAr(1, 1), dt) 
    End If 
End Sub 
+0

即使我將第一個條件更改爲If(MyAr(1,1)= dt),您的示例也適用於我。它的評估爲真。如果我把日期放在單元$ A $ 1中並從那裏讀取,它也可以工作。我的工作表中讀取日期格式的單元格填充了我的arrPP。那些單元中的日期看起來很正常。 dNextStartTime初始化爲「12:00」,並且通常重置爲日期格式單元格中工作表中讀取的日期(看起來很正常)。 dNextStartTime可能會從變量數組中的日期再次重置,但是隨後我使用dNextStartTime = CDate(arrOther(x,y))。平等安排應用程序的重要性。 –