Подскажите как изящно с использоваанием формул, но без VBA убрать из маски формата AУУ00012B нули перед значащими цифрами? Т.е. с помощью формулы получить AУУ12 из AУУ00012B (последний символ тоже желательно отсечь).
Все чуть усложняется тем, что маска может быть как AУУ00012B, так и AУУУ0013B (один лишний символ У иногда меняется на дополнительный ноль перед значащими цифрами чтобы общее кол-во символов в номере не менялось). Пока в голову приходят только громоздкие конструкции, отрезать последнюю букву справа, потом через REPLACE, избавиться от первых трех-четырех буквенных символов, и уже в конце работать с остатком вида 000012 переводя его в числовой формат, чтобы избавиться от незначащих нулей.
Спасибо, это выглядит более изящно чем у меня получалось (с введением промежуточных столбцов).
Я уже даже начал думать насчет регулярных выражений. Это в принципе VBA, который я не хотел вмешивать, но с другой стороны там особого умения писать код не требуется, достаточно вставить модуль с функцией RegExpExtract если верить статье здесь https://www.planetaexcel.ru/techniques/7/4844/, а дальше работать с ней как с обычной формулой. Правда никогда в экселе регулярными выражениями не пользовался, да и вообще много-много лет назад последний раз с ними сталкивался, но научиться никогда не поздно.
Algench написал: отрезать последнюю букву справа, потом через REPLACE, избавиться от первых трех-четырех буквенных символов, и уже в конце работать с остатком вида 000012 переводя его в числовой формат, чтобы избавиться от незначащих нулей.
Примерно так и сделал =ЛЕВБ(A1;ПОИСК(0;A1)-1)&--ПСТР(ЛЕВБ(A1;ДЛСТР(A1)-1);ПОИСК(0;A1);9)
Добавлено Павел, прям клоны получились))) Я не подглядывал)))
если впереди всегда 3/4 буквы не проще просто преобразовать в число с 4-ой позиции, а при ошибке с 5-ой? =ЕСЛИОШИБКА(ЛЕВБ(A1;3)&(--ПСТР(A1;4;ДЛСТР(A1)-4));ЛЕВБ(A1;4)&(--ПСТР(A1;5;ДЛСТР(A1)-5)))
точнее достаточно 4-й символ проверять. =ЛЕВБ(A1;3)&ЕСЛИОШИБКА(--ПСТР(A1;4;1);ПСТР(A1;4;1))&(--ПСТР(A1;5;ДЛСТР(A1)-5))
в примере надо первые 3 брать ) ... если "незначащих нулей" нет: =ЛЕВБ(A1;3)&--ПСТР(ЛЕВБ(A1;ДЛСТР(A1)-1);ПОИСКПОЗ(1=1;ИНДЕКС(ЕЧИСЛО(-ПСТР(A1;{1;2;3;4;5;6;7;8;9};1));););99)
Alex написал: =LET(_txt_base;A1;_txt1;ЕСЛИОШИБКА(ПСТР(_txt_base;1;ПОИСКПОЗ(1;--(ПСТР(_txt_base;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(_txt_base)));1)="0");0)-1);_txt_base);_txt2;ПСТР(ПРАВСИМВ(_txt_base;ДЛСТР(_txt_base)-ДЛСТР(_txt1));ЕСЛИ(СУММПРОИЗВ(--(ЕСЛИОШИБКА(ПОИСК({0;1;2;3;4;5;6;7;8;9};_txt1);0)>0))>0;1;ПОИСКПОЗ(1;--(ПСТР(ПРАВСИМВ(_txt_base;ДЛСТР(_txt_base)-ДЛСТР(_txt1));СТРОКА(ДВССЫЛ("1:"&ДЛСТР(_txt_base)));1)<>"0");0));ДЛСТР(_txt_base));_txt_result;_txt1&_txt2;ЛЕВСИМВ(_txt_result;ДЛСТР(_txt_result)-1))
Я боюсь даже не смог понять что здесь написано После перевода на английскую версию экселя у меня эта формула не отработала, и даже не знаю, причина в том что мне онлайн транслятор формулу перевел неправильно, или в том что у меня эксель 2016, а не 2021
Algench написал: в одном месте ДЛСТР(A1)-1 на конкретное число заменил
Получается, что код всегда состоит из девяти символов? Тогда все проще: =ПОДСТАВИТЬ(ЛЕВБ(A1;4);0;)&--ПСТР(A1;5;4) Или так: =ТЕКСТ(ПСТР(A1;5;4);ЛЕВБ(A1;4)&"#") Но ТЕКСТ в таком виде не будет корректно работать, если есть буквы ГМДЧС
с последней формулой в моем предыдущем сообщении я канеш поспешил, так правильно нужно было 4-й символ проверять. =ЛЕВБ(A1;3)&ПСТР(A1;4;ПСТР(A1;4;1)<>"0")&--ПСТР(A1;5;4) Но у _Boroda_ последнее сильно изящнее
написал: Получается, что код всегда состоит из девяти символов? Тогда все проще:
Не совсем. Код может быть разным, но значащая часть, которую надо вытащить состоит из 9 символов. Условно говоря может быть так
AУУ0101200B
AУУУ001300B
а может так
AУУ0000001B-020-R45FFI-00
AУУУ000002B-020-R01FJF-00
или даже когда-нибудь так
AУУ0999998B-020-R9ORJL-00
AУУУ999999B-020-R50KJI-00
При этом маска первых11 символов всегда одна и та же, а первый и последний символ служебные и к номеру как к таковому отношения не имеют (я их обрезаю).
Цитата
написал: Но ТЕКСТ в таком виде не будет корректно работать, если есть буквы ГМДЧС
Увы, буква М будет. Но вот этот короткий вариант =ПОДСТАВИТЬ(ЛЕВБ(A1;4);0;)&--ПСТР(A1;5;6) великолепен. Ровно то что надо. Коротко и красиво!
Вот итоговый вариант, который меня на 100% устраивает =SUBSTITUTE(MID(A1;2;3);0;)&--MID(A1;5;6)