【问题标题】:Yet another Excel VBA CDate overflow error又一个 Excel VBA CDate 溢出错误
【发布时间】:2021-01-04 14:00:59
【问题描述】:

我有两个简单的 VBA 潜艇。一个工作正常(WorksOK)。一个会产生溢出错误 (DoesntWork)。它们之间的区别在于WorksOK 调用了一个MsgBox。两者都通过将 CDate("2021 年 1 月 1 日") 加一来计算 2021 年 1 月 2 日的日期。有人可以解释一下为什么 WorksOK 可以正常工作而 DontWork 不能正常工作吗?

仅在中观察到这种行为:

  • Excel Mac Catalina 16.44 VBA 7.1
  • Word Mac Catalina 16.44 VBA 7.1。

Windows 中的 Excel VBA 似乎还可以。

Sub WorksOK()
    Dim j As Integer, y As Date
    j = 1
    y = CDate("January 1, 2021") + j
    Debug.Print y
    MsgBox y
    Debug.Print CDate("January 1, 2021") + j
End Sub

Sub DoesntWork()
    Dim j As Integer, y As Date
    j = 1
    y = CDate("January 1, 2021") + j
    Debug.Print y
    Debug.Print CDate("January 1, 2021") + j  'Overflow
End Sub

【问题讨论】:

  • Dim j As Long 会发生什么?
  • 2021 年 1 月 1 日的日期转换为数字 44,197。 Integer 最大值为 32,767,因此您会收到溢出错误。
  • 无论 j 是 Long 还是 Integer,行为都是一样的
  • Darrell H:好的,假设日期的大小是问题所在。那为什么 VBA 在 Windows 版本中不报错呢?为什么 MsgBox 很重要?
  • 是的,Windows 上的 Excel 似乎以正确的方式转换。代码在我的 WIndows 计算机上运行。

标签: excel vba macos date overflow


【解决方案1】:

不知道,但总是将日期处理为日期,而不是字符串,不是数字,没有例外。

运行:

Sub DoesntWork()
    Dim j As Integer, y As Date
    j = 1
    y = DateAdd("d", j, #1/1/2021#)
    Debug.Print y
    Debug.Print DateAdd("d", j, #1/1/2021#)
End Sub

【讨论】:

  • 嗯。你在Mac上检查过吗?当我这样做时,我得到了相同的行为(最后一条语句为 ovflo)
  • 不,我没有 Mac,但正在发生其他事情;在 9999-12-31 之前的日期中添加一天是不可能导致溢出的。你甚至可以Dim j As Byte,它仍然可以工作。
  • 是的,这是一个谜题。如果您想进行实验,请告诉我,我会在 Mac 上试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多