Excel VBA将时间特定值从userform存储到单元格中

我有一个用户窗体,需要用户input一个特定的date和时间通过两个单独的combobox,cboStartDate,cboStartTime。 用户还必须在文本字段txtDuration中input持续时间。

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

 + ----------------------- + ------------ +
 |  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想在这里张贴截图,但我的名声太低了。 抱歉。

看起来你只是增加了minTest = 30的时间,但是这个值可能会有很大的差别。 此外,在一个实例中,您正在比较一个string,另一个数字引用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 

这将采取任何时间,并将其转换为您使用的十进制forms,而不是依靠30场比赛。 (除非你特别需要,如果是这样的话,我认为这仍然可以用四舍五入的方法来安排)。

不过,我认为更好的select是使用

 startDuration = TimeValue(cboStartTime.Text) * 24 

所以没有其他math或检查涉及。

此外,除非cboStartTime.Text (和随后的startDuration )大于24小时,这

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

将始终返回cboDate.Text指定的date,暗示12:00:00 AM 。 要纠正这个问题,你需要改变

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

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