在Visual Basic / Excel中使用日期

时间:2012-05-30 22:21:42

标签: excel vba date time

使用Visual Basic / Excel非常新。我正在尝试编写一个快速脚本,在一列中输入当前时间,并允许用户输入将在新时间内传递多少天/小时/分钟,并将其输出到另一列中。

我确信这不是最好的方法,但我到目前为止的内容如下。我已经放弃了摆弄日期,而且只是在与时间合作:

Sub TimeModule()
Dim DaysLeft, HoursLeft, MinutesLeft As Double
DaysLeft = Val(InputBox("Days left"))
HoursLeft = Val(InputBox("Hours left"))
MinutesLeft = Val(InputBox("Minutes left"))

Dim CurrentTime As Date
CurrentTime = TimeValue(Now())

ActiveCell.Value = CurrentTime
ActiveCell.Offset(0, 1) = CurrentTime + Time(HoursLeft, MinutesLeft, 0)

End Sub

我当然会收到错误。如果有人能够更好地解决这个问题,以及我滥用的功能,我会非常感激!

编辑:我当然最终也希望脚本能够处理好几天。

3 个答案:

答案 0 :(得分:3)

如果我理解正确的话,我认为只使用Excel中的单元格函数就可以了。

例如,这就是你所看到的......

Time Now:           Days:   Hours:  Minutes:    New Time:
30/05/2012 23:34    15      6       23          15/06/2012 05:57

...这就是每个单元格中的内容(假设左上角的单元格是A1)......

Time Now:   Days:   Hours:  Minutes:   New Time:
=NOW()      15      6       23         =A2+B2+TIME(C2,D2,0)

描述每个功能:

  • NOW()返回格式化为日期和时间的当前日期和时间。
  • DATE(year,month,day)返回表示MS Excel日期时间代码中日期的数字。
  • TIME(hours,minutes,seconds)将以小数,分钟和秒为单位的数字转换为Excel序列号,格式为时间格式。

在最后一个单元格中解析等式:

  • A2是包含当前日期/时间的单元格(截至上一次工作表计算)。
  • B2是用户输入的天数值。
  • TIME(C2,D2,0)是TIME()函数,分别从单元格C2D2获取用户输入的小时和分钟值。

这有点像你想要的功能......?

答案 1 :(得分:0)

如果您想使用VBA,则代码的唯一问题是“时间”功能。 您可以改为使用CDate:

Sub TimeModule()
  Dim DaysLeft, HoursLeft, MinutesLeft As Double
  DaysLeft = Val(InputBox("Days left"))
  HoursLeft = Val(InputBox("Hours left"))
  MinutesLeft = Val(InputBox("Minutes left"))

  Dim CurrentTime As Date
  CurrentTime = TimeValue(Now())

  ActiveCell.Value = Now()
  ActiveCell.Offset(0, 1) = ActiveCell.Value + DaysLeft + CDate(HoursLeft & ":" & MinutesLeft)
  'ActiveCell.Offset(0, 1) = CurrentTime + Time(HoursLeft, MinutesLeft, 0)

End Sub

答案 2 :(得分:0)

当你以这种方式'昏暗'时,你必须记录每个变量的数据类型。你的方式MinutesLeft是Double,一切都是(默认情况下)Variant。

您正在寻找的时间功能是TimeSerial。

日期存储为自特定日期起的天数。要将日期添加到日期,您只需将数字添加到一起。

Sub TimeModule()

    Dim lDaysLeft As Long
    Dim lHoursLeft As Long
    Dim lMinutesLeft As Double
    Dim dtCurrent As Date

    lDaysLeft = Val(InputBox("Days left"))
    lHoursLeft = Val(InputBox("Hours left"))
    lMinutesLeft = Val(InputBox("Minutes left"))

    dtCurrent = Now()

    ActiveCell.Value = dtCurrent
    ActiveCell.Offset(0, 1).Value = dtCurrent + lDaysLeft + TimeSerial(lHoursLeft, lMinutesLeft, 0)

End Sub