非常简单,但谷歌找不到任何东西。我想要发生的一个例子:
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似乎不愿意禁用溢出功能 - 它应该让用户决定是否要使用它。
答案 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
执行Integer
到Long
类型转换,如下所示:< / 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