这是一个非常奇怪的 VBA 怪癖。我很惊讶我从来没有遇到过这个。
Dim x As Long
x = 24 * 60 * 60 ' Overflow
x = 32767 + 1 ' Overflow.
x = 32768 + 1 ' Works fine!
所以看起来像*
and +
在前两个示例中,运算符返回一个 Integer。果然,在帮助文件中*
运算符(类似于+
操作员):
result = number1 * number2
[...]
数据类型为result通常与最精确的表达式相同。
默认情况下,您的文字 24、60 和 60 都是 Integer 类型,因此您的*
(or +
) 运算符返回一个 Integer,该整数会溢出,因为结果大于 32,767。
但是,上面第三个示例中的文字 32,768 默认为 Long 类型(因为它太大而无法成为 Integer),因此+
返回一个长整型;没有溢出。
帮助文件还这么说:
如果 [...] 的数据类型result是一个整数variant超出其合法范围[...]然后result[...] 转换为 Long 变体。
Emphasis矿。现在,这条小规则听起来像是常识,任何人都会合理地假设它适用于您的情况。但你的数字是 Integer 类型,而不是 Variant/Integer,所以 VBA 不应用此规则!对我来说完全没有意义,但事实就是如此,文档也是这么说的。
解决方案:提出你的论点之一*
运算符的类型比 Integer 更精确(例如 Long),问题就会消失。
x = CLng(24) * 60 * 60 ' Result is Long, works fine.
事实上,这可能就是为什么我从未遇到过这个怪癖的原因,我习惯将所有整数变量声明为 Long,除非特别担心使用 Long 而不是 Integers 会导致内存使用问题或执行时间(几乎从来没有这种情况)。当然,当您操作小于 32,768 的文字时,这不会有帮助,因为它们默认为整数类型。
你问在一条评论 https://stackoverflow.com/users/2523246/excel-cowboy-yeeha什么是变体/整数。变体基本上是任何其他数据类型的容器类型。在您使其包含整数的特定情况下:
Dim a As Variant ' a is now Empty
a = CInt(32767) ' a is now Variant/Integer
x = a + 1 ' works fine
但如上所述,普通的旧 Integer 会触发溢出错误:
Dim b As Integer
b = 32767
x = b + 1 ' overflow