Как вернуть результат из функции VBA

178

Как вернуть результат из функции?

Например:

Public Function test() As Integer
    return 1
End Function

Это дает ошибку компиляции.

Как заставить эту функцию возвращать целое число?

Теги:
excel-vba

4 ответа

263
Лучший ответ

Для типов возврата без объекта вам необходимо присвоить значение имени вашей функции, например:

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

  • 30
    Для полноты следует отметить, что когда вы возвращаете объект (например, Range ), вам нужно использовать Set как если бы вы устанавливали переменную объекта в обычном методе. Так, если, например, «test» - это функция, которая возвращает Range, оператор return будет выглядеть следующим образом: set test = Range("A1") .
  • 0
    Почему это @JayCarr?
Показать ещё 5 комментариев
78

Функции VBA обрабатывают имя функции как своего рода переменную. Поэтому вместо использования инструкции "return" вы просто скажете:

test = 1

Обратите внимание, что это не выходит из функции. Любой код после этого оператора также будет выполнен. Таким образом, вы можете иметь множество операторов присваивания, которые присваивают разные значения test, и независимо от того, какое значение имеет значение, когда вы достигнете конца функции, будет возвращено значение.

  • 0
    На самом деле вы ответили на вопрос более четко с дополнительной информацией (что может привести к другому вопросу от новичка в VBA парень). Продолжайте хорошую работу
  • 0
    Извините, мне показалось, что вы ответили так же, как и мой ответ, который я получил первым, но просто добавили тот факт, что он не выходит из функции. Это хорошее дополнение, я просто подумал, что это будет более уместным в качестве комментария. Я не уверен, что такое правильный этикет, я думаю, было бы немного грубо понижать голос за это, потому что это хороший ответ, но он не позволит мне отменить его.
28

Простое значение возвращаемого значения для имени функции все еще не совсем то же, что и оператор Java (или другого) return, потому что в 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
  • 2
    «также приятно знать, что вы можете использовать возвращаемую переменную, как и любую другую переменную в методе», в основном это правда, но, например, если тип возвращаемого значения - Variant и ваша цель - вернуть массив, то что-то вроде ReDim test(1 to 100) вызовет ошибку. Кроме того , несмотря на то, что можно рассматривать как основной тип Integers , как , что считается несколько unidiomatic. Это делает код сложнее для чтения. Программисты VBA сканируют строки, которые присваивают имени функции, чтобы понять, что делает функция. Использование имени функции в качестве регулярной переменной излишне затеняет это.
  • 0
    @JohnColeman, полностью согласен в обоих пунктах. Ни в коем случае не следует использовать последний пример рекомендуемой методологии. Но основной вопрос касается того, как вернуть переменную, и это всего лишь попытка полного объяснения возвращаемого результата VB и, как следствие, того, как они работают. Конечно, последний случай не является рекомендацией. (Я, конечно, не стал бы это кодировать как пример.) Итак, ваши очки хорошо взяты и являются хорошим дополнением. Спасибо.
Показать ещё 5 комментариев
-2

В приведенном ниже коде хранится возвращаемое значение в переменной retVal, а msgbox может использоваться для отображения значения

Dim retVal As Integer
retVal = test()
Msgbox retVal

Ещё вопросы

Сообщество Overcoder
Наверх
Меню