Ответы:
Для необъектных возвращаемых типов вы должны присвоить значение имени вашей функции, например так:
Public Function test() As Integer
test = 1
End Function
Пример использования:
Dim i As Integer
i = test()
Если функция возвращает тип объекта, то вы должны использовать 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
Range
), вы должны использовать его так Set
же, как если бы вы устанавливали переменную объекта в обычном методе. Поэтому, если, например, «test» - это функция, возвращающая Range, оператор return будет выглядеть следующим образом set test = Range("A1")
.
set
может привести к проблемам. У меня были проблемы без этого, но если я использую, set
я не делаю :).
set test = Range("A1")
в точности эквивалентно тому test = Range("A1").Value
, где «тест» определен как вариант, а не как диапазон.
Функции 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
Или крайний пример того, как работает возвращаемая переменная (но не обязательно хороший пример того, как вы на самом деле должны кодировать) - тот, который будет держать вас ночью:
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
Variant
и ваша цель - вернуть массив, то что-то подобное ReDim test(1 to 100)
вызовет ошибку. Кроме того, несмотря на то, что такой базовый тип можно трактовать так Integers
, он считается несколько недиоматичным. Это делает код сложнее для чтения. Программисты VBA сканируют строки, которые присваивают имени функции, чтобы понять, что делает функция. Использование имени функции в качестве регулярной переменной излишне затеняет это.
Exit Function
относится кreturn
ReDim test(1 to 100)
без вызова ошибки просто потому, что 'test' не объявлен как массив! и ни по какой другой причине вообще! Вы не можете объявить функцию как массив. Объявите его как a Variant
, затем просто создайте свой выходной массив (он может быть динамическим или статическим) внутри этой функции, test
а затем присвойте ("=") этот массив test
в качестве возвращаемого значения. Для дальнейшей манипуляции, например ReDim
, вам нужно присвоить возвращаемое значение переменной, например, Dim x as Variant
и вызвать x = test
, после чего x
вы сделали то, test
что нужно!