Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2012, 10:17   #1
jar76
Пользователь
 
Регистрация: 05.01.2009
Сообщений: 19
По умолчанию Проверка текста по маске

Подскажите пожалуйста, как проверить значение ячейки по нескольким маскам?
Этот код
Function MaskCompare(txt As String, mask As String, CaseSensitive 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
после второй проверки через оператор "ИЛИ" после 3-й проверки выдает #ЗНАЧ
jar76 вне форума Ответить с цитированием
Старый 19.10.2012, 10:44   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

попробуйте так:
Код:
Function MaskCompare(Txt As String, Masks() As String, Optional CaseSensitive As Boolean = False) As Boolean
 If CaseSensitive Then
   Text = Txt
 Else
   Text = UCase(Txt)
 End If
 MaskCompare = False
 For Each Msk In Masks
   If (Txt Like Msk) Or ((Txt Like UCase(Msk)) And Not CaseSensitive) Then
     MaskCompare = True
     Exit For
   End If
 Next Msk
End Function
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 19.10.2012, 10:48   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Код:
=ИЛИ(MaskCompare(A1;"Маска1";0);MaskCompare(A1;"Маска2";0);MaskCompare(A1;"Маска3";0))
Лучше было бы функцию написать так, чтобы она принимала массив масок.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 19.10.2012, 11:09   #4
jar76
Пользователь
 
Регистрация: 05.01.2009
Сообщений: 19
По умолчанию

новый код вообще перестает работать
желательно как-то упростить формулу:
=ИЛИ(MaskCompare(B1450;$F$1439;0);( MaskCompare(B1450;$F$1440;0);(MaskC ompare(B1450;$F$1441;0);(MaskCompar e(B1450;$F$1442;0);(MaskCompare(B14 50;$F$1443;0);(MaskCompare(B1450;$F $1444;0);(MaskCompare(B1450;$F$1445 ;0);(MaskCompare(B1450;$F$1446;0);( MaskCompare(B1450;$F$1447;0);(MaskC ompare(B1450;$F$1448;0);(MaskCompar e(B1450;$F$1449;0);(MaskCompare(B14 50;$F$1450;0);(MaskCompare(B1450;$F $1451;0);(MaskCompare(B1450;$F$1452 ;0);(MaskCompare(B1450;$F$1453;0);( MaskCompare(B1450;$F$1454;0);(MaskC ompare(B1450;$F$1455;0))))))))))))) )))))

первый код почему-то работает только до второй маски
jar76 вне форума Ответить с цитированием
Старый 19.10.2012, 11:18   #5
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
новый код вообще перестает работать
Ну так сразу писать нужно, как вы планируете это использовать:
Код:
Public Function MaskCompare(Txt As String, Masks As Range, Optional CaseSensitive As Boolean = False) As Boolean
 If CaseSensitive Then
   Text = Txt
 Else
   Text = UCase(Txt)
 End If
 MaskCompare = False
 For Each Msk In Masks.Columns(1).Cells
   If (Txt Like Msk) Or ((Txt Like UCase(Msk)) And Not CaseSensitive) Then
     MaskCompare = True
     Exit For
   End If
 Next Msk
End Function
вот этот вариант должен работать в формулах (не проверял)

upd.
проверил - работает нормально
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 19.10.2012 в 11:26.
DiemonStar вне форума Ответить с цитированием
Старый 19.10.2012, 11:26   #6
jar76
Пользователь
 
Регистрация: 05.01.2009
Сообщений: 19
По умолчанию

спасибо DimonStar все работает,
простите за наглость как сделать что бы вместо: =ИЛИ(MaskCompare(B1440;$F$1439;0);M askCompare(B1440;$F$1440;0);MaskCom pare(B1440;$F$1441;0);MaskCompare.. ...

сразу была ссылка на диапазон значений маски?
jar76 вне форума Ответить с цитированием
Старый 19.10.2012, 11:28   #7
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Сообщение от jar76 Посмотреть сообщение
спасибо DimonStar все работает,
простите за наглость как сделать что бы вместо: =ИЛИ(MaskCompare(B1440;$F$1439;0);M askCompare(B1440;$F$1440;0);MaskCom pare(B1440;$F$1441;0);MaskCompare.. ...

сразу была ссылка на диапазон значений маски?
я делаю так:
Код:
=MaskCompare(A3;C1:C5)
где C1:C5 - диапазон содержащий маски
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 19.10.2012 в 11:33.
DiemonStar вне форума Ответить с цитированием
Старый 19.10.2012, 11:37   #8
jar76
Пользователь
 
Регистрация: 05.01.2009
Сообщений: 19
По умолчанию

супер, огромное спасибо!
jar76 вне форума Ответить с цитированием
Старый 19.10.2012, 12:01   #9
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Ошибку нашёл у себя:

Код:
Public Function MaskCompare(Txt As String, Masks As Range, Optional CaseSensitive As Boolean = False) As Boolean
 If CaseSensitive Then
   Text = Txt
 Else
   Text = UCase(Txt)
 End If
 MaskCompare = False
 For Each Msk In Masks.Columns(1).Cells
   If (Text Like Msk) Or ((Text Like UCase(Msk)) And Not CaseSensitive) Then
     MaskCompare = True
     Exit For
   End If
 Next Msk
End Function
без правки неверно работает сравнение по регистрам.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 19.10.2012 в 12:03.
DiemonStar вне форума Ответить с цитированием
Старый 25.10.2012, 09:54   #10
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
Ошибку нашёл у себя:

Код:
Public Function MaskCompare(Txt As String, Masks As Range, Optional CaseSensitive As Boolean = False) As Boolean
 If CaseSensitive Then
   Text = Txt
 Else
   Text = UCase(Txt)
 End If
 MaskCompare = False
 For Each Msk In Masks.Columns(1).Cells
   If (Text Like Msk) Or ((Text Like UCase(Msk)) And Not CaseSensitive) Then
     MaskCompare = True
     Exit For
   End If
 Next Msk
End Function
без правки неверно работает сравнение по регистрам.
а что это функция вообще делает? для чего ее можно использовать?
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка текста на плагиат spamer Общие вопросы по программированию, компьютерный форум 5 19.09.2012 22:17
Проверка текста в Edit misher Общие вопросы Delphi 15 02.10.2010 13:17
Проверка текста в webbrowser nenoob1 Работа с сетью в Delphi 3 07.08.2010 02:17
Проверка текста Babyshka Помощь студентам 3 11.03.2010 20:00
Поиск текста по маске WinApi Помощь студентам 6 27.12.2009 01:17