为何调整VBA操作数顺序可避免‘运行时错误6:溢出’?
为什么调整VBA运算顺序能解决溢出错误?
原代码溢出的原因
原表达式 1200 * 60 * Time 中,1200 和 60 都是VBA默认的Integer类型(16位整数,取值范围是 -32768 ~ 32767)。运算时会先计算 1200 * 60,结果是 72000,这个数值远超Integer类型的最大值 32767,直接触发“运行时错误6:溢出”,根本没机会执行后续和Time的相乘操作。
调整顺序后解决问题的原因
调整后的表达式 Time * 1200 * 60 改变了运算的执行顺序:
- 第一步计算
Time * 1200:由于函数参数Time未声明类型,默认是Variant类型。当传入的24(Integer类型)和1200(Integer类型)相乘时,VBA会自动将操作数提升到更宽的数值类型(比如32位的Long类型)来容纳结果。24 * 1200 = 28800,这个数值在Long类型的范围内(-2147483648 ~ 2147483647),不会溢出。 - 第二步用得到的
28800(Long类型)乘以60,结果是1728000,依然在Long类型的范围内,最后赋值给Double类型的函数返回值,整个过程不会触发溢出。
额外提示
如果给函数参数显式声明类型,比如写成:
Function target_time(ByVal Time As Double) As Double target_time = 1200 * 60 * Time End Function
不管运算顺序如何都不会溢出——因为Double类型的数值范围极大,完全能容纳该计算的结果。
内容的提问来源于stack exchange,提问作者Ru_Madz
相关产品推荐
相关产品推荐

