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

Yit*_*eng 65 excel vba excel-vba

好吧,我刚刚创建了一个简单的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
Run Code Online (Sandbox Code Playgroud)

Joh*_*man 73

考虑:

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

显然,VBA正在Integer为第一个表达式选择一个默认类型,因为该类型足以容纳右侧的文字.50000太大了,Integer所以它把它解释为Long.CLng明确触发促销活动Long.

  • 或者[简写](http://www.bettersolutions.com/vba/VUD113/NO333718332.htm)`单元格(1,1)= 500&*100&` (2认同)

ja7*_*a72 20

a的最大值Integer32767,因为50000它更多地被转换为Long类型.因此结果恰好适合Long.但在第一种情况下,一切都是用Integer类型完成的,它会溢出.

(Integer=500) * (Integer=100) = (Integer=50000)  'Overflow
(Long=50000) * (Integer=100) = (Long=5000000)    'Ok
Run Code Online (Sandbox Code Playgroud)


Pra*_*mar 9

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

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

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

CLng(500) * 100