Відповіді:
Для необ'єктних типів повернення потрібно призначити значення імені вашої функції, наприклад:
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
само, як і при встановленні змінної об'єкта в звичайному методі. Так, якби, наприклад, "тест" був функцією, яка повертала Діапазон, оператор 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
Оскільки це так, також приємно знати, що ви можете використовувати змінну return, як і будь-яку іншу змінну в методі. Подобається це:
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
як , що вона вважається кілька unidiomatic. Це робить код важче читати. Програмісти VBA сканують рядки, які присвоюють ім'я функції, щоб зрозуміти, що робить функція. Використання назви функції як звичайної змінної непотрібно це приховувати.
Exit Function
стосуєтьсяreturn
ReDim test(1 to 100)
без спроби помилки просто тому, що 'test' не оголошено як масив! і зовсім без жодної причини! Ви не можете оголосити функцію як масив. Оголосіть це як Variant
, а потім просто побудуйте свій вихідний масив (він може бути динамічним або статичним) всередині цієї функції, test
а потім призначте ("=") цьому масиву test
як повернене значення. Для подальшого маніпулювання, як-от ReDim
, вам потрібно присвоїти повернене значення змінній, наприклад, Dim x as Variant
і викликати x = test
, після чого x
саме це ви зробили test
!
Наведений нижче код зберігає повернене значення у змінну, retVal
а потім MsgBox
може бути використаний для відображення значення:
Dim retVal As Integer
retVal = test()
Msgbox retVal