Sub TestFunction()
Dim var As Double
var = 25 * 24 * 23 * 22 * 21 * 20
End Sub
我收到此vba操作的溢出错误。当我在具有功能的单元格中运行它时,我得到127,512,000
这可能是一个错误?这应该远低于这种数据类型的大小限制吗?
答案 0 :(得分:5)
VBA恼人地将第一个词转换为Integer,因为在你的情况下,它足够小。
修改此行,将其明确转换为double:
var = CDbl(25) * 24 * 23 * 22 * 21 * 20
答案 1 :(得分:2)
试试这样:
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)或明确转换为Double
,Long
,Single
,那么就可以了。在这里你不会有任何问题,因为43333
会自动转换为long
而且没问题:
Option Explicit
Sub TestFunction()
Dim var As Double
var = 43333 * 6 * 6
End Sub
在您的情况下,如果第一个数字是25.1
,而不是25
,则它会自动转换为double,因此稍后您就不会遇到问题,就Double*Integer = Double
而言/ p>
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.print
返回True
。