Как вернуть результат из функции VBA

Как вернуть результат из функции?

Например:

Public Function test() As Integer
    return 1
End Function

Это дает ошибку компиляции.

Как сделать так, чтобы эта функция возвращала целое число?

Комментарии к вопросу (1)
Решение

Для типов возврата, не являющихся объектами, вы должны присвоить значение имени вашей функции, как показано ниже:

Public Function test() As Integer
    test = 1
End Function

Пример использования:

Dim i As Integer
i = test()

Если функция возвращает тип Object, то необходимо использовать ключевое слово Set следующим образом:

Public Function testRange() As Range
    Set testRange = Range("A1")
End Function

Пример использования:

Dim r As Range
Set r = testRange()

Обратите внимание, что присвоение возвращаемого значения имени функции не завершает выполнение вашей функции. Если вы хотите выйти из функции, то вам нужно явно сказать Exit Function. Например:

Function test(ByVal justReturnOne As Boolean) As Integer
    If justReturnOne Then
        test = 1
        Exit Function
    End If
    'more code...
    test = 2
End Function

Документация: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx

Комментарии (7)

Функции VBA рассматривают само имя функции как своего рода переменную. Поэтому вместо использования оператора "return" вы можете просто сказать:

test = 1

Заметьте, однако, что это не приводит к выходу из функции. Любой код после этого оператора также будет выполнен. Таким образом, у вас может быть много операторов присваивания, которые присваивают различные значения test, и какое бы значение ни было, когда вы дойдете до конца функции, оно будет возвращенным значением.

Комментарии (2)

Просто установка возвращаемого значения в имя функции все еще не является точно тем же самым, что и оператор return в Java (или других языках), потому что в java return завершает функцию, как это сделано здесь:

public int test(int x) {
    if (x == 1) {
        return 1; // exits immediately
    }

    // still here? return 0 as default.
    return 0;
}

В VB точный эквивалент занимает две строки, если вы не устанавливаете возвращаемое значение в конце вашей функции. Таким образом, в VB точное следствие будет выглядеть следующим образом:

Public Function test(ByVal x As Integer) As Integer
    If x = 1 Then
        test = 1 ' does not exit immediately. You must manually terminate...
        Exit Function ' to exit
    End If

    ' Still here? return 0 as default.
    test = 0
    ' no need for an Exit Function because we're about to exit anyway.
End Function 

Поскольку это так, приятно также знать, что вы можете использовать возвращаемую переменную как любую другую переменную в методе. Например:


Public Function test(ByVal x As Integer) As Integer

    test = x ' 
Комментарии (7)

Ниже код сохраняет возвращаемое значение в код переменную и затемс помощью MsgBox может использоваться для отображения значения:

Dim retVal As Integer
retVal = test()
Msgbox retVal
Комментарии (0)