excel VBA 不应该出现的溢出错误

excel VBA Overflow error when it shouldn't

Sub TestFunction()
     Dim var As Double
     var = 25 * 24 * 23 * 22 * 21 * 20
End Sub

我收到此 vba 操作的溢出错误。当我 运行 它在具有函数的单元格中时,我得到 127,512,000

这可能是什么错误?这应该远低于此数据类型的大小限制,对吧?

VBA 烦人地将第一项转换为整数,因为在您的情况下,它已经足够小了。

修改这一行,将其显式转换为双精度数:

var = CDbl(25) * 24 * 23 * 22 * 21 * 20

这样试试:

Option Explicit
Sub TestFunction()
     Dim var As Double
     var = 25
     var = var * 24 * 23 * 22 * 21 * 20
     Debug.Print var
End Sub

你的问题是,当 VBA 尝试对数字求和时,它有自己的逻辑,首先通过 Integer 然后将其解析为左边的数字。 如果第一个数字大于整数 (32767) 或显式转换为 DoubleLongSingle,则可以。这里你不会有任何问题,因为43333会自动转换成long就可以了:

Option Explicit
Sub TestFunction()    
     Dim var As Double
     var = 43333 * 6 * 6         
End Sub

在你的情况下,如果第一个数字是 25.1,而不是 25,它会自动转换为 double,因此以后你不会有问题,只要 Double*Integer = Double

Sub TestFunction()
     Dim var As Double
     var = 25.1 * 24 * 23 * 22 * 21 * 20
     Debug.Print var
End Sub

更深入一点,使用 VarType() function。将 k 声明为 Variant,并根据其值和数学运算查看 VBA 将其转换为什么:

Sub TestFunction()

    Dim k As Variant

    k = 32767
    Debug.Print VarType(k) = vbInteger

    k = k + 1
    Debug.Print VarType(k) = vbLong

    k = 15.5
    Debug.Print VarType(k) = vbDouble

    k = 15
    Debug.Print VarType(k) = vbInteger

    k = 1 ^ 1 'Just because of the power operation, it gets converted to double
    Debug.Print VarType(k) = vbDouble

End Sub

全部debug.printreturnTrue.