Excel 日期值减法产生错误错误

Excel 日期值减法产生错误错误,excel,vbscript,Excel,Vbscript,我使用以下代码以日:小时:分钟格式显示日期差异 Function TimeSpan(dt1, dt2) Dim seconds,minutes,hours,days If (isDate(dt1) And IsDate(dt2)) = false Then TimeSpan = "00:00:00" Exit Function End If seconds = Abs(DateDiff("S", dt1, dt2)

我使用以下代码以日:小时:分钟格式显示日期差异

 Function TimeSpan(dt1, dt2) 

    Dim seconds,minutes,hours,days

    If (isDate(dt1) And IsDate(dt2)) = false Then 
        TimeSpan = "00:00:00" 
        Exit Function 
    End If 

    seconds = Abs(DateDiff("S", dt1, dt2)) 
    minutes = seconds \ 60 
    hours = minutes \ 60 
    days  = hours \ 24
    minutes = minutes mod 60 
    seconds = seconds mod 60 
    days    = days    mod 24 

    if len(hours) = 1 then hours = "0" & hours 

    TimeSpan = days& ":" & _ 
        RIGHT("00" & hours , 2) & ":" & _ 
        RIGHT("00" & minutes, 2) 
End Function 
但在某些情况下,它并没有产生预期的价值

  D1=#9/24/2012  8:09:15 AM# and D2=#9/25/2012  8:09:15 AM# gives correct data like 1:24:00 whereas below are producing error when working with VBScript and Excel.
  D1=#9/5/2012  8:45:43 AM# and D2=#9/25/2012  8:45:43 AM# result=0.888888888888889
  D1=#9/6/2012  8:29:34 AM# and D2=#9/17/2012  8:59:36 AM# result=0.503125
你能解释一下原因吗

谢谢

在你的自定义项中尝试我的答案如下:答案在VBA中

请声明所有变量,并通过添加选项explicit:)强制自己声明。

选项显式
函数TimeSpan(dt1作为日期,dt2作为日期)作为字符串
Dim dtTemp作为日期
Application.ScreenUpdating=False
如果(IsDate(dt1)和IsDate(dt2))=False,则
TimeSpan=“00:00:00”
退出功能
如果结束
如果dt2小于dt1,则
dtTemp=dt2
dt2=dt1
dt1=dt2
如果结束
’--因为你只有几天,我在这里已经撑了几天了。
“--如果需要月、年,可以使用yy:mm:dd:hh:mm:ss
’--这是非常自我解释的;)
TimeSpan=Application.WorksheetFunction.Text((dt2-dt1),“dd:hh:mm:ss”)
Application.ScreenUpdating=False
端函数
自定义项输出:

但如果您有自由和可能,我建议您使用Excel工作表功能。


如果日期差异超过31天 然后使用
DateDiff
合并到UDF中。

请注意,我更习惯于编写VBA,因此您可能需要在这里和那里进行调整

或者,您可以将两个日期作为数值相减:

Dim dblDateDiff as Double
dblDateDiff = Abs(dt2 - dt1)
现在的时间跨度是(不要使用“d”,因为这不包括可能已经过去的月份和年份):

如果时间跨度的方向(正或负)相关,您可以将最后一行更改为:

Timespan = Sgn(dblDateDiff) * Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff)
对于您的时间格式问题:

  • 将输出单元格的数字格式设置为文本,或
  • 在字符串的其余部分前面添加一个引号:

     Timespan = "'" & Sgn(dblDateDiff) * Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff)
    

  • 为什么你需要这样一个复杂的函数,而经过的时间却很容易找到?请确认,您正在使用VBSCRIPT或VBA,这是两个不同的东西。我正在使用VBSCRIPT。。。我没有受过VBA教育…你能帮我在下面的帖子里。。。这对我来说真的很痛苦吗?我的回答对你有用吗?你清楚这个概念吗?如果没有,请让我/我们知道什么不起作用。如果提供的答案对你有效,那么在答题贴左侧的V形标记上打勾(或者在@bonCodigo的答案对你有效的情况下打勾),这样所有人都会知道你不需要在这个问题上进一步的帮助。是的,我试过你的答案。。。而且它的输出比前一个稍微好一点。但在持续时间内,我也得到了输出:D1=“9/11/2012 1:42:59 AM”和D2=“9/4/2012 6:09:15 AM”,但输出是:“6:19:33 AM”。。我只想要持续时间部分,而不是持续时间后的任何上午或下午。请建议如何删除该部分。我不理解您的评论,您是否应用了我的脚本,这是否会给您带来这个问题(我认为这是不可能的),或者您是否用其他解决方案解决了上午或下午的问题?可能发生的是Excel“思考”答案day:hour:minute实际上是hour:minute:second,为了避免这种情况,您必须手动设置将答案写入文本的单元格的数字格式。在你写下答案之前,要这样做,否则Excel已经转换了答案。或者,您可以在字符串的开头添加一个引号,这样Excel将不会将输出转换为时间值!你能在我下面的帖子里帮我吗。。。这对我来说真的很痛苦吗让我试试看?但是你确实理解上面答案中的概念吗?顺便说一句,看看你的评论,似乎KB的解决方案除了一个小的am/pm问题之外对你有效。将其格式化为24小时格式,这样您就不会得到这样的结果。如果您仍然需要将我的代码更改为VBScript,请告知我:)是的,我做完了!使用KB的解决方案。。请帮我写上面提到的帖子…祝你好运。。。我真的…在大海的中央。。我的代码花了太多的时间…所以需要你们的帮助才能使它优化。:-)如果可能,您可以就KB的代码提供建议,您希望我将这种24小时格式放在哪里。:-)
    Timespan = Sgn(dblDateDiff) * Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff)
    
     Timespan = "'" & Sgn(dblDateDiff) * Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff)