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]