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

Vit*_*ata 11 excel vba runtime-error excel-vba

为什么要0/0投入Overflow errorVBA,而在.Net语言中它只是一个Division by 0错误?


例如,C#它是一个System.DivideByZeroException

static void Main()
{
    int k = 0;
    int p = 0;
    Console.WriteLine(k/p);
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这就是你在即时窗口中获得的:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

Vit*_*ata 1

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

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

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

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

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