powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Изменение формата времени при превышении 24 часов
9 сообщений из 9, страница 1 из 1
Изменение формата времени при превышении 24 часов
    #33801975
VovaNa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Складываю скриптом VB время (1:23:44, 1:24:40, 1:13:11, 1:08:08) через переменную, но если сумма превышает 24 часа, то формат времени меняется на «31.12.1899 14:10:44», притом изменить его нельзя.
Что можно с этим сделать?

Тип переменной использую Date
...
Рейтинг: 0 / 0
Изменение формата времени при превышении 24 часов
    #33802401
Фотография Ivan33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
складывайте время в скрипте при переводе его в целый числа, после того как понадобится в формате времени, перевести из числового вида в нормальный формат.
...
Рейтинг: 0 / 0
Изменение формата времени при превышении 24 часов
    #33802662
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы посоветовал все переводить в секунды, а потом формировать строку соответсвующего формата.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Public Sub SumTime()
    Dim dtmTime1 As Date
    Dim dtmTime2 As Date
    Dim dtmSumm As Date
    Dim lngSeconds As Long
    
    dtmTime1 = "14:05:01"
    dtmTime2 = "15:15:10"
    
    dtmSumm = dtmTime1 + dtmTime2
    
    ' Будет напечатано 31.12.1899 5:20:11.
    Debug.Print dtmSumm
    
    ' Будет напечатано 29:20:11.
    Debug.Print fnTime(fnSeconds(dtmTime1) + fnSeconds(dtmTime2))
End Sub

Public Function fnSeconds( _
  dtmTime As Date) As Long
    fnSeconds = TimeValue(dtmTime) *  24  *  3600 
End Function

Public Function fnTime( _
  lngSeconds As Long) As String
    fnTime = Format(lngSeconds \  3600 , "00") & ":" & _
      Format((lngSeconds \  60 ) Mod  60 , "00") & ":" & _
      Format(lngSeconds Mod  60 , "00")
End Function
...
Рейтинг: 0 / 0
Изменение формата времени при превышении 24 часов
    #33802853
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или следующим образом.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Public Sub SumTime2()
    Dim dtmTime1 As Date
    Dim dtmTime2 As Date
    Dim dtmSum As Date
    Dim lngDays As Long
    
    dtmTime1 = "14:05:01"
    dtmTime2 = "15:15:10"
    
    dtmSum = dtmTime1 + dtmTime2
    lngDays = Int(dtmSum)
    
    If lngDays >  0  Then
        Debug.Print Format(lngDays *  24  + Hour(dtmSum), "00") & _
          ":" & Format(Minute(dtmSum), "00") & _
          ":" & Format(Second(dtmSum), "00")
    Else
        Debug.Print dtmSum
    End If
End Sub
...
Рейтинг: 0 / 0
Изменение формата времени при превышении 24 часов
    #33803766
VovaNa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое за скрипт, дело продвигается. Но слетает на моменте, когда время превышает 24 часа.
Попробуйте:
dtmTime1 = "24:05:01"
dtmTime2 = "15:15:10"
поймете.
...
Рейтинг: 0 / 0
Изменение формата времени при превышении 24 часов
    #33803904
k-nike2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так вы каким образом получаете в условно своей программе значение
Код: plaintext
dtmTime1 = "24:05:01"
???

Если задаете значение прямо в программе, то используйте функцию
Код: plaintext
dtmTime1 = TimeSerial( 24 , 5 , 1 )

Если преобразовываете строку, то
Код: plaintext
1.
2.
time1 = "24:06:01"
arrTime = Split(time1, ":")
dtmTime1 = TimeSerial(arrTime( 0 ), arrTime( 1 ), arrTime( 2 ))

А если иначе, например, через действия с другими переменными, то все должно быть пучком и так.
...
Рейтинг: 0 / 0
Изменение формата времени при превышении 24 часов
    #33804651
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VovaNaСпасибо большое за скрипт, дело продвигается. Но слетает на моменте, когда время превышает 24 часа.
Попробуйте:
dtmTime1 = "24:05:01"
dtmTime2 = "15:15:10"
поймете.

Все правильно. Значения даты и времени VBA хранят определенный момент времени, а не его промежуток, причем в переменной типа Date нет возможности хранить значение, большее 24 часов.
...
Рейтинг: 0 / 0
Изменение формата времени при превышении 24 часов
    #33804827
VovaNa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AshtonВсе правильно. Значения даты и времени VBA хранят определенный момент времени, а не его промежуток, причем в переменной типа Date нет возможности хранить значение, большее 24 часов.
Я это понял, спасибо, а в каком типе можно?
...
Рейтинг: 0 / 0
Изменение формата времени при превышении 24 часов
    #33805606
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например, в текстовом.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Public Sub SumTime2()
    Dim dtmTime1 As Date
    Dim dtmTime2 As Date
    Dim dtmSum As Date
    Dim lngDays As Long
    Dim strTime1 As String
    Dim strTime2 As String
    
    strTime1 = "24:05:01"
    strTime2 = "25:15:10"
    
    dtmTime1 = TimeSerial(Split(strTime1, ":")( 0 ), _
      Split(strTime1, ":")( 1 ), Split(strTime1, ":")( 2 ))
      
    dtmTime2 = TimeSerial(Split(strTime2, ":")( 0 ), _
      Split(strTime2, ":")( 1 ), Split(strTime2, ":")( 2 ))
    
    dtmSum = dtmTime1 + dtmTime2
    lngDays = Int(dtmSum)
    
    If lngDays >  0  Then
        Debug.Print Format(lngDays *  24  + Hour(dtmSum), "00") & _
          ":" & Format(Minute(dtmSum), "00") & _
          ":" & Format(Second(dtmSum), "00")
    Else
        Debug.Print dtmSum
    End If
End Sub
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Изменение формата времени при превышении 24 часов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]