Как вернуть результат из функции?
Например:
Public Function test() As Integer
return 1
End Function
Это дает ошибку компиляции.
Как сделать так, чтобы эта функция возвращала целое число?
Для типов возврата, не являющихся объектами, вы должны присвоить значение имени вашей функции, как показано ниже:
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
Функции VBA рассматривают само имя функции как своего рода переменную. Поэтому вместо использования оператора "return
" вы можете просто сказать:
test = 1
Заметьте, однако, что это не приводит к выходу из функции. Любой код после этого оператора также будет выполнен. Таким образом, у вас может быть много операторов присваивания, которые присваивают различные значения test
, и какое бы значение ни было, когда вы дойдете до конца функции, оно будет возвращенным значением.
Просто установка возвращаемого значения в имя функции все еще не является точно тем же самым, что и оператор 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 ' <-- set the return value
If test <> 1 Then ' Test the currently set return value
test = 0 ' Reset the return value to a *new* value
End If
End Function
Или крайний пример того, как переменная return работает (но не обязательно хороший пример того, как вы должны писать код) - тот, который не даст вам спать по ночам:
Public Function test(ByVal x As Integer) As Integer
test = x ' <-- set the return value
If test > 0 Then
' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,
' AND THE RESULT RESETTING THE RETURN VALUE.
test = test(test - 1)
End If
End Function
Ниже код сохраняет возвращаемое значение в код переменную и затем
с помощью MsgBox может использоваться для отображения значения:
Dim retVal As Integer
retVal = test()
Msgbox retVal