是否可以在Excel VBA中允许Integer Overflow?

时间:2016-03-15 21:53:45

标签: excel vba excel-vba integer-overflow

非常简单,但谷歌找不到任何东西。我想要发生的一个例子:

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

我希望myFunc()返回-30536而不是抛出溢出异常。我知道我可以编写一个能够做到这一点的函数,但我已经为一个项目编写了一堆代码,假设允许溢出,所以我希望有一个快速修复。

编辑:我不需要帮助提出一个解决类型转换溢出问题的函数。我已经有一个;我只想避免改变数百个加法和减法操作。我也有点沮丧的是,VBA似乎不愿意禁用溢出功能 - 它应该让用户决定是否要使用它。

3 个答案:

答案 0 :(得分:2)

我建议写MyFunc来做数学计算为Long,并测试整数"溢出"并调整

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

答案 1 :(得分:0)

为了防止Excel VBA代码中出现Integer溢出,您可以使用自定义Function执行IntegerLong类型转换,如下所示:< / p>

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

或不使用自定义函数的简单形式:

Sub PreventOverflow()
    Dim a As Integer
    Dim b As Integer
    a = 20000
    b = 15000

    Debug.Print CLng(a) + CLng(b)
End Sub

或者,您可以编写自己的自定义函数,它应该实现“溢出数学”(您可以使用简单的数学符号指定如何从35000获取数字-30536)并将结果返回为{{1 },或Long。可能的实现如下所示(注意:溢出异常编号为6)

String

希望这可能会有所帮助。

答案 2 :(得分:0)

使用典型的VBA错误处理程序,但针对您的情况进行测试。

            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