Sub TestFunction()
Dim var As Double
var = 25 * 24 * 23 * 22 * 21 * 20
End Sub
我收到此vba操作的溢出错误。当我在一个单元格中运行它我得到127,512,000excel VBA溢出错误,当它不应该
什么可能是这个错误?这应该远远低于这种数据类型的大小限制吗?
Sub TestFunction()
Dim var As Double
var = 25 * 24 * 23 * 22 * 21 * 20
End Sub
我收到此vba操作的溢出错误。当我在一个单元格中运行它我得到127,512,000excel VBA溢出错误,当它不应该
什么可能是这个错误?这应该远远低于这种数据类型的大小限制吗?
VBA恼人地将第一项转换为整数,因为在你的情况下,它足够小。
修改这条线,它明确地转换为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)或明确转换为Double
,Long
,Single
,则表示没问题。在这里,你不会有任何问题,因为43333
被自动转换为long
,它是确定:
Option Explicit
Sub TestFunction()
Dim var As Double
var = 43333 * 6 * 6
End Sub
在你的情况下,如果第一个数字是25.1
,而不是25
,它就会自动转换为加倍,从而以后你会不会有问题,就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将其转换为,根据其价值和算术运算:
所有debug.print
回报True
。
不是Excel。 VBA。这种行为与主机应用程序无关。 –
@ Mat'sMug - true。 – Vityata
另一种方法是通过添加'&'字符来定义第一个数字,例如'25&'。这也可以用于常量定义(不允许调用'CDbl'的函数)。 – FunThomas
@FunThomas如果你打算使用类型提示,并且你需要一个double,你可以使用'Const myDouble = 25#'或'Const myDouble = 25.0'(它会通过VBE漂亮的打印机自动纠正'Const myDouble = 25#') – ThunderFrame