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"。
我不会在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"。