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
答案 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