对VBA中Long数据类型的误解

时间:2008-11-25 03:43:54

标签: vba

从VBA中的溢出错误的帮助中,有以下示例:

Dim x As Long
x = 2000 * 365 ' gives an error

Dim x As Long
x = CLng(2000) * 365 ' fine

我原以为,因为Long数据类型应该能够容纳32位数字,所以第一个例子可以正常工作。

我问这个是因为我有这样的代码:

Dim Price as Long
Price = CLng(AnnualCost * Months / 12)

并且当YearCost为5000且Months为12时会抛出溢出错误。

我错过了什么?

3 个答案:

答案 0 :(得分:12)

2000和365是整数值。在VBA中,整数是16位有符号类型,当您对2个整数执行算术时,算术以16位执行。由于这两个数相乘的结果超过了可用16位表示的值,因此会出现异常。第二个示例有效,因为第一个数字首先转换为32位类型,然后使用32位数字执行算术运算。在您的示例中,算法使用16位整数执行,然后将结果转换为long,但此时为时已晚,溢出已经发生。解决方案是将乘法中的一个操作数转换为long first:

Dim Price as Long
Price = CLng(AnnualCost) * Months / 12

答案 1 :(得分:2)

问题是在类型转换之前,括号内的乘法发生了。这就是为什么你需要在将它们相乘之前将至少一个变量转换为Long。

据推测,您将变量定义为Integer。您可能会考虑使用Long而不是Integer,部分原因是因为您将减少溢出问题,但也因为Longs在32位计算机上计算(一点点)比整数更快。 Longs确实需要更多内存,但在大多数情况下这不是问题。

答案 2 :(得分:1)

在VBA中,默认情况下文字是整数(如上所述)。如果您需要在它们上强制使用更大的数据类型,您可以像上面的示例中那样重新创建它们,或者只是附加一个类型声明字符。 (列表在这里:http://support.microsoft.com/kb/191713)Long的类型是“&”所以你可以这样做:

Price = CLng(AnnualCost * Months / 12&)

12将重铸为一个长期。但是,避免文字和使用常量通常是一种好习惯。在这种情况下,您可以在声明中键入常量。

Const lngMonths12_c as Long = 12
Price = CLng(AnnualCost * Months / lngMonths12_c)