2

У меня есть рабочий макрос VB, который проверяет содержимое. Он принимает два строковых параметра (значение ячейки и регулярное выражение) и возвращает либо True, либо False. Он использует CreateObject("VBscript.regexp") внутреннего использования.

Мне нужно использовать этот макрос для проверки ячейки. Когда я пытаюсь установить его в качестве пользовательского валидатора путь

=Rex(E2, "\d{1,2}\:\d{2}")

где Rex - это моя функция, определенная на той же электронной таблице (Alt-F11 и тип), а E2 - это ячейка, которую я пытаюсь проверить, я получаю сообщение "Указанный вами именованный диапазон не найден".

Если я вставлю ту же функцию в другом месте в той же таблице (скажем, в верхнем углу ячейки A1):

=Rex(E2, "\d{1,2}\:\d{2}")

Это показывает, что мне приятно TRUE если ячейка E2 исправляет правильное значение, например 15:07 и FALSE если ей не нравится 15xx - половина решена, но на самом деле не до конца. Мне действительно нужно интегрировать мой валидатор стандартным способом.

Я использую MS Excel 2010. Сам макрос

Public Function Rex(ByVal vsStringIn As String, ByVal vsPattern As String) As Boolean
    Dim objRegEx As Object
    Set objRegEx = CreateObject("VBscript.regexp")

    objRegEx.Global = True
    objRegEx.Pattern = vsPattern

    Rex = objRegEx.Test(vsStringIn)
    Set objRegEx = Nothing
End Function

И проблема выглядит

Проблема с валидатором MS Excel

2 ответа2

1

Интересная проблема. Похоже, UDF не всегда работают при проверке данных! :-(

Следующие альтернативы:

  • Вместо этого используйте условное форматирование и просто выделите любое неправильное значение
  • Используйте обычную формулу Excel вместо регулярного выражения, чтобы выполнить проверку. В твоем случае,
    = ЕСЛИОШИБКА (ЕСЛИ (ПОИСК (":", D3), И (ЕЧИСЛО (ЗНАЧЕНИЕ (ЛЕВЫЙ (D3, ПОИСК (":", D3)-1))), ЕЧИСЛО (ЗНАЧЕНИЕ (ПРАВЫЙ (D3, LEN (D3)-Search (":", D3))))), FALSE), FALSE)
    сделаю работу. Не красиво, но хотя бы функционально! ;-)

Примечание: ни ваша UDF, ни приведенная выше формула не будут работать, если проверяемое значение является числом (с форматом времени), а не строкой!

0

Я знаю, что это старый вопрос, но я не хочу дублировать вопрос.

Решение. Вы можете применить формулу UDF в другой ячейке, а затем использовать это значение при проверке данных. Вы можете скрыть временное значение, просто изменив цвет на белый.

Для получения дополнительной информации:http://support.microsoft.com/kb/160523

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .