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 溢出行为的主要内容,如果未能解决你的问题,请参考以下文章

VBA 变体溢出

在 VBA 中睡觉(整数溢出!!)

访问 VBA。检测记录集条目是不是会溢出

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

Access VBA中的DMin函数溢出错误

使用 WshShell 从 VBA 运行 .NET 应用程序时出现溢出错误