Для необъектных возвращаемых типов вы должны присвоить значение имени вашей функции, например так:
PublicFunction test()AsInteger
test =1EndFunction
Пример использования:
Dim i AsInteger
i = test()
Если функция возвращает тип объекта, то вы должны использовать Setключевое слово, подобное этому:
PublicFunction testRange()As Range
Set testRange = Range("A1")EndFunction
Пример использования:
Dim r As Range
Set r = testRange()
Обратите внимание, что присвоение возвращаемого значения имени функции не прекращает выполнение вашей функции. Если вы хотите выйти из функции, то вам нужно явно сказать Exit Function. Например:
Function test(ByVal justReturnOne AsBoolean)AsIntegerIf justReturnOne Then
test =1ExitFunctionEndIf'more code...
test =2EndFunction
Для полноты следует отметить, что когда вы возвращаете объект (например, a Range), вы должны использовать его так Setже, как если бы вы устанавливали переменную объекта в обычном методе. Поэтому, если, например, «test» - это функция, возвращающая Range, оператор return будет выглядеть следующим образом set test = Range("A1").
Джей Карр
Почему это @JayCarr?
PsychoData
4
@PsychoData - просто потому, что именно так вы устанавливаете переменную объекта в целом, и выполнение этого без него setможет привести к проблемам. У меня были проблемы без этого, но если я использую, setя не делаю :).
Джей Карр
1
Я думаю, что также стоит упомянуть, что поведение функции отличается, когда вы вызываете ее из электронной таблицы, по сравнению с вызовом ее из другой функции VBA или Sub.
Дуг Дженкинс
2
При вызове из VBA функция возвращает объект диапазона, но при вызове из рабочего листа она возвращает только значение, что set test = Range("A1")в точности эквивалентно тому test = Range("A1").Value, где «тест» определен как вариант, а не как диапазон.
Дуг Дженкинс
86
Функции VBA обрабатывают само имя функции как своего рода переменную. Таким образом, вместо использования returnвыражения " ", вы бы просто сказали:
test =1
Заметьте, однако, что это не выходит из функции. Любой код после этого оператора также будет выполнен. Таким образом, вы можете иметь много операторов присваивания, которые присваивают разные значения test, и какое бы значение ни было, когда вы достигнете конца функции, будет возвращаемое значение.
На самом деле вы ответили на вопрос более четко с дополнительной информацией (что может привести к другому вопросу от новичка в VBA парень). Продолжайте в том же
духе
Извините, мне показалось, что вы просто ответили так же, как и мой ответ, который я получил первым, но просто добавили тот факт, что он не выходит из функции. Это хорошее дополнение, я просто подумал, что это будет более уместным в качестве комментария. Я не уверен, каков правильный этикет, я думаю, было бы немного грубо понижать голос за это, потому что это хороший ответ, но он не позволит мне отменить его.
Дан
41
Просто установка возвращаемого значения для имени функции по-прежнему не совпадает с returnинструкцией Java (или другой) , потому что в Java, returnвыход из функции, например, так:
publicint test(int x){if(x ==1){return1;// exits immediately}// still here? return 0 as default.return0;}
В VB точный эквивалент занимает две строки, если вы не устанавливаете возвращаемое значение в конце своей функции . Итак, в VB точное следствие будет выглядеть так:
PublicFunction test(ByVal x AsInteger)AsIntegerIf x =1Then
test =1' does not exit immediately. You must manually terminate...ExitFunction' to exitEndIf' Still here? return 0 as default.
test =0' no need for an Exit Function because we're about to exit anyway.EndFunction
Так как это так, также приятно знать, что вы можете использовать возвращаемую переменную, как и любую другую переменную в методе. Как это:
PublicFunction test(ByVal x AsInteger)AsInteger
test = x ' <-- set the return valueIf test <>1Then' Test the currently set return value
test =0' Reset the return value to a *new* valueEndIfEndFunction
Или крайний пример того, как работает возвращаемая переменная (но не обязательно хороший пример того, как вы на самом деле должны кодировать) - тот, который будет держать вас ночью:
PublicFunction test(ByVal x AsInteger)AsInteger
test = x ' <-- set the return valueIf test >0Then' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,' AND THE RESULT RESETTING THE RETURN VALUE.
test = test(test -1)EndIfEndFunction
«также приятно знать, что вы можете использовать возвращаемую переменную, как и любую другую переменную в методе», в основном это правда, но, например, если тип возвращаемого значения Variantи ваша цель - вернуть массив, то что-то подобное ReDim test(1 to 100)вызовет ошибку. Кроме того, несмотря на то, что такой базовый тип можно трактовать так Integers, он считается несколько недиоматичным. Это делает код сложнее для чтения. Программисты VBA сканируют строки, которые присваивают имени функции, чтобы понять, что делает функция. Использование имени функции в качестве регулярной переменной излишне затеняет это.
Джон Колман
@JohnColeman, полностью согласен в обоих пунктах. Ни в коем случае не следует использовать последний пример рекомендуемой методологии. Но основной вопрос касается того, как вернуть переменную, и поэтому это всего лишь попытка полного объяснения возвращаемого результата VB и, как следствие, как они работают. Конечно, последний случай не является рекомендацией. (Я, конечно, не буду кодировать это как пример.) Итак, ваши очки хорошо взяты, и хорошие дополнения. Спасибо.
LimaNightHawk
Это является полезным для низковата функций, и это то , что любой VBA программист должен знать о, так что я не имел никаких проблем с вами упоминание о нем. Я просто подумал, что предупреждение должно быть включено.
Джон Колман
Спасибо, объясняя, как Exit Functionотносится кreturn
Остин D
@JohnColeman, очевидно, вы не можете ReDim test(1 to 100)без вызова ошибки просто потому, что 'test' не объявлен как массив! и ни по какой другой причине вообще! Вы не можете объявить функцию как массив. Объявите его как a Variant, затем просто создайте свой выходной массив (он может быть динамическим или статическим) внутри этой функции, testа затем присвойте ("=") этот массив testв качестве возвращаемого значения. Для дальнейшей манипуляции, например ReDim, вам нужно присвоить возвращаемое значение переменной, например, Dim x as Variantи вызвать x = test, после чего xвы сделали то, testчто нужно!
Джин,
-6
Приведенный ниже код сохраняет возвращаемое значение в переменной retValи затем MsgBoxможет использоваться для отображения значения:
Dim retVal AsInteger
retVal = test()
Msgbox retVal
Ответы:
Для необъектных возвращаемых типов вы должны присвоить значение имени вашей функции, например так:
Пример использования:
Если функция возвращает тип объекта, то вы должны использовать
Set
ключевое слово, подобное этому:Пример использования:
Обратите внимание, что присвоение возвращаемого значения имени функции не прекращает выполнение вашей функции. Если вы хотите выйти из функции, то вам нужно явно сказать
Exit 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
, и какое бы значение ни было, когда вы достигнете конца функции, будет возвращаемое значение.источник
Просто установка возвращаемого значения для имени функции по-прежнему не совпадает с
return
инструкцией Java (или другой) , потому что в Java,return
выход из функции, например, так:В VB точный эквивалент занимает две строки, если вы не устанавливаете возвращаемое значение в конце своей функции . Итак, в VB точное следствие будет выглядеть так:
Так как это так, также приятно знать, что вы можете использовать возвращаемую переменную, как и любую другую переменную в методе. Как это:
Или крайний пример того, как работает возвращаемая переменная (но не обязательно хороший пример того, как вы на самом деле должны кодировать) - тот, который будет держать вас ночью:
источник
Variant
и ваша цель - вернуть массив, то что-то подобноеReDim test(1 to 100)
вызовет ошибку. Кроме того, несмотря на то, что такой базовый тип можно трактовать такIntegers
, он считается несколько недиоматичным. Это делает код сложнее для чтения. Программисты VBA сканируют строки, которые присваивают имени функции, чтобы понять, что делает функция. Использование имени функции в качестве регулярной переменной излишне затеняет это.Exit Function
относится кreturn
ReDim test(1 to 100)
без вызова ошибки просто потому, что 'test' не объявлен как массив! и ни по какой другой причине вообще! Вы не можете объявить функцию как массив. Объявите его как aVariant
, затем просто создайте свой выходной массив (он может быть динамическим или статическим) внутри этой функции,test
а затем присвойте ("=") этот массивtest
в качестве возвращаемого значения. Для дальнейшей манипуляции, напримерReDim
, вам нужно присвоить возвращаемое значение переменной, например,Dim x as Variant
и вызватьx = test
, после чегоx
вы сделали то,test
что нужно!Приведенный ниже код сохраняет возвращаемое значение в переменной
retVal
и затемMsgBox
может использоваться для отображения значения:источник