为什么带有这些变量的 msgbox 会产生错误?

Why does msgbox with these variables produce an error?

抱歉,如果这是一个基本问题,但我正在自学 VBA PowerPoint,如果有人能解释为什么我会收到溢出错误,我将不胜感激。

我一直在尝试让我的程序用户使用 DateDiff 和 Now 来设置开始和结束计时器来执行 activity 花费的时间。我的方法是获取秒数,然后计算出多少天、分钟、小时和秒将构成这个数字。

下面的代码有效,但是,每当我使用 Messagebox (Msgbox) 函数时,我都会收到溢出错误。例如,如果您查看下面的代码,一切正常,直到您取消对我注释的 MsgBox 之一的注释,然后程序崩溃并出现 运行 时间错误“6”:溢出。我注意到实际崩溃发生在未注释消息框下方的后续计算行之一。我注意到第一个未注释的 MsgBox 不会使计算机崩溃。

如果有人能解释为什么计算机崩溃,我将不胜感激,其次是否需要对我的代码进行任何更改才能使其可靠使用?

感谢您的宝贵意见!

Sub NewTimer()
Dim TimeStart As Date
Dim TimeEnd As Date
Dim Days As Long
Dim Hours As Long
Dim Hours2 As Long
Dim Hours3 As Long
Dim Minutes As Long
Dim Minutes2 As Long
Dim Seconds As Long
Dim TimePassed As String
Dim Seconds2 As Long

Seconds = Int(DateDiff("s", Now, Now + 1))
MsgBox "The total number of seconds that make up this number is " & Seconds

Days = Int(DateDiff("d", Now, Now + 1))
MsgBox "The total number of days in this number is " & Days

Hours2 = Seconds - (Days * 24 * 60 * 60) 'This gets the number of seconds remaining
Hours3 = Hours2 / (60 * 60) 'This works out the number of hours
Hours = Int(Hours3)
'MsgBox Hours

Minutes = Seconds - (Days * 24 * 60 * 60) - (Hours * 60 * 60) ' Hours2 - (Hours * 60 * 60)
'MsgBox Minutes
Minutes2 = Int(Minutes / 60)
'MsgBox Minutes2
'Minutes2 = Minutes / 60

Seconds = Seconds - (Days * 24 * 60 * 60) - (Hours * 60 * 60) - (Minutes2 * 60)

MsgBox "The time taken is " & Days & " days, " & Hours & " hours, " & Minutes2 & "  minutes and " & Seconds & " seconds."

与其他评论一样,当我 运行 你的代码时我完全没有问题。但是,您可以使用此代码获得相同的结果。看看是否有帮助:

Sub NewTimer()
  Dim TimeStart As Double
  Dim TimeEnd As Double
  Dim TimeDiff As Double
  Dim Days As Long
  Dim TimeDiffString As String
  
  TimeStart = Now
  TimeEnd = TimeStart + 4 + TimeValue("04:13:25")
  
  TimeDiff = TimeEnd - TimeStart
  Days = Int(TimeDiff)
  
  TimeDiffString = Days & " days, " & Hour(TimeDiff) & " hours, " & Minute(TimeDiff) & " minutes and " & Second(TimeDiff) & " seconds."
  MsgBox TimeDiffString
End Sub

编辑:跟进下面的评论。

在办公应用程序中,您可以安全地将日期和时间视为十进制(浮点)数值,其中整数部分是天数,小数部分是一天的分数。示例将清楚地说明这一点:

  • 1.5 是一天半 -> 1 天 12 小时 -> 36 小时等等
  • 1 天 2 小时等于 1 + 2/24
  • 1 小时大约是 1 / 24 0.041667
  • 1 分钟是 1 / (24 * 60),大约。 0.000694
  • 1 秒是 1 / (24 * 60 * 60),大约。 0.000012 等等。

Office 应用程序为您提供了许多可用于格式化 dates/times 的功能。例如 VBA:

  • Hour() 为您提供时钟上的小时数。 Hour(1.27) = Hour(3.27) = Hour(295.27) = 6
  • Minute() 为您提供时钟上的分钟数。 Minute(1.27) = Minute(3.27) = Minute(295.21) = 28
  • Second() 给你时钟上的秒数。 Second(1.27) = Second(3.27) = Second(295.21) = 48

这等于说(6小时+28分钟+48秒)加起来是1天的0.27。

  • Day() 为您提供每月的日历日,其中第 1 天是根据上下文和您的设置定义的。例如在 Excel VBA 中,第 1 天通常是 1899 年 12 月 31 日。因此,Day(295.21) = 21 因为 295.21 是 1899 年 12 月 31 日之后的 294 天,对应于 1900 年 10 月 21 日。
  • Month() 为您提供一年中的日历月。因此,Month(295.27) = 10
  • Year() 为您提供日历年。因此,Year(295.27 = 1900

这就解释了为什么我把天分开了(代码中DateDiff的整数部分)。例如,如果 DateDiff = 295.27,那么 Day(DateDiff) 会给你 21 天,而不是你期望的 295 天。

家庭作业:在上面的代码中算出 TimeValue("04:13:25") 应该得到什么分数。用这段代码检查你的答案 - 没有作弊 ;):

Sub CheckMyAnswer()
  MsgBox Format(TimeValue("04:13:25"), "0.000000")
End Sub

呸,希望这有帮助。我相信如果你 google 这个问题你会找到更好的解释和大量的视频。