问题
Why is 0/0 throwing Overflow error in VBA, while in .Net languages it is simply a Division by 0 error?
E.g., in C# it is a System.DivideByZeroException
static void Main()
{
int k = 0;
int p = 0;
Console.WriteLine(k/p);
}
Div/0 error exists in VBA. But 0/0 gives an overflow exception, while anything else divided by 0 gives a Div/0 exception:
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
That's what you get in the immediate window:
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
Edit: To make the whole story more interesting:
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
回答1:
https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/floating-point-division-operator
Besides the obvious differences in implementation of languages and the way VBA handles division, MS Doc link above expands on the reasons for overflow exception , that if the operand data types are integer then it will throw Overflow exception (Last statement below)
Alternatively there is \ division operator that checks the range for you and throws Division by zero exception
回答2:
Will try to summarize the answers from the comments:
In VBA 0/0 throws an Overflow exception, because 0/0 is a specific case of division by 0. Thus, it is a good idea to throw a different exception than the standard
Division by zero error.In VBA
Evaluate("0/0")returns aDivision by zero error, because Evaluate does not raise an error, it returns a Variant value with an error flag, and there is no "overflow" flag available.In VBA integer division 0\0 returns a
Division by zero error, because the result should be an integer value and #IND is a floating point value. As far as #IND cannot be returned, it gives the next best thing -Division by zero error.
More reading concerning 0/0 in other languages:
How to produce a NaN float in c?
VB.NET
来源:https://stackoverflow.com/questions/45485285/why-is-0-divided-by-0-throwing-an-overflow-error-in-vba