Excel VBScript中的日期时间错误

Excel VBScript中的日期时间错误,excel,vbscript,vba,Excel,Vbscript,Vba,我下面的代码正在进行某种持续时间计算,但是在运行时它抛出了一个异常,即类型不匹配,尽管这两个参数中都有日期值。那么,有没有关于错误在哪里的建议 代码: Function TimeSpan(dt1,dt2) Dim dtTemp objExcel1.Application.ScreenUpdating = False If (IsDate(dt1) And IsDate(dt2)) = False Then TimeSpan = "00:00:00" Ex

我下面的代码正在进行某种持续时间计算,但是在运行时它抛出了一个异常,即
类型不匹配
,尽管这两个参数中都有
日期值
。那么,有没有关于错误在哪里的建议

代码:

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
功能时间跨度(dt1、dt2)
暗dtTemp
objExcel1.Application.screenUpdate=False
如果(IsDate(dt1)和IsDate(dt2))=False,则
TimeSpan=“00:00:00”
退出功能
如果结束
如果dt2小于dt1,则
dtTemp=dt2
dt2=dt1
dt1=dt2
如果结束
’--因为你只有几天,我在这里已经撑了几天了。
“--如果需要月、年,可以使用yy:mm:dd:hh:mm:ss
’--这是非常自我解释的;)
Msgbox(“DT2:”&DT2&“DT1:”&DT1)
TimeSpan=objExcel1.Application.WorksheetFunction.Text((dt2-dt1),“[h]:mm:ss”)”“dd:hh:mm:ss”
objExcel1.Application.screenUpdate=True
端函数

@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
功能时间跨度(dt1、dt2)
如果不是(IsDate(dt1)和IsDate(dt2)),则
TimeSpan=“00:00:00”
如果dt2小于dt1,则
时间跨度=时间跨度(dt2,dt1)
其他的
MsgBox((CDate(dt1)-CDate(dt2)))
TimeSpan=objExcel1.Application.WorksheetFunction.Text((CDate(dt1)-CDate(dt2)),“[h]:mm:ss”)
如果结束
端函数
Msgbox显示:


这只是猜测,但您的值可能是字符串值。如果值是可以转换为日期的字符串,则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    
Dim b信号
bSign=CDate(dt2)
这只是猜测,但您的值可能是字符串值。如果值是可以转换为日期的字符串,则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    
Dim b信号
bSign=CDate(dt2)
有一个函数
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)

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

有一个函数
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)

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

在这种情况下,减法将失败,你怀疑。请给我解释一下。我不清楚。只是给你一个关于我在VBScript中使用的算法的背景。有一个excel工作表,我已将行加载到
ArrayList
对象中,进行一些操作,然后通过循环调用上述函数传递时间并计算持续时间,然后将其返回到ArrayIndex。@VBSlover工作表中有哪些值?尝试调用您的函数,如
TimeSpan(“2012年1月1日”、“2013年1月1日”)
来检验我的假设。日期值是
2012年9月1日01:11:11 PM
2012年9月1日01:18:05 PM
,依此类推,在
ArrayList
对象中@VBSlover是的,但它们是字符串还是实际的日期类型值?如果添加
MsgBox TypeName(dt1)
,会发生什么情况?@VBSlover我告诉过你什么了。。。使用CDate将值强制为日期类型。你不能减去字符串!当您尝试减去字符串时出现的错误是类型不匹配,这并不奇怪。在这种情况下,减法将失败,您对此表示怀疑。请给我解释一下。我不清楚。只是给你一个关于我在VBScript中使用的算法的背景。有一个excel工作表,我已将行加载到
ArrayList
对象中,进行一些操作,然后通过循环调用上述函数传递时间并计算持续时间,然后将其返回到ArrayIndex。@VBSlover工作表中有哪些值?尝试调用您的函数,如
TimeSpan(“2012年1月1日”、“2013年1月1日”)
来检验我的假设。日期值是
2012年9月1日01:11:11 PM
2012年9月1日01:18:05 PM
,依此类推,在
ArrayList
对象中@VBSlover是的,但它们是字符串还是实际的日期类型值?如果添加
MsgBox TypeName(dt1)
,会发生什么情况?@VBSlover我告诉过你什么了。。。使用CDate将值强制为日期类型。你不能减去字符串!当您尝试减去字符串时出现的错误是,不足为奇的,类型不匹配。我是否可以以“[h]:mm:ss”格式获得结果,因为我需要将其最终存储到Excel单元格中?在
else
部分,为什么您两次调用函数
?我希望能够注释掉第二行,并用一根手指移动几个小时,在尝试使用格式时。如果您将TimeSpan结果写入范围
A2
(或其他地方),请添加一行:
range(“A2”)。NumberFormat=“[h]:mm:ss”
。我能否以“[h]:mm:ss”格式获取结果,因为我最终需要将其存储到Excel单元格中?在
其他
部分,为什么调用函数
两次
?我希望在尝试使用格式时,能够注释掉第二行并用一根手指移动数小时。如果您将TimeSpan结果写入范围
A2
(或其他地方),添加一行:
Range(“A2”).NumberFormat=“[h]