【问题标题】:Why is 0 divided by 0 throwing an overflow error in VBA?为什么0除以0会在VBA中引发溢出错误?
【发布时间】: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


【解决方案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 (下面的最后一句话)

或者有\division operator为你检查范围并抛出Division by zero异常

【讨论】:

  • 这确实是一个有趣的阅读,但它适用于VB.Net。在VBA 中,SingleDouble 甚至 String0/0 值都会引发 Overthrow 错误。
  • 使用字符串除法不会重载并转换为数字吗?
  • @虽然这确实是针对vb.net,但引发溢出错误而不是除以零错误的基本原理无疑是相同的。不过,最好找到指向 VBA 或至少 VB6 文档的链接。
  • @RYenugu - 是的。结果将是一个数字。或者一个错误:)
  • @RYenugu - 我明白,但在VBA 中,零是Integer。查看问题的更新版本。
【解决方案2】:

将尝试总结来自 cmets 的答案:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多