繁体   English   中英

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会烦人地将第一项转换为Integer,因为在您的情况下,它足够小。

修改此行,将其显式转换为double:

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()函数进一步深入。 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.print返回True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM