Всем хорошей пятницы! :)
Работаю с большими списками артикулов (автозапчасти). Иногда они поступают без привязки к производителю, что очень неудобно. У большинства производителей артикулы формируются и записываются в своём формате (количество знаков, количество и расположение пробелов, наличие букв и символов). Задача была - разбить список по структурным группам, для дальнейшей, более удобной привязки к производителю.
В процессе решения бонусом пришла проверка на наличие кириллицы.
Задача решена, но решение мне не нравится – слишком громоздкое, хотя и упихал в одну ячейку.
Создаётся сцеплением модулей проверяющих последовательно каждый знак в ячейке. Меня хватило на 16 шагов.
Модуль на первый знак:
=ЕСЛИОШИБКА(ЕСЛИ(И(КОДСИМВ(ПСТР(A1;1;1))>47;КОДСИМВ(ПСТР(A1;1;1))<58);"!";ЕСЛИ(И(КОДСИМВ(ПСТР(A1;1;1))>64;КОДСИМВ(ПСТР(A1;1;1))<123);"@";ПСТР(A1;1;1)));"")
Примеривался к использованию ПОИСКПОЗ по массиву (примерно так -ПОИСКПОЗ(КОДСИМВ(ПСТР(A2;2;1));{48;49;50;51;52;53;54;55;56;57};0) ), но тут формула оказалась ещё более громоздкой.
Есть ли какое-то более компактное и гибкое решение?
Я посмотрел на размер формулы, и пришла мне в голову мысль о том, что 16 символов - это всего 16 колонок с короткой однотипной формулой (которую можно свернуть в именованную) + еще одна колонка с формулой СЦЕПИТЬ()...
Обойтись бы без дополнительных колонок - символов может быть значительно больше. Причём этот инструмент хотелось бы использовать и для сравнения текстовых строк на "похожесть". А так - до трёх десятков знаков, именованная универсальная формула,опирающаяся на номер столбца, и общая сцепляющая - могут быть удобны. По сравнению с имеющимся - решение чуть более гибкое в плане редактирования под конкретную задачу, но лишние столбцы ... :/
UDF (пользовательская ф-ция) подойдет?
Это та, которая "именованная"?
Наверное, да, если не будет зависеть от количества знаков в ячейке или будет легко корректируема.
Я ещё так доработал:
=B1&ЕСЛИОШИБКА(ЕСЛИ(И(КОДСИМВ(ПСТР($A1;СТОЛБЕЦ()-2;1))>47;КОДСИМВ(ПСТР($A1;СТОЛБЕЦ()-2;1))<58);"!";ЕСЛИ(И(КОДСИМВ(ПСТР($A1;СТОЛБЕЦ()-2;1))>64;КОДСИМВ(ПСТР($A1;СТОЛБЕЦ()-2;1))<123);"@";ПСТР($A1;СТОЛБЕЦ()-2;1)));"")
Столбец A - артикулы,
Столбец B - пустой(обязательно)
Столбец C - формула, протягивается вправо на количество столбцов соответствующее максимальной длине строки в столбце A.
Самый правый столбец будет результатом.
Function Замена_цифр_и_латиницы(ячейка As Range) As String
Dim i#
Замена_цифр_и_латиницы = ячейка.Value
'в цикле заменяем цифры на символ "!"
For i = 0 To 9
Замена_цифр_и_латиницы = Replace(Замена_цифр_и_латиницы, i, "!")
Next
'в цикле заменяем прописные латинские буквы (символ 65-90) на символ "@"
' если нужны еще и строчные нужно добавить цикл 97-122
For i = 65 To 90
Замена_цифр_и_латиницы = Replace(Замена_цифр_и_латиницы, Chr(i), "@")
Next
End Function
вариант через регулярки
Function tt$(text As String)
With CreateObject("VBScript.Regexp")
.Ignorecase = True
.Global = True
.MultiLine = True
.Pattern = "[A-Za-z]"
tt = .Replace(text, "@")
.Pattern = "[0-9]"
tt = .Replace(tt, "!")
End With
End Function
Цитата: cheshiki1 от 01.08.2016, 08:39
Function Замена_цифр_и_латиницы
Оба варианта отлично работают!
Спасибо!
+1