VBA 溢出行为
Posted
技术标签:
【中文标题】VBA 溢出行为【英文标题】:VBA overflow behaviour 【发布时间】:2018-04-26 08:43:32 【问题描述】:我有一些我不理解的 vba 行为。 我在 excel 2016 的宏中运行 vba。
Sub alpha()
Dim a As Integer, b As Long
a = 750
b = 50 * a
Stop
End Sub
运行此子程序会导致溢出错误。为什么?
变量a
是一个整数,因此不能容纳数字750*50
,因为它太高了。但是变量 b
被维度化为一个 long - 所以它应该能够保存那个数字。
奇怪的是,如果我将变量 a
的类型更改为 Long
,那么代码就会运行。
【问题讨论】:
语言还不知道结果会以 b 结尾,它只有“50”,所以它选择一个整数开头。 将Dim a As Integer
更改为Dim a As Long
或b = 50 * cLng(a)
:VBA 不会进行从 Integer 到 Long 的隐式转换,直到 完成计算。
并了解为什么您可以在 VBA 中使用 always use Long
instead of Integer
,因为使用 Integer
根本没有任何好处。
Overflow when multiplying Integers and assigning to Long的可能重复
【参考方案1】:
Integer
在 VBA 中的最大值为 32,767。
你用50 * a
溢出了。将其分配给 Long
并不相关,因为从概念上讲,乘法发生在分配之前,到那时,损害已经造成。
使用Long
代替a
或写
b = 50& * a
强制类型提升。两者都可以达到 2,147,483,647
【讨论】:
以上是关于VBA 溢出行为的主要内容,如果未能解决你的问题,请参考以下文章