Можно ли перехватывать стандартные ошибки Excel при вводе пользовательской функции VBA?

Можно ли перехватывать стандартные ошибки Excel при вводе пользовательской функции VBA?

Я хотел бы узнать, есть ли способ в пользовательской функции Excel VBA распознать, что входные данные представляют собой одну из стандартных ошибок Excel, например #ДЕЛ/0!

Допустим, у меня есть очень простая пользовательская функция Excel VBA Myadd

Function Myadd(a, b)
   Myadd = a + b
End Function

В ячейке A3 листа Excel я ввожу, скажем, =Myadd(A1,A2) это, очевидно, работает нормально, пока A1 и A2 числовые. Но если я создаю стандартную ошибку Excel в A1, например, =1/0то это приводит к #DIV/0! в A1, а A1 является входными данными для функции Myadd. Поскольку числовых данных нет, Myadd приводит к #VALUE!.

Я могу использовать функцию Isnumeric в VBA, но это будет специфично для этого примера. Однако, как правило, есть ли способ узнать, что входные данные для пользовательской функции на самом деле являются ячейкой, содержащей один из кодов ошибок, таких как #DIV/0! или #VALUE! и т. д.

Спасибо.

введите описание изображения здесь

решение1

Для ошибок используйтеIsError()( #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, #NULL!)

Чтобы проверить, что параметры содержат одну ячейку, используйте TypeName(a) = "Range"иCountLarge > 1


Option Explicit

Public Function MyAdd(ByVal a As Variant, ByVal b As Variant) As Long

    If TypeName(a) = "Range" Then If a.Cells.CountLarge > 1 Then Set a = a.Cells(1)
    If TypeName(b) = "Range" Then If b.Cells.CountLarge > 1 Then Set b = b.Cells(1)

    If IsError(a) Then
        a = 0
    Else
        a = IIf(Not IsNumeric(Val(a)), 0, Val(a))
    End If

    If IsError(b) Then
        b = 0
    Else
        b = IIf(Not IsNumeric(Val(b)), 0, Val(b))
    End If

    MyAdd = a + b
End Function

Связанный контент