持续时间不符合所有数据值的[h]:mm:ss格式

时间:2012-12-30 17:02:37

标签: excel-vba vbscript vba excel

我目前正在使用一些Time duration calculation函数来确定总持续时间。现在,函数为以下日期提供了预期格式[h]:mm:ss的输出:11/15/2012 8:45:43 AM12/7/2012 8:45:43 AM - 持续时间为87:45:55 corect )但对于此1/3/2013 8:45:43 AM9/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

请帮助我了解错误是什么以及它可以成为什么?

由于

3 个答案:

答案 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

证明:

  1. @ VBSlover对问题的描述无法信任。在#11 / 15/2012 8:45:43 AM#和#12/7/2012 8:45:43 AM#之间约有22天/ 528小时。每个人都猜测87:45:55来自哪里。 (所以问题应该被低估)
  2. 除了@KekuSemau之外,WorksheetFunction.Text()返回合理的字符串值,只要您输入正确的参数即可。 (因此,如果没有对主题做出回答并且有用,则应该进行投票)
  3. @VBSlovers代码包含一个OERN。因此,如果在分配TimeSpan(函数名称)时出现问题,则该函数的返回值是未定义的。难怪有些细胞充满了虚假的数据,当你隐藏错误时,这就是你得到的。
  4. 更新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函数中完成。如果你想要,你必须将对目标范围的引用作为另一个参数传递,并让函数直接写入它(并添加格式)。