0

私は現在Time duration calculation、合計期間を決定するためにいくつかの関数を使用しています。[h]:mm:ssこれで、以下の日付の期待どおりの形式で出力を提供する関数:11/15/2012 8:45:43 AMおよび12/7/2012 8:45:43 AM-期間は87:45:55corect)ですが、これ1/3/2013 8:45:43 AMおよび9/6/2012 8:04:58 AM-ここでは、Excel列の期間は(INCORRECT)として格納されて4/28/1900 12:40:45 AMます。今私の質問は、なぜそれが他の人のようにExcel列に保存されないのですか?

コード

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

バグとは何か、その修正は何であるかを理解するのを手伝ってください。

ありがとう

4

3 に答える 3

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(関数名)への割り当てに問題がある場合、その関数の戻り値は未定義です。エラーを非表示にすると、一部のセルが偽のデータでいっぱいになるのも不思議ではありません。

更新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

ショーンのコードにはバグがあるに違いないことに気付くでしょう。

于 2012-12-30T22:25:26.560 に答える
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
于 2012-12-31T17:05:00.387 に答える
0

ここでは、Excelはフォーマットを考慮しません。テキストをExcelセルに送信すると、Excelはこれを任意の入力として扱い、適切と思われるものに変換しようとします。ただし、数値形式を直接 コーディングすることはできます。

With [some Range Object]
    .NumberFormat = "[h]:mm:ss"
    .Value = TimeSpan(..., ...)
End With

...TimeSpan関数はむしろ日付値を返す必要があります。

これは、TimeSpan関数内からは実行できません。それが必要な場合は、別のパラメーターとしてターゲット範囲への参照を渡し、関数に直接書き込む(そしてフォーマットを追加する)必要があります。

于 2012-12-30T20:50:16.727 に答える