2013-10-21 184 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))。平等安排应用程序的重要性。 –