Excel 2013。VBA: 此代码:
Sub test()
On Error GoTo Err:
Dim p As Double
p = (362 * 100) / 2005
Exit Sub
Err:
If Err.Description <> "" And Err.Source <> "" Then
MsgBox Err.Description, vbCritical, Err.Source
End If
End Sub
抛出溢出编号 6 错误。为什么?
错误出现在
362 * 100
。被认为是Integer
并且取决于32767
。
尝试这样:
Public Sub TestMe()
Dim pct As Double
pct = (CDbl(362) * 100) / 2005
End Sub
问题是,如果以下 4 个数学表达式 (
+-/*
) 中的任何一个的值在 2^15-1
或 32767
下,VBA 会将它们视为 Integer
,并且尝试将结果解析为 Integer
,如下所示出色地。 (Integer
值实际上是从-32768
到32767
)
因此,
32767+1
给出了推翻错误。如果你尝试使用 32768+1
那就没问题了,因为 32768
会被解析为 Long
。
对于幂运算符,
^
,VBA 解析为 Double
,这完全没问题 - 2 ^ 10 + 32000
因为 VBA 中的
Integer
类型是 16 位有符号的,并且 36200 会溢出其最大值 32767。您可以通过将 &
附加到其中一个操作数以使其成为 Long
文字来避免这种情况,例如 (362& * 100) / 2005
.
我今天运行的这个“溢出”问题的另一个可能的解决方法是考虑将操作数 DIM 为“double常量”,如下面的代码...这使得“double const”获得“双结果” “操作后...(我的游戏是将 56 个颜色索引表中的 RGB 颜色转换为数字(但双倍)...)
Const BLUE_OFFSET As Double = 65536
Const GREEN_OFFSET As Double = 256
Const RED_OFFSET As Double = 1
Public Const colID01 As Double = (0 * RED_OFFSET) + (0 * GREEN_OFFSET) + (0 * BLUE_OFFSET) 'RGB(0, 0, 0)
Public Const colID02 As Double = (255 * RED_OFFSET) + (255 * GREEN_OFFSET) + (255 * BLUE_OFFSET) 'RGB(255, 255, 255)