Pretty simple, but I couldn’t find anything by Googling. An example of what I want to happen:
Function myFunc() Dim a As Integer Dim b As Integer Dim c As Integer a = 20000 b = 15000 c = a + b myFunc = c End Function
I want myFunc() to return -30536 instead of throwing an overflow exception. I know I could write a function that does that, but I’ve written a bunch of code for a project with the assumption that overflow was allowed, so I’m hoping there’s a quick fix.
EDIT: I don’t need help coming up with a function that solves the overflow issue with type conversions. I have one already; I just want to avoid changing hundreds of addition and subtraction operations. I’m also bit frustrated that VBA seems to go out of its way to disable overflow functionality–it should let the user decide if they want to use it or not.
I would suggest writing
MyFunc to do the math as Long, and test for integer “overflow” and adjust
Function MyFunc(a As Integer, b As Integer) As Integer Dim sum As Long Const Mask As Integer = -1 sum = CLng(a) + CLng(b) If sum > 32767 Then sum = sum - 65536 ElseIf sum < -32768 Then sum = sum + 65536 End If MyFunc = sum End Function
Sub zx() Debug.Print MyFunc(20000, 15000) End Sub
In order to prevent
Integer overflow in your Excel VBA code, you may use the custom
Function to perform the
Long type casting like shown below:
Sub TestIntegerConversion() Debug.Print myFuncLong(20000, 15000) End Sub Function myFuncLong(a As Integer, b As Integer) As Long myFuncLong = CLng(a) + CLng(b) End Function
or without using custom Function in a simple form like this:
Sub PreventOverflow() Dim a As Integer Dim b As Integer a = 20000 b = 15000 Debug.Print CLng(a) + CLng(b) End Sub
Alternatively, you may write your own custom function, which should implement that “overflow math” (you have somehow to specify using plain math notation how to get the number -30536 from 35000) and return the result either as
String. Possible implementation is shown below (note: Overflow exception number is 6)
Sub OverflowCustomMath() Dim a As Integer Dim b As Integer Dim c As Long a = 20000 b = 15000 On Error GoTo Err: Debug.Print a + b Err: If (Err.Number = 6) Then 'apply your custom overflow math, as for e.g. Debug.Print CLng(a) + CLng(b) End If End Sub
Hope this may help.
Use typical VBA error handler but tests for your case.
Option Explicit Sub test() MsgBox myFunc End Sub Function myFunc() On Error GoTo Local_err Dim a As Integer Dim b As Integer Dim c As Integer a = 20000 b = 15000 c = a + b myFunc = c Local_exit: Exit Function Local_err: If Err = 6 Then myFunc = -30536 Else MsgBox Err & " " & Err.Description ' myFunc = whatever error value to return End If Resume Local_exit End Function