Excel 2016 VBA宏溢出报错咨询:Long变量为何仍触发错误?
为啥你的VBA代码会触发溢出错误?
这个问题其实是VBA的类型运算规则在搞鬼,我给你掰扯明白:
先看你的代码:
Sub alpha() Dim a As Integer, b As Long a = 750 b = 50 * a Stop End Sub
你可能以为50 * a的结果会直接丢给Long类型的b,但VBA的逻辑可不是这样的——它会先判断参与运算的两个操作数的类型:
- 50是整数字面量,VBA默认会把它当成Integer类型(因为它落在Integer的取值范围:-32768到32767里)
a也是Integer类型
那VBA就会用Integer类型来计算这个乘法,结果37500早就超过了Integer的上限32767,所以运算还没结束,直接就触发溢出错误了,根本轮不到把结果赋值给Long类型的b。
那为啥把a改成Long就正常了?
当a是Long类型时,VBA会自动做类型提升:把另一个操作数50(Integer)转换成Long类型,然后用Long类型来计算乘法。37500远小于Long的上限(2^31-1),自然不会溢出,结果能顺利赋值给b。
给你几个不用改a类型的解决办法:
- 把其中一个操作数显式转成Long:
b = CLng(50) * a - 给字面量加上Long类型后缀
&:b = 50& * a(这个后缀会告诉VBA把50当成Long来处理)
这样运算时就会用Long类型计算,完美避开溢出问题~
内容的提问来源于stack exchange,提问作者user3516422
相关产品推荐
相关产品推荐

