VBA中的溢出错误涉及两个整数和一个Long Integer

时间:2017-10-30 21:03:29

标签: vba access-vba ms-access-2013

我不在VBA中编码,但我需要调试其中编写的代码。当我运行代码时,我收到一个溢出错误,我在网上查看。我在调试器中使用断点来查找给出错误的代码行。

这是一行:

lngInt = nIntA * nIntB

调试器说nIntA(整数)= 4,851,nIntB(另一个整数)= 10.如果我正确读取这一行,lngInt是一个长整数:

dim lngInt As Long

nIntA和nIntB初始化为:

Public nIntA As Integer 
Public nIntB As Integer

如果有帮助,两者都是从Access表单设置的。

关于这一点似乎不应该给我一个问题,所以我认为这是VBA中的一个怪癖。可能导致错误的原因是什么?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

Integer类型已过时。您可以声明并使用所需的16位整数,并且VBA运行时将强制执行其限制,但在内部它(无声地)转换为32位整数,所以为什么不使用Long(32 -bit)首先是整数?

那就是说,这与“VBA怪癖”无关,而且与基础知识有关:

foo = [expression]

在运行时可以执行foo的分配之前,需要评估[expression]。 “怪癖”是VBA不关心foo的类型,直到 [expression]被评估之后,因为它必须(隐式)将其转换为无论如何这种类型:

Dim foo As Double
foo = 2 + 2

2 + 2应该自己评估Double吗?它没有,也不需要。 2 + 2评估为4,由于两个操作数均为Integer,因此结果为Integer,因此作业将为:

Dim foo As Double
foo = CDbl((2 + 2))

现在,如果你有两个Integer值相乘,并且总数超出了类型,那么根据规范你会得到溢出错误。

Dim foo As Long
foo = 32000 * 2

因为那仍然是:

Dim foo As Long
foo = CLng((32000 * 2))

注意内部括号:(32000 * 2)之前被评估为Integer ,结果可以转换为Long并且转换的结果分配给foo

如果其中一个操作数是Long,则结果为Long - 因为两个操作数均为Integer,结果为Integer

如果您想要时髦的表达方式和令人难以置信的隐式转换,请尝试使用Javascript。 VBA在这里根本就不是“古怪”。