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) 或显式转换为 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
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
returnTrue
.
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) 或显式转换为 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
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
returnTrue
.