Страницы: 1
RSS
Можно ли использовать пользовательскую функцию в формуле проверки данных
 
Добрый день!
В модуль вставлена пользовательская функция сличения с шаблоном:
Код
Function MaskCompare(txt As String, mask As String, CaseSensitive As Boolean) As Boolean
    If Not CaseSensitive Then
        txt = UCase(txt)
        mask = UCase(mask)
    End If
    If txt Like mask Then
            MaskCompare = True
        Else
            MaskCompare = False
    End If
End Function

Когда пытаюсь ее использовать для проверки вводимых значений, задавая формулу для проверки:
=MaskCompare(ActiveCell.Value;"##-##";1)
или даже;
=MaskCompare("33-44";"##-##";1)
то при попытке закрытия окна с параметрами проверки, получаю сообщение:
"Указанный именованный диапазон не найден"
У меня, как у Excel newbie, возник вопрос: можно ли использовать пользовательскую функцию в этих целях?
Спасибо за помощь!
Изменено: БМВ - 02.12.2022 07:36:17
 
Цитата
Михаил написал:
=MaskCompare(ActiveCell.Value;"##-##";1)
Вы должны вместо ActiveCell.Value указывать ссылку на конкретную ячейку. Как в простой формуле. Что-то вроде:
Код
=MaskCompare(A1;"##-##";1)

где А1 - это адрес ячейки с проверкой данных. При этом проверка все равно может ругнуться, т.к. не рассчитана на UDF. Тогда придется сначала создать именованный диапазон с именем, скажем "маска", а в проверке данных выбрать Любой и вбить: =маска.
Хотя и здесь я бы не сильно рассчитывал - проверка данных и УФ не очень дружат с UDF в принципе и даже если отработает в тестовом режиме, в боевой ситуации могут дать сбой.
Изменено: Дмитрий(The_Prist) Щербаков - 01.12.2022 11:12:52
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
Вы должны вместо ActiveCell.Value указывать ссылку на конкретную ячейку.
Спасибо за отклик!
По поводу ссылки на ячейку: в варианте без ссылки (=MaskCompare("33-44";"##-##";1)) - ошибка та же
Цитата
написал:
придется сначала создать именованный диапазон с именем, скажем "маска",
Не понял: какое значение у именованного диапазона?
Цитата
написал:
в проверке данных выбрать Любой и вбить: =маска.
Видимо, имеется ввиду выбор типа данных "Другой"?
 
Цитата
Михаил написал:
какое значение у именованного диапазона?
Ваша UDF. Что-то типа того:
Код
=MaskCompare(A1;"##-##";1)

Но повторюсь: это тоже может не сработать. Ошибки не будет, но и не факт, что станет вычисляться при вводе данных.
Цитата
Михаил написал:
имеется ввиду выбор типа данных "Другой"
да, именно он. Думал про Другой, написал Любой :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
Но повторюсь: это тоже может не сработать.
Похоже на то, что UDF для проверки данных использовать все-же нельзя.
Не нахожу в Excel достаточно мощного средства для проверки вводимых данных..
 
Цитата
написал:
Не нахожу в Excel ... для проверки вводимых данных..
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) = "A1" Then
        If MaskCompare(Target.Value, "##-##", 1) = False Then
            MsgBox "Введённое значение неверно.", vbCritical
        
            Application.EnableEvents = False
            Application.Undo
            Application.EnableEvents = True
        End If
    End If
End Sub
 
Цитата
Михаил написал:
достаточно мощного средства
тут все зависит от ситуации и навыков. Самое мощное - это заставить вводить данные через пользовательскую форму. Там можно любые ситуации обыграть, да еще и ввод будет только в нужные ячейки и в нужном формате.
Знаете самую большую проблему проверки данных? Можно скопировать любую ячейку из другой книги или листа и спокойно вставить вместо Вашей проверки данных. Все, проверку обошли :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Интересно, если UDF будет возвращать диапазон. Лень проверять
 
Цитата
Михаил написал:
Не нахожу в Excel достаточно мощного средства для проверки вводимых данных
UserForm - специальный инструмент для общения макроса с пользователем
результат работы которого: вы получили от пользователя то, что от него требовалось, а если нет - то никакие данные не приняты вообще
Изменено: Ігор Гончаренко - 01.12.2022 16:47:48
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо всем за советы.
Сходу не получилось - нужно будет подучиться..
 
Если Вы хотите воспользоваться пользовательской функцией для проверки значений, то есть обходной путь. Запишите, например, в (скрытую) ячейку G1 Вашу формулу:
Код
=MaskCompare(A1;"##-##";1)

а в условие проверки для ячейки A1 запишите формулу:
Код
=G1
Владимир
 
Цитата
написал:
Если Вы хотите воспользоваться пользовательской функцией для проверки значений, то есть обходной путь.
Спасибо! Это действительно работает
 
Подробное описание удовлетворительного решения нашел здесь:

https://mister-office.ru/formuly-excel/data-validation-regex.html
Страницы: 1
Наверх