【问题标题】:Why does msgbox with these variables produce an error?为什么带有这些变量的 msgbox 会产生错误?
【发布时间】:2020-10-26 15:22:20
【问题描述】:

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

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

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

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

感谢任何cmets!

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."

【问题讨论】:

  • 刚刚运行了您的代码,我的计算机处理时间不到 0.02 秒。此外,没有溢出错误。
  • JulianG - 感谢您运行该程序。您是否尝试取消注释其中一个消息框 - 因为这是发生溢出问题的时候。
  • 是的,我做到了。再次没有溢出错误。
  • JulianG - 谢谢你的评论。这很有趣,因为当我取消注释消息框时,我在收到错误时没有任何问题!我唯一能想到的是我可能没有使用好的数据类型。我发现自己使用的是 Long 类型。你认为这是我应该使用的吗?例如,双倍会更好吗?
  • JulianG - 我尝试再次更改数据类型(如前所述),但没有区别。所以由于某种原因,当我激活消息框时程序总是崩溃!

标签: vba time powerpoint overflow datediff


【解决方案1】:

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

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

编辑:下面的 cmets 的后续行动。

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

  • 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 应用程序为您提供了许多可用于格式化日期/时间的功能。例如在 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

唷,希望这会有所帮助。我相信如果你用谷歌搜索这个问题,你会发现更好的解释和大量的视频。

【讨论】:

  • 超级对称 - 您好,感谢您抽出宝贵时间发布您的帖子。是的 - 您的代码运行良好。您的代码是否存在无法直接在 TimeDiffString 中直接计算出天数的情况? (你先把天数分开。)我认为我使用 VBA 的部分困难在于不熟悉 VBA 日期格式。
  • @AlecArmstrong 朋友,你问了一个简单的问题,但不幸的是,答案并不是那么简单。我试了一下并更新了我的答案。我祈祷并希望我不会让你更加困惑。
  • 如果答案解决了您的问题,请设置接受的答案,谢谢。
  • 超级对称 - 非常感谢您花时间写下这个答案。 (我不是 100% 确定您是否避免使用等效的日功能)。我认为我的问题已得到解答,尽管尚不清楚为什么我遇到了溢出错误而其他人却没有!
  • 只求帮忙!
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2020-10-11
  • 2016-02-08
  • 2012-01-27
相关资源
最近更新 更多