我目前正在使用一些Time duration calculation
函数来确定总持续时间。现在,函数为以下日期提供了预期格式[h]:mm:ss
的输出:11/15/2012 8:45:43 AM
和12/7/2012 8:45:43 AM
- 持续时间为87:45:55
( corect )但对于此1/3/2013 8:45:43 AM
和9/6/2012 8:04:58 AM
- 此处excel列中的持续时间已存储为4/28/1900 12:40:45 AM
( INCORRECT < /强>)。现在我的问题是为什么它不像其他人一样存储在excel列中?
CODE
Function TimeSpan(dt1, dt2)
If Not (IsDate(dt1) And IsDate(dt2)) Then
TimeSpan = "00:00:00"
ElseIf CDate(dt2) > CDate(dt1) Then
TimeSpan = TimeSpan(dt2, dt1)
Else
On Error Resume Next
'MsgBox(DateDiff(CDate(dt1) - CDate(dt2)))
TimeSpan = objExcel1.Application.WorksheetFunction.Text((CDate(dt1) - CDate(dt2)), "[h]:mm:ss")
If Err Then
Err.Clear
'MsgBox(CDate(dt1))
'MsgBox(CDate(dt2))
End If
On Error GoTo 0
End If
End Function
请帮助我了解错误是什么以及它可以成为什么?
由于
答案 0 :(得分:2)
这个脚本:
Option Explicit
Dim goFS : Set goFS = CreateObject( "Scripting.FileSystemObject" )
Dim sFSpec : sFSpec = "..\data\updsheet\save.xls"
Dim oExcel : Set oExcel = CreateObject("Excel.Application")
Dim oWBook : Set oWBook = oExcel.Workbooks.Open(goFS.GetAbsolutePathName(sFSpec))
Dim dtA : dtA = #1/3/2013 8:45:43 AM#
Dim dtB : dtB = #9/6/2012 8:04:58 AM#
Dim dtC : dtC = #11/15/2012 8:45:43 AM#
Dim dtD : dtD = #12/7/2012 8:45:43 AM#
Dim aTests : aTests = Array( _
dtA, dtB _
, dtC, dtD _
)
Dim i
For i = 0 To UBound(aTests) Step 2
WScript.Echo "----", i, aTests(i + 0), "<>", aTests(i + 1), aTests(i + 0) - aTests(i + 1), aTests(i + 1) - aTests(i + 0)
On Error Resume Next
WScript.Echo "A", oExcel.Application.WorksheetFunction.Text(aTests(i + 0) - aTests(i + 1), "[h]:mm:ss")
If Err.Number Then WScript.Echo "A", Err.Description
On Error GoTo 0
On Error Resume Next
WScript.Echo "B", oExcel.Application.WorksheetFunction.Text(aTests(i + 1) - aTests(i + 0), "[h]:mm:ss")
If Err.Number Then WScript.Echo "B", Err.Description
On Error GoTo 0
WScript.Echo
Next
oExcel.Quit
及其输出(德语区域设置!):
---- 0 03.01.2013 08:45:43 <> 06.09.2012 08:04:58 119,028298611112 -119,028298611112
A 2856:40:45
B Die Text-Eigenschaft des WorksheetFunction-Objektes kann nicht zugeordnet werden.
---- 2 15.11.2012 08:45:43 <> 07.12.2012 08:45:43 -22 22
A Die Text-Eigenschaft des WorksheetFunction-Objektes kann nicht zugeordnet werden.
B 528:00:00
证明:
更新I:wrt @ Sean的建议:
如果你跑
Option Explicit
Dim dtA : dtA = #1/3/2013 8:45:43 AM#
Dim dtB : dtB = #9/6/2012 8:04:58 AM#
Dim Sean : Sean = "2856:09:45"
Dim Ekke : Ekke = "2856:40:45"
WScript.Echo "!German Locale!"
WScript.Echo "dtB", dtB
WScript.Echo "dtA", dtA
WScript.Echo "Sean", Sean, "=>", addTS(dtB, Sean)
WScript.Echo "Ekke", Ekke, "=>", addTS(dtB, Ekke)
Function addTS(dtX, sHMS)
Dim aParts : aParts = Split(sHMS, ":")
addTS = dtX
addTS = DateAdd("h", CLng(aParts(0)), addTS)
addTS = DateAdd("n", CLng(aParts(1)), addTS)
addTS = DateAdd("s", CLng(aParts(2)), addTS)
End Function
输出:
!German Locale!
dtB 06.09.2012 08:04:58
dtA 03.01.2013 08:45:43
Sean 2856:09:45 => 03.01.2013 08:14:43
Ekke 2856:40:45 => 03.01.2013 08:45:43
你会发现肖恩的代码中肯定存在错误。
答案 1 :(得分:2)
对TimeSpan
计算的更改将允许您获得时间。我使用了您注释掉的DateDiff
(格式不正确)并将函数从.Application.WorksheetFunction
更改为内置函数:
TimeSpan = DateDiff("h", CDate(dt2), CDate(dt1)) & _
Format((CDate(dt1) - CDate(dt2)), ":nn:ss")
当我进入即时窗口时,键入
?timespan("1/3/2013 8:45:43 AM","9/6/2012 8:04:58 AM")
它给了我一个答案
2856:40:45
答案 2 :(得分:0)
Excel不关心您的格式。您将文本发送到Excel单元格,Excel将其视为任何输入,并尝试将其转换为它认为合适的任何内容。但是,您可以直接编码 numberformat :
With [some Range Object]
.NumberFormat = "[h]:mm:ss"
.Value = TimeSpan(..., ...)
End With
... TimeSpan函数应该返回一个日期值。
这不能在TimeSpan函数中完成。如果你想要,你必须将对目标范围的引用作为另一个参数传递,并让函数直接写入它(并添加格式)。