2012-12-28 68 views
0

我的下面的代碼正在做一種持續時間計算,但是在運行時它引發了一個異常,即type mismatch,儘管這兩個參數都有date values。因此,任何暗示錯誤是什麼的建議?VBScript中的日期時間錯誤

代碼:

Function TimeSpan(dt1,dt2) 
Dim dtTemp 

objExcel1.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 ;) 
    Msgbox("DT2:" & dt2 & "DT1:" & dt1) 
    TimeSpan = objExcel1.Application.WorksheetFunction.Text((dt2 - dt1), "[h]:mm:ss")'"dd:hh:mm:ss" 

objExcel1.Application.ScreenUpdating = True 
End Function 

Date values to the parameters passed by the Calle

Date error

@Tomalak我已經更新了代碼,按你現在得到下面的錯誤。

CODE

Function TimeSpan(dt1, dt2) 
    If Not (IsDate(dt1) And IsDate(dt2)) Then 

     TimeSpan = "00:00:00" 

    ElseIf dt2 < dt1 Then 

     TimeSpan = TimeSpan(dt2, dt1) 

    Else 

     MsgBox((CDate(dt1) - CDate(dt2))) 
     TimeSpan = objExcel1.Application.WorksheetFunction.Text((CDate(dt1) - CDate(dt2)), "[h]:mm:ss") 

    End If 

End Function 

Msgbox Displaying:

enter image description here

New Error

回答

2

有一個函數DateDiff()可用,這使得生活更簡單:

Function TimeSpan(dt1, dt2) 

    If Not (IsDate(dt1) And IsDate(dt2)) Then 
     TimeSpan = "00:00:00" 
    Else 
     TimeSpan = Abs(DateDiff("s", dt2, dt1))/3600 
     TimeSpan = TimeSpan/24 
    End If 

MsgBox (TimeSpan) 

結果是天,從秒重新計算以實現所需要的(分和秒)的精度和帶日期格式的兼容性。

+0

我可以得到結果:「[h]:mm:ss」格式,因爲我需要將其最終存儲到Excel單元格中嗎?在'else'部分中的 –

+0

爲什麼你稱這個函數爲'twice'? –

+0

我希望能夠在第二行註釋掉,並且在嘗試使用格式時可以用一個手指移動幾個小時。 –

2

這只是一種猜測,但你的價值觀可能是字符串值。如果值是一個可以轉換爲日期的字符串,則IsDate()將返回true。但是,在這種情況下,減法將失敗。您可以修復與CDATE()或CVDate()函數:

TimeSpan = objExcel1.Application.WorksheetFunction.Text((CDate(dt2) - CDate(dt1)), "[h]:mm:ss")'"dd:hh:mm:ss" 

要解決「無法得到......」的錯誤,試試這個:

Dim bSign 
bSign = CDate(dt2) < CDate(dt1) 
TimeSpan = objExcel1.Application.WorksheetFunction.Text(Abs(CDate(dt2) - CDate(dt1)), "[h]:mm:ss")'"dd:hh:mm:ss" 
If bSign Then 
    TimeSpan = "-" & TimeSpan 
End If  
+0

在這種情況下,減法將失敗,你懷疑。請解釋我。我不清楚。給你一個關於我在VBScript中使用的算法的背景。有一個Excel表格,我已經將行加載到'ArrayList'對象中,執行一些操作,然後通過循環調用上述函數來傳遞時間並計算持續時間並將其返回給ArrayIndex。 –

+0

@VBSlover工作表中的值是什麼?嘗試調用像TimeSpan(「1/1/2012」,「1/1/2013」​​)這樣的函數來檢驗我的假設。 – phoog

+0

日期值是'09/01/2012 01:11:11 PM','09/01/2012 01:18:05 PM',等等'ArrayList'對象! –