В некоторых сценариях требуется, чтобы пользовательская функция возвращала значение ошибки. Давайте рассмотрим функцию "УБРАТЬ_ГЛАСНЫЕ," которая была представлена ранее в статье №60. Вот её код:
При использовании этой функции в составе формулы на листе Excel, она удаляет гласные буквы из текстового аргумента, находящегося в одной ячейке. Если аргумент является числовым значением, оно возвращается в виде СТРОКИ. В таком случае предпочтительнее вернуть сообщение об ошибке (#Н/Д).
Казалось бы, логичным решением было бы создать строку, которая выглядит как значение ошибки в формуле Excel:
УБРАТЬ_ГЛАСНЫЕ = "#Н/Д"
Однако, несмотря на то, что эта строка выглядит как значение ошибки, она не обрабатывается как ошибка другими формулами, которые могут на неё ссылаться. Чтобы получить в результате выполнения функции настоящее значение ошибки, давайте используем функцию CVErr, которая преобразует номер ошибки в настоящую ошибку.
В VBA уже встроены константы для обозначения ошибок, которые может возвращать пользовательская функция. Эти значения представляют ошибки выполнения формул Excel, а не ошибки выполнения кода VBA. Вот некоторые из них:
- xlErrDiv0 (для ошибки #ДЕЛ/0!);
- xlErrNA (для ошибки #H/Д);
- xlErrName (для ошибки #ИМЯ?);
- xlErrNull (для ошибки #ПУСТО!);
- xlErrNum (для ошибки #ЧИСЛО!);
- xlErrRef (для ошибки #ССЫЛКА!);
- xlErrValue (для ошибки #ЗНАЧ!).
В конце статьи разберём каждую константу.
Чтобы получить ошибку #Н/Д в пользовательской функции, используйте следующий оператор:
УБРАТЬ_ГЛАСНЫЕ = CVErr(xlErrNA)
Ниже приведён новый (изменённый) код функции УБРАТЬ_ГЛАСНЫЕ. В этой версии добавлен блок условия If Then, который выполняет альтернативное действие в случае, если аргумент не является текстовой строкой. Функция вызывает встроенную функцию Excel ЕТЕКСТ(), чтобы определить, содержит ли ячейка текст. Если ячейка содержит текст, функция возвращает нормальный результат. В противном случае возвращается ошибка #Н/Д.
Обратите внимание, что мы изменили тип данных для возвращаемого значением функции. Поскольку функция может возвращать что-то, кроме строки, тип данных был изменён на Variant.
А теперь, давайте разберем этот код построчно:
- Function УБРАТЬ_ГЛАСНЫЕ(Txt) As Variant - Определяет начало функции с именем УБРАТЬ_ГЛАСНЫЕ и параметром Txt. Функция возвращает значение типа Variant, что означает, что она может возвращать различные типы данных, включая строки, числа и ошибки.
- Dim i As Long - Объявляет переменную i типа Long, которая будет использоваться в цикле для итерации по символам в строке.
- УБРАТЬ_ГЛАСНЫЕ = "" - Инициализирует переменную УБРАТЬ_ГЛАСНЫЕ пустой строкой. Эта переменная будет использоваться для накопления символов без гласных.
- For i= 1 To Len(Txt) - Начинает цикл, который будет выполняться для каждого символа в строке Txt. Len(Txt) возвращает длину строки.
- If Not UCase(Mid(Txt, i, 1)) Like "[AEIOUАЕЁИОУЫЭЮЯ]" Then - Проверяет, если текущий символ не является гласной. Mid(Txt, i, 1) возвращает i-й символ из строки Txt, UCase преобразует его в верхний регистр, и Like проверяет, соответствует ли символ шаблону гласных.
- УБРАТЬ_ГЛАСНЫЕ = УБРАТЬ_ГЛАСНЫЕ & Mid(Txt, i, 1) - Если текущий символ не является гласной, добавляет его к переменной УБРАТЬ_ГЛАСНЫЕ. Это создает новую строку, содержащую только согласные символы.
- Next i - Завершает цикл, переходя к следующему символу в строке.
- End Function - Завершает определение функции.
Таким образом, функция УБРАТЬ_ГЛАСНЫЕ принимает текстовый аргумент и возвращает новую строку, содержащую те же символы, что и в исходной строке, за исключением гласных. Если аргумент НЕ ЯВЛЯЕТСЯ строкой, функция возвращает ошибку #Н/Д.
Например:
Разбор констант:
- xlErrDiv0 (для ошибки #ДЕЛ/0!);
Эта константа связана с ошибкой деления на ноль. В формулах Excel она отображается как #ДЕЛ/0!, что указывает на попытку деления на ноль.
- xlErrNA (для ошибки #H/Д);
Константа xlErrNA связана с ошибкой недоступности данных (#H/Д), которая возникает, когда Excel не может получить доступ к необходимым данным.
- xlErrName (для ошибки #ИМЯ?);
Эта константа связана с ошибкой отсутствия идентификатора (#ИМЯ?), которая возникает, когда используется недопустимое имя.
- xlErrNull (для ошибки #ПУСТО!);
Константа xlErrNull связана с ошибкой нулевого значения (#ПУСТО!). Эта ошибка возникает, когда формула пытается использовать значение, которое является Null (пустым).
- xlErrNum (для ошибки #ЧИСЛО!);
Эта константа связана с ошибкой недопустимого числа (#ЧИСЛО!). Она возникает, когда формула ожидает числовое значение, но получает что-то другое.
- xlErrRef (для ошибки #ССЫЛКА!);
Константа xlErrRef связана с ошибкой недопустимой ссылки (#ССЫЛКА!). Эта ошибка возникает, когда формула ссылается на недопустимую ячейку или диапазон ячеек.
- xlErrValue (для ошибки #ЗНАЧ!);
Эта константа связана с ошибкой недопустимого значения (#ЗНАЧ!). Она возникает, когда формула ожидает определенный тип значения, но получает что-то другое.