Excel VBA Сохранение определенного времени в ячейку из пользовательской формы - PullRequest
2 голосов
/ 29 марта 2012

У меня есть пользовательская форма, которая требует, чтобы пользователь вводил определенную дату и время с помощью двух отдельных комбинированных списков, 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

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

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

1 Ответ

2 голосов
/ 29 марта 2012

Похоже, что вы добавляете только время, когда 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 AM .Чтобы исправить это, вам нужно изменить на

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

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

...