Excel VBA通​​过简单的除法抛出溢出错误

时间:2018-02-02 13:38:16

标签: vba excel-vba excel

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错误。为什么呢?

2 个答案:

答案 0 :(得分:3)

错误发生在362 * 100。它被视为Integer,最多为32767

试试这样:

Public Sub TestMe()    
    Dim pct As Double
    pct = (CDbl(362) * 100) / 2005        
End Sub

问题在于,如果您有以下4个数学表达式(+-/*)中的任何一个,其值为2^15-132767,则VBA会将它们视为Integer,结果如果尝试也被解析为Integer。 (Integer值实际上是从-3276832767

因此,32767+1给出了推翻错误。如果您尝试使用32768+1,就可以了,因为32768将被解析为Long

对于电源操作员^,VBA会解析为Double,这很好 - 2 ^ 10 + 32000

答案 1 :(得分:3)

因为VBA中的Integer类型是16位有符号的,36200溢出了它的最大值32767.您可以通过将&附加到其中一个操作数来使其成为{{1}来避免这种情况。文字,例如Long