planetz Ответов: 4

Формат разницы дат в ЧЧ: мм:СС в excel VBA


Всем Привет,

Я пытаюсь отформатировать разницу дат в формате hh:mm: ss в excel vba. "1 час 20 минут" будет "01:20:00", "30 минуты 40 сек" будет "00: 30: 40" и так далее.

Даты указаны в формате
ДД-ММ-гггг чч: мм: СС АМ/ПМ

Что я уже пробовал:

diff = Format(endDateTime-startDateTime, " hh:mm:ss")


Я пробовал эту формулу. Но это, кажется, не дает правильного ответа.

ZurdoDev

Вложенный Макрос Macro1()
'
'Макрос1 Макрос
'

'

Дим значение как дату, endDateTime как дата
startDateTime = " 2017/06/22 10: 00 AM"
endDateTime = " 2017/06/22 3: 00 PM"

Дим разница как дата
diff = Format(endDateTime-startDateTime, " hh:mm:ss")
Конец Подводной Лодки


diff дает мне 5: 00: 00 утра.

planetz

Я преобразовал строки в дату с помощью CDate (). Может ли это быть проблемой?

Richard Deeming

Можете ли вы показать нам пример ввода, ожидаемого вывода и фактического (неправильного) вывода?

planetz

Да, конечно.

входные:
дата 1=20-06-2017 01: 02: 30
date2=21-06-2017 01: 04: 30 am

после вычитания date2-date1 выводим
00:02:00

Он вычисляет только минуты и секунды, а не часы.

Мой код:

Dim startDateTime, endDateTime как дата

значение = функция cdate(форма.txtStartTime.Текст)
endDateTime = функция cdate(форма.txtEndTime.Текст)

Form.txtDuration.Text = Format ((endDateTime-startDateTime), "hh:mm:ss")

4 Ответов

Рейтинг:
2

Patrice T

Цитата:
входные:
дата 1=20-06-2017 01: 02: 30
date2=21-06-2017 01: 04: 30 am

после вычитания date2-date1 выводим
00:02:00

Он вычисляет только минуты и секунды, а не часы.

Это форматирование Excel.
Результат - 1 день, 0 часов и 2 минуты, так как вы хотите отображать только часы и минуты, дисплей правильный.
[Обновление]
Чтобы получить результат более чем за 24 часа, вам нужно построить свое собственное форматирование.
Попробуйте использовать "[h]"форматирование excel, чтобы получить более 24 часов.


Рейтинг:
0

Richard Deeming

Проблема в том, что hh спецификатор формата включает только часы, которые не считаются днями. Как только вы проходите более 24 часов, все становится немного сложнее.

Попробуйте что-нибудь вроде этого:

Dim startDateTime As Date, endDateTime As Date
Dim diff As Double, totalHours As Long

startDateTime = CDate(Form.txtStartTime.Text)
endDateTime = CDate(Form.txtEndTime.Text)
diff = endDateTime - startDateTime

totalHours = CLng(24 * diff)

Form.txtDuration.Text = Format(totalHours, "00") & ":" & Format(diff, "mm:ss")


Рейтинг:
0

Gustav Brock

Вы можете использовать эту функцию:

Public Function FormatHourMinuteSecondDiff( _
  ByVal datTimeStart As Date, _
  ByVal datTimeEnd As Date, _
  Optional ByVal strSeparator As String = ":") _
  As String
  
' Returns count of days, hours, minutes and seconds of difference
' between datTimeStart and datTimeEnd converted to
' hours and minutes and seconds as a signed formatted string
' with an optional choice of time separator.
'
' Example:
'   datTimeStart: #10:03:02#
'   datTimeEnd  : #20:01:18#
'   returns     : 9:58:16
'
'   datTimeStart: #22:13:34#
'   datTimeEnd  : #3:45:47#
'   returns     : -18:27:47
'
' 2007-11-05. Cactus Data ApS, CPH.
  
  Const cintSecondsHour As Integer = 60 * 60
  
  Dim lngSeconds    As Long
  Dim strHourFull   As String
  Dim strHourPart   As String
  Dim strHMS        As String
  
  lngSeconds = DateDiff("s", datTimeStart, datTimeEnd)
  strHourFull = CStr(lngSeconds \ cintSecondsHour)
  ' Format minute and second part.
  strHourPart = Format(TimeSerial(0, 0, Abs(lngSeconds) Mod cintSecondsHour), "nn\" & strSeparator & "ss")
  strHMS = strHourFull & strSeparator & strHourPart
  
  FormatHourMinuteSecondDiff = strHMS
  
End Function


Рейтинг:
0

Maciej Los

Воспользуйся функция DateDiff()[^] функция.

Dim date1 As Date = CDate("2017-06-20 08:05:30 PM")
Dim date2 As Date = CDate("2017-06-21 01:04:30 AM")

Dim totalminutes As Integer = DateDiff("n", date1, date2)
Dim hours As Integer = totalminutes /60
'the rest of dividing
Dim minutes As Integer = (totalminutes Mod 60)

Dim sMessage = totalminutes & " minutes = " & hours & " hours " & minutes & " minutes"
MessageBox sMessage, vbinformation, "Information"

Результат:
299 minutes = 4 hours 59 minutes


Примечание: я использовал YYYY-MM-DD обозначение даты (формат ISO[^]).