VBA Excel - 相等日期的评估不相等

时间:2013-10-21 23:53:42

标签: excel-vba date-comparison vba excel

Win7上的MS Excel Professional Plus v14。

我无法比较日期/时间的相等性。

两个看似相同的日期,12/16/2013 12:19:33 pm都标注为日期。一个是日期数组,另一个是日期变量。 arrPP后来被ReDim'ed。当我执行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

即使它们相同,上面的评估结果为false,并且采用了错误的路径。这很难追查并导致意外/错误的结果。

是否存在关于日期平等的官方“问题”?是否需要比较隐藏的毫秒数,或者将比较限制为秒级别?

我尝试了其他几种方法,包括将CDate放在数组元素的前面。

FAIL:

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

通过:(但谁会想到这样做?)

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

3 个答案:

答案 0 :(得分:4)

这很可能是由于浮点预裂问题。日期存储为双精度浮点数,其中整数部分是日期,小数部分是时间。

要测试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 18/12/1986 12:19:33下午   假
  3.63797880709171E-12

答案 1 :(得分: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

答案 2 :(得分:0)

这么多年后,您很可能不需要答案,但是如果有人加入这个问题,也许会很有用。

Function DateEqual(date1 As Date, date2 As Date) As Boolean
    'use should never compare as equal dates or any double values but if you really need to do it carefully use this function.
    'converting to integers to test if they are equal. if you need to test time values recorded with less then 1second DO NOT USE THIS FUNCTION.
    Dim day1, day2 As Date
    Dim time1, time2 As Date
    day1 = Int(date1)
    day2 = Int(date2)
    If day1 = day2 Then
        If Hour(date1) = Hour(date2) And Minute(date1) = Minute(date2) And Second(date1) = Second(date2) Then
            DateEqual = True: Exit Function
        Else
            DateEqual = False: Exit Function
        End If
    Else
        DateEqual = False: Exit Function
    End If
End Function