2016-03-15 1 views
3

Довольно просто, но я не нашел ничего от Google. Пример того, что я хочу, чтобы это произошло:Можно ли разрешить Integer Overflow в Excel VBA?

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 вместо того, чтобы бросать исключение переполнения. Я знаю, что могу написать функцию, которая это делает, но я написал кучу кода для проекта с допущением, что переполнение разрешено, поэтому я надеюсь, что есть быстрое исправление.

EDIT: Мне не нужна помощь, придумывающая функцию, которая решает проблему переполнения с преобразованиями типов. У меня его уже есть; Я просто хочу избежать изменения сотен операций сложения и вычитания. Я также расстроен тем, что VBA, похоже, делает все возможное, чтобы отключить функцию переполнения - он должен позволить пользователю решить, хотят ли они использовать его или нет.

+0

Почему вы не использовать Длинный тип вместо этого? –

+0

Я переводя код из C, который в значительной степени полагается на переполнение для вычисления угла. Он хранит углы в виде 2 байтовых целых чисел. – knockonwood

+0

В основном [это] (http://www.ozgrid.com/forum/showthread.php?t=72602). – knockonwood

ответ

0

Для того, чтобы предотвратить Integer переполнение в коде Excel VBA, вы можете использовать пользовательские Function выполнить отливку Integer для Long типа, как показано ниже:

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 

в качестве альтернативы, вы можете написать свою собственную функцию, которая должна реализовать, что «переполнение математики» (вы должны каким-то образом указать, используя обычным математическое обозначение, как получить номер -30536 от 35000) и вернуть результат либо как Long, либо String. Возможная реализация приведена ниже (примечание: номер исключения переполнения - 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 

Надеюсь, это поможет.

+0

Пропущает точку. От OP _I хочу, чтобы myFunc() возвращал ** - 30536 ** _ –

+0

@chrisneilsen Спасибо за ваш комментарий: см. Расширенный ответ. С уважением, –

+0

Обработка ошибок интригует, но привязана ли она к самой функции? Я хотел бы, чтобы это работало для всех модулей. – knockonwood

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 
2

Я хотел бы предложить писать MyFunc делать математику, как долго, и тест на целое «переполнение» и настроить

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 
+0

Да, это в основном то, что я делал, с отдельными функциями для сложения и вычитания. Не то, на что я надеялся, но, по крайней мере, это работает. – knockonwood

+0

Вы можете уйти только с одной функцией, отрицая параметр, например 'a-b' =' MuFunc (a, -b) ' –

+0

Не будет ли причиной ошибки, если b = -32768? – knockonwood