Страницы: 1
RSS
Обход ошибок в VBA при вызове функции
 
Добрый вечер!

Столкнулся с проблемой - имеются ячейки, из которых функцией извлекается предпоследнее вхождение текста после определенного делителя "Human".
В том случае, если функция не находит подходящих значений, она возвращает #ЗНАЧ!, который мешает работе остальных функций, которые используют ссылки на эту.

Необходимо результат #ЗНАЧ! при вызове функции заменить на пустое значение ""
Долго гуглил информацию по поводу обхода ошибок с помощью CVErr(xlErrValue)/Application.Function.Iserror, но не получается ими правильно воспользоваться.

Сам код:
Код
Public Function RegExpExtract(text As String, Pattern As String, Optional Item As Integer = 1) As String
    On Error GoTo ErrHandl
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = Pattern
    regex.Global = True
    If regex.Test(text) Then
        Set matches = regex.Execute(text)
        RegExpExtract = matches.Item(Item - 1)
        Exit Function
    End If
ErrHandl:
    RegExpExtract = CVErr(xlErrValue)
End Function

Function Test(Текст As String) As String

    Dim ПолучитьПредпоследнийHuman As String

    РазделитьТекст = Split(Текст, "Human:", , vbTextCompare)
    ПосчитатьHuman = UBound(РазделитьТекст)
    ПолучитьПредпоследнийHuman = РазделитьТекст(ПосчитатьHuman - 2)
    ПоискПоRegExp = Trim(RegExpExtract(ПолучитьПредпоследнийHuman, "\s.*."))
    ПовторныйДелитель = Split(ПоискПоRegExp, "Bot:", , vbTextCompare)
    
    Test = ПовторныйДелитель(0)

End Function


Был бы очень благодарен за помощь с объяснением того, как правильно необходимо отлавливать подобные ошибки в функции.
Файл-пример прикладываю.
 
а что, кроме вас, мешает вашей функции вернуть пусто, а не #ЗНАЧ!, который всем так мешает?
стандартный подход требует сначала выявить исключения в данных и только когда их нет приступать к обработке, когда появилась уверенность что будет что обрабатывать
и когда научитесь описывать не проблему, на которую нарвался ваш способ решения, а задачу, которую решаете, возможно, вам станут охотнее помогать
Изменено: Ігор Гончаренко - 23.10.2020 23:58:35
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Так надо обработать ошибку
Код
    ПосчитатьHuman = UBound(РазделитьТекст)
    If ПосчитатьHuman < 2 Then
        Test = ""
        Exit Function
    End If
И в этом месте
Код
   If regex.Test(text) Then
        Set matches = regex.Execute(text)
        RegExpExtract = matches.Item(Item - 1)
        Exit Function
    End If
    Exit Function ' добавил
ErrHandl:
    RegExpExtract = CVErr(xlErrValue)
End Function
 
doober, огромное вам спасибо!
Страницы: 1
Наверх