Новости:

Теперь на форум можно залогиниться / зарегистрироваться с помощью ВКонтакте. Уже существующие пользователи могут связать свою учетную запись с аккаунтом ВКонтакте одним кликом в профиле пользователя http://forum.msexcel.ru/index.php?action=profile;area=account

Главное меню

Структура текстовой строки - цифры, буквы, символы

Автор runner, 29.07.2016, 10:51

« назад - далее »

runner

Всем хорошей пятницы! :)
Работаю с большими списками артикулов (автозапчасти). Иногда они поступают без привязки к производителю, что очень неудобно. У большинства производителей артикулы формируются и записываются в своём формате (количество знаков, количество и расположение пробелов, наличие букв и символов). Задача была - разбить список по структурным группам, для дальнейшей, более удобной привязки к производителю.
В процессе решения бонусом пришла проверка на наличие кириллицы.
Задача решена, но решение мне не нравится – слишком громоздкое, хотя и упихал в одну ячейку.
Создаётся сцеплением модулей проверяющих последовательно каждый знак в ячейке. Меня хватило на 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) ), но тут формула оказалась ещё более громоздкой.

Есть ли какое-то более компактное и гибкое решение?

IKor

Я посмотрел на размер формулы, и пришла мне в голову мысль о том, что 16 символов - это всего 16 колонок с короткой однотипной формулой (которую можно свернуть в именованную) + еще одна колонка с формулой СЦЕПИТЬ()...

runner

Обойтись бы без дополнительных колонок - символов может быть значительно больше. Причём этот инструмент хотелось бы использовать и для сравнения текстовых строк на "похожесть". А так - до трёх десятков знаков, именованная универсальная формула,опирающаяся на номер столбца, и общая сцепляющая - могут быть удобны. По сравнению с имеющимся - решение чуть более гибкое в плане редактирования под конкретную задачу, но лишние столбцы ... :/

cheshiki1


runner

#4
Это та, которая "именованная"?
Наверное, да, если не будет зависеть от количества знаков в ячейке или будет легко корректируема.

Я ещё так доработал:
=B1&ЕСЛИОШИБКА(ЕСЛИ(И(КОДСИМВ(ПСТР($A1;СТОЛБЕЦ()-2;1))>47;КОДСИМВ(ПСТР($A1;СТОЛБЕЦ()-2;1))<58);"!";ЕСЛИ(И(КОДСИМВ(ПСТР($A1;СТОЛБЕЦ()-2;1))>64;КОДСИМВ(ПСТР($A1;СТОЛБЕЦ()-2;1))<123);"@";ПСТР($A1;СТОЛБЕЦ()-2;1)));"")

Столбец A - артикулы,
Столбец B - пустой(обязательно)
Столбец C - формула, протягивается вправо на количество столбцов соответствующее максимальной длине строки в столбце A.
Самый правый столбец будет результатом.

cheshiki1

#5
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


runner

Цитата: cheshiki1 от 01.08.2016, 08:39
Function Замена_цифр_и_латиницы

Оба варианта отлично работают!
Спасибо!
+1