Страницы: 1
RSS
Проверка значения по маске
 
Господа, добрый день.

Подскажите как можно сделать. Есть список масок номеров
Пример:
999FFA3211Категория 2
999FFACCG2Категория 3
Есть список номеров:
9993340012
9991143211
Мне нужно по номеру понять к какой категории он относится исходя из тех масок, что есть
т.е. первый номер это категория 3
Второй номер это категория 2

Есть ли решение без VBA?
 
а давайте пока без VBA и всего остального, а простыми словами
1. какие есть маски?
2. по каким соображениям тот или иной номер относится к той или иной маске
3. что в маске 999FFACCG2 делает буква G?
Изменено: Ігор Гончаренко - 14.06.2019 17:36:58
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код
=ЕСЛИ(ПРАВСИМВ(G2;4)="2332";"Категория 1";ЕСЛИ(ПРАВСИМВ(G2;4)="3211";"Категория 2";"Категория 3"))
 
Предполагаю, что такая массивная формула поможет:
Код
=ИНДЕКС(B$2:B$4;ПОИСКПОЗ(МАКС(СТРОКА($1:$3)+МУМНОЖ(Ч(ПСТР(G2;СТОЛБЕЦ(A:J);1)=ПСТР($A$2:$A$4;СТОЛБЕЦ(A:J);1));СТРОКА(1:10)^0));СТРОКА($1:$3)+МУМНОЖ(Ч(ПСТР(G2;СТОЛБЕЦ(A:J);1)=ПСТР($A$2:$A$4;СТОЛБЕЦ(A:J);1));СТРОКА(1:10)^0);))
 
Код
if (M and D) = D them MsgBox "число D соответствует маске M"

маске 11, будут соотв. 7 чисел: 1, 2, 3, 8, 9, 10, 11

Изменено: Ігор Гончаренко - 14.06.2019 16:13:57
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
1. какие есть маски?
Их очень много.

И вариации разные, чуть ли не 999AAAAAAA

Цитата
Ігор Гончаренко написал:
2. по каким соображениям тот или иной номер относится к той или иной маске
Под буквой может быть любая цифра, но если буква в маске повторяется тогда там дублируется и цифра

т.е. Маска 999AAA0000
Под нее подходят такие номера 9990000000, 9991110000, 9992220000, 9993330000 и тд

Маска 999AEA0000
Под нее подходят такие номер 9991210000, 9992129999, 9991319999, 9996460000 и тд

Цитата
Ігор Гончаренко написал:
3. что в маске 999FFACCG2 делает буква G?
Не могу дать ответ. В источнике как я понял вообще рандомные буквы, но самое главное что быква хранит число от 0 до 9

Вот еще пару примеров из источника: 99900CCEEE, 999A23456A, 999ABBAAAB и тд
 
Цитата
Светлый написал:
Предполагаю, что такая массивная формула поможет:
И правда, на примере работает.
Буду разбирать как она работает

Позже потестирирую на исходнике. Спасибо большое

Если не сложно, Вы можете разбить формулу с пояснениями?
 
существующие маски преобразовать в маски RegExp, наример во такой функцией;
Код
Function RegExPatt$(s$)
  Dim i, d, n, p$, ch$
  Set d = CreateObject("Scripting.Dictionary")
  For i = 1 To Len(s)
    ch = Mid(s, i, 1)
    If ch > "9" Then
      If d.exists(ch) Then p = p & "\" & d(ch) Else n = n + 1: d(ch) = n: p = p & "(\d)"
    Else
      p = p & ch
    End If
  Next
  RegExPatt = p
End Function
999FFA3211преобразуется в: 999(\d)\1(\d)3211
999FFACCG2 соответственно в: 999(\d)\1(\d)(\d)\3(\d)2
а потом с помощью RegExp протестировать совпадает число с полученной маской или нет
Код
Sub TestM()
  Dim re
  Set re = CreateObject("VBScript.RegExp")
  re.Pattern = "999(\d)\1(\d)3211" ' с этим маской получим Ложь, Истина, а с маской 999(\d)\1(\d)(\d)\3(\d)2 - наоборот Истина, Ложь
  msgbox re.test("9993340012")
  msgbox re.test("9991143211")
End Sub
Изменено: Ігор Гончаренко - 14.06.2019 18:07:34
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Александр написал:
Вы можете разбить формулу с пояснениями?
Число посимвольно сравнивается со всеми масками. Для каждой маски подсчитывается число совпадений. Выбирается маска, для которой это число больше. При равенстве значений выбирается более нижнее.
При большем количестве масок формула работать не будет. Хотя, если маски проранжировать, решения будут лучше.
И формула не учитывает одинаковость цифр под одинаковыми буквами. Примеров мало, протестировать трудно.
Немного модифицировал:
Код
=ИНДЕКС(B$2:B$4;ОСТАТ(МАКС(СТРОКА($1:$3)+МУМНОЖ(100*(ПСТР(G2;СТОЛБЕЦ(A:J);1)=ПСТР($A$2:$A$4;СТОЛБЕЦ(A:J);1));СТРОКА(1:10)^0));100))
 
в моем решении маске 999FFA3211
будут соответсвовать как 9992213211 так и 9992223211, а должно так быть или нет - не знаю((
понятно что на месте А должна цифра, не понятно может она быть равна той, что под F или нет.
если нужно, чтобы за разными буквами "прятались" обязательно разные цифры - это тоже можно устроить
Изменено: Ігор Гончаренко - 14.06.2019 18:40:12
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Докрутил формулу до сопоставления цифр под буквенными масками. Под каждой буквой строго соответствующая цифра. Но, если левее букв будут те же цифры, то совпадение покажет неполное и покажет заголовок столбца шаблонов.  Если совпали все цифры и цифры под буквами шаблона уникальны и соответствуют, то покажет совпадающий шаблон.
Код
=ИНДЕКС(B:B;МАКС((МУМНОЖ((ПОИСК(ЕСЛИ(ЕОШ(-ПСТР(A$2:A$4;СТОЛБЕЦ(A:J);1));ПСТР(G2;СТОЛБЕЦ(A:J);1);"");" "&G2;1)=ПОИСК(ЕСЛИ(ЕОШ(-ПСТР(A$2:A$4;СТОЛБЕЦ(A:J);1));ПСТР(A$2:A$4;СТОЛБЕЦ(A:J);1);"");" "&A$2:A$4))*ЕСЛИ(ЕОШ(-ПСТР(A$2:A$4;СТОЛБЕЦ(A:J);1));1;ПСТР(G2;СТОЛБЕЦ(A:J);1)=ПСТР(A$2:A$4;СТОЛБЕЦ(A:J);1));СТРОКА(1:10)^0)=10)*СТРОКА($2:$4)))
Страницы: 1
Наверх