【发布时间】:2018-01-11 02:56:01
【问题描述】:
为什么0/0 在 VBA 中抛出 Overflow error,而在 .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
【问题讨论】:
-
你有没有明确地尝试过0 / 0?
-
@meowgoesthedog - 在 C# 中它不能编译,在 VBA 中它给出
Overflow -
如果每种语言在所有情况下都表现相同,就不会有不同的语言。由于
0/0的定义非常不明确,因此没有一个正确的响应。 -
这是一个有趣的问题,我认为如果您将 C# / .Net 异常排除在外,并重新措辞以比较 VBA 行为除以零和非零分子时的行为,我认为会更好VS。一个零分子。
-
值得指出的是,0 / 0 是一个特例。反对 x 0 的 x / 0 形式的计算的正常论点是没有数字 y 使得 y * 0 = x,因此 x / 0 是未定义的。这不是 0 的情况,因为 0 * 0 确实是 0。因此,如果 VBA 为 0 / 0 而不是 1 / 0 生成不同的错误,我就脱帽致敬!
标签: vba excel runtime-error