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

Overflow error in VBA involving two integers and a Long Integer

我不会在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 中的一个怪癖。可能导致错误的原因是什么?

提前致谢!

Integer 类型已过时。您可以随心所欲地声明和使用 16 位整数,VBA 运行时将强制执行其限制,但无论如何在内部它(静默地)转换为 32 位整数,所以为什么不直接使用 Long(32位)整数排在首位?

也就是说,这与 "VBA quirk" 无关,一切都与基础知识有关:

foo = [expression]

在运行时可以执行 foo 的赋值之前,需要评估 [expression]。 "quirk" 是 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 在这里根本不是 "quirky"。