为什么单元格(1,1)= 500 * 100会导致溢出但50000 * 100不会导致溢出?

时间:2015-08-04 18:15:12

标签: vba excel-vba excel

好吧,我刚刚创建了一个简单的sub,它给出了溢出的错误。但是,我没有看到代码有什么问题,因为50000 * 100比500 * 100大得多,所以真的很奇怪。

sub add()
    'This will cause an overflow error
    cells(1,1) = 500 * 100
    'But this won't
    cells(2,2) = 50000 * 100
end sub

4 个答案:

答案 0 :(得分:73)

考虑:

Sub add()
    'This works:
    Cells(1, 1) = CLng(500) * 100
    'as does this:
    Cells(2, 2) = 50000 * 100
End Sub

显然,VBA正在为第一个表达式选择默认类型Integer,因为该类型足够大以容纳右侧的文字。 50000对于Integer而言太大,因此它将其解释为LongCLng明确触发促销Long

答案 1 :(得分:20)

Integer的最大值为32767,因为50000更多,它会被投射为Long类型。因此,结果恰好适合Long。但在第一种情况下,所有内容都以Integer类型完成,并且溢出。

(Integer=500) * (Integer=100) = (Integer=50000)  'Overflow
(Long=50000) * (Integer=100) = (Long=5000000)    'Ok

答案 2 :(得分:9)

这是因为VBA如何评估数学表达式。表达式的返回类型将是表达式中第一个操作数的类型或其最接近的数字类型。 但是,最终结果可能不适合该返回类型并抛出溢出错误。

当你做500 * 100时,返回类型是整数。 当你执行50000 * 100时,此表达式的返回类型为Long。

为了避免溢出错误,您可以进行显式转换以让它知道您的意图

CLng(500) * 100

答案 3 :(得分:2)

我从以下链接得到了答案:Link from microsoft

似乎即使我没有为数字指定类型,excel也会根据其长度自动为其分配一个类型。因此,500被定义为整数,结果50,000对于整数类型来说太大。这就是原因。