2

我有一个用户表单,要求用户通过两个单独的组合框 cboStartDate、cboStartTime 输入特定的日期和时间。用户还必须在文本字段 txtDuration 中输入持续时间。

保存后,开始日期和时间将存储在格式化单元格 [DD/MM/YYYY HH:MM AM/PM] 中。结束日期和时间将从持续时间字段计算并存储在具有相同格式的另一个单元格中。像这样的东西:

+------------------------+------------------------+
| 开始时间 | 结束时间 |
+------------------------+------------------------+
| 2012 年 2 月 4 日上午 11:30:00 | 2012 年 2 月 4 日下午 2:00:00 |
+------------------------+------------------------+

但是,运行用户窗体后,开始时间不存储,结束时间不计算。像这样的东西:

+------------------------+------------------------+
| 开始时间 | 结束时间 |
+------------------------+------------------------+
| 2012 年 2 月 4 日上午 12:00:00 | 2012 年 2 月 4 日上午 12:00:00 |
+------------------------+------------------------+

以下是我的 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想在这里发截图,但是我这里的名声太低了。对不起。

4

1 回答 1

2

看起来您只是在添加 time when 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")

我认为还有一些问题需要解决,但希望这能让你朝着正确的方向前进......

于 2012-03-29T14:53:19.850 回答