Ответы:
Для необъектных возвращаемых типов вы должны присвоить значение имени вашей функции, например так:
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что нужно!