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

那么,我刚刚创build了一个简单的子,它给出了溢出的错误。 不过,我看不出代码有什么问题,而且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 

考虑:

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

很明显,VBA是为第一个expression式select一个默认types的Integer ,因为这个types足够大,可以保存文字在右侧。 50000对Integer来说太大了,所以它被解释为LongCLng明确地触发到Long的提升。

Integer最大值是32767 ,因为50000更多,它被转换为Longtypes。 因此,结果适合Long只好。 但是在第一种情况下,所有事情都是用Integertypes来完成的,并且会溢出。

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

这是因为VBA如何评估mathexpression式。 expression式的返回types将是expression式中第一个操作数的types或其最接近的数字types等效。 但是,最终的结果可能不适合这种返回types并抛出溢出错误。

当你做500 * 100,返回types是整数。 而当你做50000 * 100这个expression式的返回types是Long。

为了避免溢出错误,你可以做一个明确的转换,让它知道你的意图

CLng(500) * 100

我从以下链接得到答案: 从微软的链接

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