Как вернуться из функции в случае ошибки в VBA

Я новичок в VBA и хочу вернуться из функции, когда вижу ошибку. Не в состоянии сделать это. Любые указатели?

Function GetEditboxValue(control As IRibbonControl, text As String) As String

    If Not IsMissing(text) Then
        If Not IsNumeric(text) Then
            MsgBox "Please enter numeric value only."
            ' I WANT TO RETURN HERE 
        End If
    End If


    If control.id = "xyz" Then
    spaceAboveTable = text
    End If


End Function

person Ashish Gupta    schedule 29.12.2010    source источник
comment
Вы понимаете, что ваша функция не возвращает значение, верно? В VBA функция, которая не возвращает значение, должна быть объявлена ​​как Sub. В противном случае вы захотите присвоить значение GetEditboxValue перед выходом из функции. (Очевидно, это в случае, когда вы не хотите выходить раньше без возврата значения.)   -  person Cody Gray    schedule 29.12.2010
comment
Не забывайте, что эта функция выглядит очень некрасиво. Вместо того, чтобы возвращать значение из поля редактирования (что следует из названия), единственное, что он, кажется, делает, это создает какой-то неприятный побочный эффект - рано или поздно вызывает у вас головную боль при обслуживании. Вместо того, чтобы отделять обнаружение ошибок от обработки ошибок, он сам обрабатывает ошибки с помощью MsgBox. Лучше разделить эти проблемы, если текст не является числовым, вернуть значение ошибки или вызвать событие ошибки или что-то в этом роде, но пусть вызывающий решает, хочет ли он показать окно сообщения или выполнить другую обработку ошибок.   -  person Doc Brown    schedule 29.12.2010
comment
@Cody, просто чтобы уточнить ваше замечание для @ydobonmai, все подпрограммы, объявленные как функции, будут возвращать значение. Если вы не укажете точное значение какое в строке типа 'GetEditboxValue = ‹something›', ваша функция вернет любое значение по умолчанию для типа функции. В данном случае это пустая строка, но это может быть 0, False, Empty, Nothing и т. д.   -  person jtolle    schedule 29.12.2010
comment
@Док, согласен. Я новичок в VBA, и это то, что я написал очень быстро и просто не знал о EXIT FUNCTION. Функция даже не полная. Я просто ударился о стену и спросил здесь, в SO. Спасибо за ваши ценные комментарии и ваше время.   -  person Ashish Gupta    schedule 29.12.2010


Ответы (4)


Там нужно поставить EXIT FUNCTION, чтобы выйти из дальнейшего исполнения:

Function GetEditboxValue(control As IRibbonControl, text As String) As String

    If Not IsMissing(text) Then
        If Not IsNumeric(text) Then
            MsgBox "Please enter numeric value only."
            EXIT FUNCTION
        End If
    End If


    If control.id = "xyz" Then
    spaceAboveTable = text
    End If


End Function
person Sarfraz    schedule 29.12.2010
comment
@Sarfraj, у меня есть вопрос по VBA: - stackoverflow. com/questions/4565185/. Не могли бы вы помочь. - person Ashish Gupta; 30.12.2010
comment
Или EXIT SUB, если это подпрограмма, а не функция. - person Daniel 'Dang' Griffith; 19.03.2013

В общем смысле (на самом деле я не говорю ничего, что еще не было сказано):

Function Foo(inputVar As Double) As Double

    On Error GoTo ErrorHandler

    ' Code assigning something to returnValue and defaultOutput

    Foo = returnValue

    Exit Function

    ErrorHandler:

    Foo = defaultOutput

 End Function

Конечно, нет причин, чтобы это было двойным.

(Отредактировано, потому что у меня была вторая «Функция выхода» вместо «Функция завершения».)

person Community    schedule 24.02.2016

Вы можете использовать Exit Function после оператора MsgBox

person Alex P    schedule 29.12.2010

Другой вариант — явно вызвать ошибку, используя Err.Raise. Поскольку у вас нет обработчика ошибок в этой функции (т. е. нет строки On Error ...), ошибка будет распространяться вверх по стеку вызовов, пока не встретится с обработчиком ошибок.

person mwolfe02    schedule 30.12.2010