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错误。为什么呢?
答案 0 :(得分:3)
错误发生在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
答案 1 :(得分:3)
因为VBA中的Integer
类型是16位有符号的,36200溢出了它的最大值32767.您可以通过将&
附加到其中一个操作数来使其成为{{1}来避免这种情况。文字,例如Long
。