0

我下面的代码正在做某种持续时间计算,但是在运行时它抛出了一个异常type mismatch,尽管这两个参数都包含date values在其中。那么有什么建议是错误在哪里吗?

代码:

Function TimeSpan(dt1,dt2)
Dim dtTemp

objExcel1.Application.ScreenUpdating = False
    If (IsDate(dt1) And IsDate(dt2)) = False Then
        TimeSpan = "00:00:00"
        Exit Function
    End If

    If dt2 < dt1 Then
        dtTemp = dt2
        dt2 = dt1
        dt1 = dt2
    End If
    '-- since you only had days, I have put up to days here. 
    '-- if you require months, years you may use yy:mm:dd:hh:mm:ss
    '-- which is pretty self-explainatory ;)
    Msgbox("DT2:" & dt2 & "DT1:" & dt1)
    TimeSpan = objExcel1.Application.WorksheetFunction.Text((dt2 - dt1), "[h]:mm:ss")'"dd:hh:mm:ss"

objExcel1.Application.ScreenUpdating = True
End Function

Calle传递的参数的日期值

日期错误

@Tomalak我已经按照您的要求更新了代码,现在出现错误。

代码

Function TimeSpan(dt1, dt2)
    If Not (IsDate(dt1) And IsDate(dt2)) Then

        TimeSpan = "00:00:00"

    ElseIf dt2 < dt1 Then

        TimeSpan = TimeSpan(dt2, dt1)

    Else

        MsgBox((CDate(dt1) - CDate(dt2)))
        TimeSpan = objExcel1.Application.WorksheetFunction.Text( (CDate(dt1) - CDate(dt2)), "[h]:mm:ss" )

    End If  

End Function

Msgbox Displaying:

在此处输入图像描述

新错误

4

2 回答 2

2

这只是一个猜测,但您的值可能是字符串值。如果值是可以转换为日期的字符串,则 IsDate() 将返回 true。但是,在这种情况下,减法将失败。您可以使用 CDate() 或 CVDate() 函数解决此问题:

TimeSpan = objExcel1.Application.WorksheetFunction.Text((CDate(dt2) - CDate(dt1)), "[h]:mm:ss")'"dd:hh:mm:ss"

要解决“无法获取...”错误,请尝试以下操作:

Dim bSign
bSign = CDate(dt2) < CDate(dt1)
TimeSpan = objExcel1.Application.WorksheetFunction.Text(Abs(CDate(dt2) - CDate(dt1)), "[h]:mm:ss")'"dd:hh:mm:ss"
If bSign Then
    TimeSpan = "-" & TimeSpan
End If    
于 2012-12-28T08:22:50.393 回答
2

有一个DateDiff()可用的功能,它使生活更简单:

 Function TimeSpan(dt1, dt2)

    If Not (IsDate(dt1) And IsDate(dt2)) Then
        TimeSpan = "00:00:00"
    Else
       TimeSpan = Abs(DateDiff("s", dt2, dt1)) / 3600
         TimeSpan = TimeSpan / 24
    End If

 MsgBox (TimeSpan)

结果以天为单位,从秒重新计算,以达到所需的(分钟和秒)精度和与日期格式的兼容性。

于 2012-12-28T17:11:12.190 回答