为什么0除以0会在VBA中抛出溢出错误?

时间:2017-08-03 13:13:56

标签: vba excel-vba runtime-error excel

为什么0/0Overflow error投放到VBA中,而在.Net语言中只是Division by 0错误?

例如,在C#中,它是System.DivideByZeroException

static void Main()
{
    int k = 0;
    int p = 0;
    Console.WriteLine(k/p);
}
Div/0中存在

VBA错误。 但是 0/0提供了溢出异常,而其他任何除以0的内容都会产生Div/0异常:

Public Sub TestMe()

    'Integer
    PrintAndCheck (11)      '- Division by zero error

    'Double
    PrintAndCheck (0.9)     '- Division by zero error

    'Long
    PrintAndCheck (50000)   '- Division by zero error

    'String
    PrintAndCheck ("1.1")   '- Division by zero error

    '----------------------------------------------------
    '----------------BUT---------------------------------
    '----------------------------------------------------

    'Integer
    PrintAndCheck (0)       '- Overflow?

End Sub

Public Sub PrintAndCheck(lngDivisor As Variant)

    On Error Resume Next

    Debug.Print lngDivisor / 0
    Debug.Print Err.Description & " from type -> " & VarType(lngDivisor)

    On Error GoTo 0

End Sub

这就是你在即时窗口中得到的结果:

Division by zero from type -> 2
Division by zero from type -> 5
Division by zero from type -> 3
Division by zero from type -> 8
Overflow from type -> 2

编辑:使整个故事更有趣:

Public Sub TestMe()
    On Error Resume Next
    Debug.Print Evaluate("0/0")     'Division by 0 error (CVErr(xlErrDiv0)=2007)
    Debug.Print 0 \ 0               'Division by 0 error
    Debug.Print Err.Description
    On Error GoTo 0
End Sub

2 个答案:

答案 0 :(得分:1)

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/floating-point-division-operator

除了语言实现和VBA处理division的方式明显不同之外,上面的MS Doc链接扩展了overflow exception的原因,如果操作数数据类型是整数那么它将抛出Overflow exception(下面的最后声明)

enter image description here

或者,\ division operator会检查您的范围并抛出Division by zero例外

答案 1 :(得分:1)

将尝试总结评论中的答案:

  1. 在VBA中 0/0 会抛出溢出异常,因为 0/0 是除以 0 的特定情况。因此,抛出与标准Division by zero error不同的例外是个好主意。

  2. 在VBA Evaluate("0/0")中返回Division by zero error,因为Evaluate不会引发错误,它会返回带有错误标志的Variant值,并且没有"溢出&#34 ;国旗可用。

  3. 在VBA中,整数除法 0 \ 0 返回Division by zero error,因为结果应为整数值,而#IND是浮点值。至于#IND不能返回,它提供了下一个最好的东西 - Division by zero error

  4. 关于 0/0 的更多阅读用其他语言: