VBA中长数据类型的误解

VBA中长数据类型的误解,vba,Vba,在VBA中溢出错误的帮助中,有以下示例: Dim x As Long x = 2000 * 365 ' gives an error Dim x As Long x = CLng(2000) * 365 ' fine 我本以为,既然长数据类型应该能够容纳32位数字,那么第一个示例就可以了 我之所以问这个问题,是因为我有一些类似这样的代码: Dim Price as Long Price = CLng(AnnualCost * Months / 12) 当AnnualCost为5000且月数

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

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

Dim x As Long
x = CLng(2000) * 365 ' fine
我本以为,既然长数据类型应该能够容纳32位数字,那么第一个示例就可以了

我之所以问这个问题,是因为我有一些类似这样的代码:

Dim Price as Long
Price = CLng(AnnualCost * Months / 12)
当AnnualCost为5000且月数为12时,这会引发溢出错误


我缺少什么?

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

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

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


假设您将变量定义为整数。您可能会考虑使用long代替整数,部分原因是因为您将有更少的溢出问题,而且也因为long计算(略)比32位机器上的整数快。long确实占用了更多内存,但在大多数情况下这不是问题

在VBA中,文本默认为整数(如上所述)。如果您需要在它们上强制使用更大的数据类型,您可以像上面的示例中那样对它们进行重铸,或者只是附加一个类型声明字符。(列表如下:)Long的类型是“&”,因此您可以执行以下操作:

Price = CLng(AnnualCost * Months / 12&)
而12号将被重铸为一个长的。但是,通常最好避免使用文字并使用常量。在这种情况下,您可以在其声明中键入常量

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

我看你对这个问题有了答案。最好使用货币(ccur),而不是长,这既是为了一致性,也是因为即使现在不需要小数,将来也可能需要小数。2000是一个整数。使用2000&*365&您会没事的。