1

Win7 上の MS Excel Professional Plus v14。

日付/時刻の等価性を比較するのに問題があります。

等しいように見える 2 つの日付、12/16/2013 12:19:33 pm は両方とも日付としてディメンション化されます。1 つは日付配列内にあり、もう 1 つは日付変数です。arrPP は後で ReDim されます。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 を配置するなど、他のいくつかの方法を試しました。

不合格:

    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
4

3 に答える 3

4

これは、浮動小数点の精度の問題が原因である可能性が最も高いです。日付は倍精度浮動小数点数として格納されます。整数部分は日付で、小数部分は時間です。

おそらく使用するのが最善のarrPP(iPP_START,lPP_index)前であるかどうかをテストするにはdNextStartTime

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

DateDiff最初の日付パラメータが 2 番目の日付パラメータより前の場合、正の値を返すことに注意してください。

明らかに等しい 2 つの日付が等しくない可能性があることを示すには、これを実行してみてください。

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 午後
False
3.63797880709171E-12

于 2013-10-22T00:36:10.150 に答える
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
于 2013-10-22T04:45:43.110 に答える