我不在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中的一个怪癖。可能导致错误的原因是什么?
提前谢谢!
答案 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在这里根本就不是“古怪”。