Ошибка времени по времени в VBScript

Мой нижний код делает вид вычисления продолжительности, но во время выполнения он бросает исключение, что type mismatch , хотя оба параметра имеют значения даты внутри них. предложение, где ошибка?

<�Сильный> Код:

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 I have updated the code as per you and now getting below error.

<�Сильный> 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 Отображение:

enter image description here

New Error

0
добавлено отредактировано
Просмотры: 1
nl ja de

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    
2
добавлено
в этом случае вычет будет неудачным, вы сомневаетесь. Пожалуйста, объясните мне. Мне это непонятно. Просто дайте вам информацию об алгоритме, который я использовал в VBScript. Существует лист excel, и я загрузил строки в объект ArrayList , чтобы сделать некоторые манипуляции, и после этого через цикл я назвал вышеупомянутую функцию, чтобы передать время и вычислить длительность и вернуть ее обратно ArrayIndex.
добавлено автор Arup Rakshit, источник
значения даты 09/01/2012 01:11:11 PM , 09/01/2012 01:18:05 PM , поэтому в ArrayList объект!
добавлено автор Arup Rakshit, источник
MsgBox TypeName (dt1) , указывающий как String !
добавлено автор Arup Rakshit, источник
Теперь я получаю новую ошибку, см. Мое обновление!
добавлено автор Arup Rakshit, источник
вы можете мне помочь в моем предыдущем посте?
добавлено автор Arup Rakshit, источник
нет, я еще нет!
добавлено автор Arup Rakshit, источник
могу ли я получить некоторую помощь на этом посту - stackoverflow.com/questions/14085891/excel- Приборная панель-CREATIO & ZWNJ; п
добавлено автор Arup Rakshit, источник
мы не можем предположить, что dt2 всегда будет больше, чем dt1, может быть сделано обратное, тогда как передать то же самое. Пожалуйста, совет!
добавлено автор Arup Rakshit, источник
что bsign будет делать в вашем коде?
добавлено автор Arup Rakshit, источник
@VBSlover какие значения находятся в листе? Попробуйте вызвать свою функцию, например TimeSpan («1/1/2012», «1/1/2013») , чтобы проверить мою гипотезу.
добавлено автор phoog, источник
@VBSlover вы преобразовываете значение в строку, используя метод, который не может обрабатывать отрицательные значения. Обходной путь: определить, является ли значение отрицательным, преобразовать его абсолютное значение, а если значение отрицательное, добавьте знак минус. Переменная bSign - это флаг, в котором указано, было ли исходное значение отрицательным. Теперь я посмотрю ваш новый пост.
добавлено автор phoog, источник
@VBSlover я забыл добавить вызов Abs в моем недавнем редактировании; Я исправил это.
добавлено автор phoog, источник
@VBSlover, что ошибка «не удалось получить ...», по-видимому, является результатом того, что значение, которое вы форматируете, является отрицательным. Я отредактировал ответ одним возможным способом.
добавлено автор phoog, источник
Downvoter, прокомментируйте.
добавлено автор phoog, источник
@VBSlover извините, KimI был отключен, когда вы оставили этот последний комментарий. Вы еще не решили эту ошибку?
добавлено автор phoog, источник
@VBSlover, что я вам сказал ... используйте CDate, чтобы принудить значение к типу Date. Вы не можете вычитать строки! Ошибка, возникающая при попытке вычесть строки, не удивительно, что тип несоответствия.
добавлено автор phoog, источник
@VBSlover да, но являются ли они строками или фактическими значениями типа даты? Что произойдет, если вы добавите MsgBox TypeName (dt1) ?
добавлено автор phoog, источник

Существует функция 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)

Результат получается в днях, пересчитывается с секунд для достижения необходимой (минут и секунд) точности и совместимости с форматами дат.

2
добавлено
в части else , почему вы дважды вызывали функцию ?
добавлено автор Arup Rakshit, источник
Могу ли я получить результат в формате «[h]: mm: ss», так как мне нужно сохранить его, наконец, в ячейку Excel?
добавлено автор Arup Rakshit, источник
Я хотел иметь возможность прокомментировать второй ряд и иметь часы с одним движением пальца, пытаясь играть с форматами.
добавлено автор Jüri Ruut, источник
Если вы записываете результат TimeSpan в диапазон A2 (или где-то еще), добавьте одну строку: Range ("A2"). NumberFormat = "[h]: mm: ss" .
добавлено автор Jüri Ruut, источник