为什么单元格(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
来说太大了,所以它被解释为Long
。 CLng
明确地触发到Long
的提升。
Integer
最大值是32767
,因为50000
更多,它被转换为Long
types。 因此,结果适合Long
只好。 但是在第一种情况下,所有事情都是用Integer
types来完成的,并且会溢出。
(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对于整型来说太大了。 这就是为什么。