Понадобилось мне тут недавно найти номер вагона в произвольном тексте. Как-то, не особо раздумывая (как всегда, все нужно было сделать еще вчера), написался монстр в 343 символа. В общем, задачка понравилась. Потому сюда и кладу.
Условия: В ячейке с текстом может быть только одно "слово", состоящее из 8-и цифр. Его-то и нужно вытащить. Остальные слова или не из 8-и цифр, или там есть еще и буквы. Текст может быть произвольный с любыми буквами, цифрами, знаками и их сочетаниями. Единственное ограничение - в ячейке не могут быть только цифры. Для 2007.
Понадобилось мне тут недавно найти номер вагона в произвольном тексте. Как-то, не особо раздумывая (как всегда, все нужно было сделать еще вчера), написался монстр в 343 символа. В общем, задачка понравилась. Потому сюда и кладу.
Условия: В ячейке с текстом может быть только одно "слово", состоящее из 8-и цифр. Его-то и нужно вытащить. Остальные слова или не из 8-и цифр, или там есть еще и буквы. Текст может быть произвольный с любыми буквами, цифрами, знаками и их сочетаниями. Единственное ограничение - в ячейке не могут быть только цифры. Для 2007._Boroda_
Поразумевается, что слово - это то что отделено пробелами? разделители: точки, запятые и др. не применяются? (хотя в примере перенос строки - является разделителем)
Поразумевается, что слово - это то что отделено пробелами? разделители: точки, запятые и др. не применяются? (хотя в примере перенос строки - является разделителем)MCH
Function Num8$(ByVal txt$) Dim i&, m$, s$ txt = txt & " " For i = 1 To Len(txt) m = Mid$(txt, i, 1) If m Like "[A-Za-zА-Яа-яЁё0-9]" Then s = s & m Else If s Like "########" Then Num8 = s: Exit Function s = "" End If Next End Function
[/vba]
Вне конкурса, UDF: [vba]
Код
Function Num8$(ByVal txt$) Dim i&, m$, s$ txt = txt & " " For i = 1 To Len(txt) m = Mid$(txt, i, 1) If m Like "[A-Za-zА-Яа-яЁё0-9]" Then s = s & m Else If s Like "########" Then Num8 = s: Exit Function s = "" End If Next End Function
У Михаила очень хорошая формула получилась. По сути, очень похожа на моего монстра, но я многое не "ужал", а он очень хорошо написал, мне понравилось. Нужно будет на работе показать и сказать при этом что-то типа того, что когда стоите у меня за спиной и подгоняете, то вот так получается, а когда даете спокойно подумать, то вот так. Михаил, показывай. Судя по всему, вариантов больше не будет. И, конечно, в репу получай.
У Михаила очень хорошая формула получилась. По сути, очень похожа на моего монстра, но я многое не "ужал", а он очень хорошо написал, мне понравилось. Нужно будет на работе показать и сказать при этом что-то типа того, что когда стоите у меня за спиной и подгоняете, то вот так получается, а когда даете спокойно подумать, то вот так. Михаил, показывай. Судя по всему, вариантов больше не будет. И, конечно, в репу получай._Boroda_
Если задача кажется сложной, то предлагаю решить вначале часть задачи. Как проверить что в ячейке A1 находится восьмизначное число? нужно чтобы формула возвращала ИСТИНА, если в A1 восьмизначное число и ЛОЖЬ в других случаях (дробное, семизначное, девятизначное, ноль, отрицательное, текст, дата и т.п.)
Есть вариант в 35 знаков (с "=")
Если задача кажется сложной, то предлагаю решить вначале часть задачи. Как проверить что в ячейке A1 находится восьмизначное число? нужно чтобы формула возвращала ИСТИНА, если в A1 восьмизначное число и ЛОЖЬ в других случаях (дробное, семизначное, девятизначное, ноль, отрицательное, текст, дата и т.п.)
Renat_excel, по вашей формуле: Работает только в 2007 и выше Не извлекает 10000000 (легко правится) не извлекает номера начинающиеся с нулей например, "00000001", но в условиях об этом не сказано, нужно извлекать или нет если есть два восьмизначных числа, то извлекает их сумму, в условиях тоже не сказано бывают такие ситуации или нет Если в конце текста будет слово "2e7" или "3e7" или в тексте будет слово 3,1416e7, то вернет 20000000, 30000000, 31416000 соответственно (маловероятно для данной задачи)
Длинновато получилось, для КОДСИМВ(), например, не нужен ЛЕВСИМВ(), он и так вернет код первой буквы
Renat_excel, по вашей формуле: Работает только в 2007 и выше Не извлекает 10000000 (легко правится) не извлекает номера начинающиеся с нулей например, "00000001", но в условиях об этом не сказано, нужно извлекать или нет если есть два восьмизначных числа, то извлекает их сумму, в условиях тоже не сказано бывают такие ситуации или нет Если в конце текста будет слово "2e7" или "3e7" или в тексте будет слово 3,1416e7, то вернет 20000000, 30000000, 31416000 соответственно (маловероятно для данной задачи)
Длинновато получилось, для КОДСИМВ(), например, не нужен ЛЕВСИМВ(), он и так вернет код первой буквыMCH
Глядя на Серегины решения, сваял формулу тоже с нарушением всех правил На 108 знаков Подробно не тестировал (времени особо нет), но на вложении отрабатывает правильно
Хотя пожалуй вообще формула правильная. Попробовал все возможные позиции расположения искомого - работает верно. Пробовал менять местами время и искомое - тоже правильно. Короче вечером еще потестирую, потом напишу
Нашел одну недоработку. Исправил - 126 знаков (если предположить что номер вагона может быть действительно из любых сочетаний цифр, например даже такой "00000000")
Глядя на Серегины решения, сваял формулу тоже с нарушением всех правил На 108 знаков Подробно не тестировал (времени особо нет), но на вложении отрабатывает правильно
Хотя пожалуй вообще формула правильная. Попробовал все возможные позиции расположения искомого - работает верно. Пробовал менять местами время и искомое - тоже правильно. Короче вечером еще потестирую, потом напишу
Нашел одну недоработку. Исправил - 126 знаков (если предположить что номер вагона может быть действительно из любых сочетаний цифр, например даже такой "00000000")Serge_007