Excel VBA Хранение конкретного значения времени в ячейке из пользовательской формы

У меня есть пользовательская форма, которая требует от пользователя ввода определенной даты и времени через два отдельных поля со списком, cboStartDate, cboStartTime. Пользователь также должен будет ввести продолжительность в текстовом поле txtDuration.

После сохранения дата и время начала будут сохранены в отформатированной ячейке [ДД/ММ/ГГГГ ЧЧ:ММ AM/PM]. Дата и время окончания будут рассчитаны из поля продолжительности и сохранены в другой ячейке с таким же форматированием. Что-то вроде этого:

+-----------------------+-----------------------+
| startTime             | endTime               |
+-----------------------+-----------------------+
| 2/4/2012  11:30:00 AM | 2/4/2012  2:00:00 PM  |
+-----------------------+-----------------------+

Однако после запуска пользовательской формы время начала не сохраняется, а время окончания не рассчитывается. Что-то вроде этого:

+-----------------------+-----------------------+
| startTime             | endTime               |
+-----------------------+-----------------------+
| 2/4/2012  12:00:00 AM | 2/4/2012  12:00:00 AM |
+-----------------------+-----------------------+

Ниже моя часть моего кода VBA:

Dim iRow As Long
Dim ws As Worksheet
Dim startDate As Date
Dim unFmtStartDuration() As String
Dim startDuration As Double
Dim minTest As Integer
Dim endDate As Date
Dim endDuration As Double

Set ws = Worksheets("EVENTS")

'Search for the last row in the worksheet
iRow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

'Date manipulation and set start and end timings
unFmtStartDuration() = Split(cboStartTime.Text, ":")
startDuration = unFmtStartDuration(0)
If unFmtStartDuration(1) = "00" Then
    minTest = 0
Else
    minTest = unFmtStartDuration(1)
    If minTest = 30 Then
        startDuration = startDuration + 0.5
    End If
End If
startDate = DateValue(DateAdd("h", startDuration, cboDate.Text & " 12:00AM"))
ws.Cells(iRow, 4).Value = startDate
endDuration = txtDuration.Value
endDate = DateValue(DateAdd("h", endDuration, startDate))
ws.Cells(iRow, 5).Value = endDate

Итак, как я могу разобраться с этой частью? Был бы признателен за любую помощь здесь. Спасибо.

P.S. Хотел бы разместить скриншоты здесь, но моя репутация здесь слишком низкая для этого. Извиняюсь.


person Robert Sim    schedule 29.03.2012    source источник


Ответы (1)


Похоже, вы только добавляете время, когда minTest = 30, но это значение, вероятно, сильно различается. Кроме того, в одном случае вы сравниваете строку, а в другом — число при ссылке на unFmtStartDuration, что может работать, но сбивает с толку при чтении кода.

Чтобы следовать вашему текущему методу, используйте

startDuration = Val(unFmtStartDuration(0) + Round(Val(unFmtStartDuration(1)) / 60, 2)

заменить это

startDuration = unFmtStartDuration(0)
If unFmtStartDuration(1) = "00" Then
    minTest = 0
Else
    minTest = unFmtStartDuration(1)
    If minTest = 30 Then
        startDuration = startDuration + 0.5
    End If
End If

Это займет любое время и преобразует его в десятичную форму, которую вы используете, вместо того, чтобы полагаться на совпадение 30. (Если вам это не нужно конкретно. Если да, то так и скажите, так как я думаю, что это все еще можно устроить с помощью трюков с округлением.)

Тем не менее, я думаю, что лучшим вариантом было бы использовать

startDuration = TimeValue(cboStartTime.Text) * 24

Таким образом, никакая другая математика или проверки не задействованы.

Кроме того, если cboStartTime.Text (и впоследствии startDuration) не превышает 24 часов, это

startDate = DateValue(DateAdd("h", startDuration, cboDate.Text & " 12:00AM"))

всегда будет возвращать дату, указанную в cboDate.Text, с подразумеваемым 12:00:00. Чтобы исправить это, вы захотите изменить на

startDate = DateAdd("h", startDuration, cboDate.Text & " 12:00AM")

Я думаю, что есть еще что исправить, но, надеюсь, это поможет вам двигаться в правильном направлении...

person Gaffi    schedule 29.03.2012
comment
Спасибо за быстрый ответ! Сначала я не рассматривал функцию TimeValue(), потому что я новичок в использовании VBA. Использовал его в кодах и это красиво. Тем не менее, спасибо за помощь! Теперь это работает хорошо... Кстати, почему-то функция DateAdd не могла добавить 0,5 в час по некоторым причинам... вместо этого прибегла к разбиению startTime и endTime на часы и минуты в качестве быстрого исправления. P.S. хотел бы, чтобы я мог проголосовать, еще раз слишком мало репутации ... :( - person Robert Sim; 29.03.2012
comment
Спасибо, @SiddharthRout. И не беспокойтесь, Роберт; остаться, и вы получите там в репутации. :-) - person Gaffi; 29.03.2012