date值减法产生错误的错误
我正在使用下面的代码来显示在日:小时:分钟格式的date差异。
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
你能解释为什么吗?
谢谢
在UDF中尝试我以前的post的答案,如下所示:答案在VBA中
请声明所有variables,强制自己声明通过添加选项显式:)
option explicit Function TimeSpan(dt1 As Date, dt2 As Date) As String Dim dtTemp As Date 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 ;) TimeSpan = Application.WorksheetFunction.Text((dt2 - dt1), "dd:hh:mm:ss") Application.ScreenUpdating = False End Function
UDF输出:
但是,如果您有这样的自由和可能,我真的build议您使用Excel工作表function。
如果date差异超过31天
然后按照本文使用解决scheme将DateDiff
合并到UDF中。
请注意我更习惯写VBA,所以你可能需要在这里和那里调整。
另外,你也可以把彼此的两个date减去数值:
Dim dblDateDiff as Double dblDateDiff = Abs(dt2 - dt1)
现在时间跨度将会是(不要使用“d”,因为这将不包括可能已经过去的月份和年份):
Timespan = Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff)
如果Timespan的方向(正值或负值)是相关的,则可以将最后一行更改为:
Timespan = Sgn(dblDateDiff) * Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff)
对于你的时间格式问题:
- 将输出单元格的数字格式设置为文本或
-
在string的其余部分添加单引号:
Timespan = "'" & Sgn(dblDateDiff) * Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff)