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

Имеется номенклатурный список из названия и характеристик. Характеристика номенклатуры начинается с цифры, необходимо разделить на два отдельных столбца.
Не могли бы подсказать, как найти позицию первой цифры в ячейке желательно с разбором формулы.

Вариант =ЕСЛИОШИБКА(ПОИСК(0;[@Column2]);ЕСЛИОШИБКА(ПОИСК(1;[@Column2]);... не рассматриваю, хотелось бы узнать более простой вариант.

Благодарю
 
массивная
=MIN(IFERROR(FIND({0;1;2;3;4;5;6;7;8;9};[@Column2]
);1=0))
По вопросам из тем форума, личку не читаю.
 
Цитата
Kkim написал:
узнать более простой вариант.
лист в клеточку и ручка, что вы хотите чтоб мы вам предложили без файла примера какие у вас данные может у вас римские цифры
Лень двигатель прогресса, доказано!!!
 
Цитата
Сергей написал:
может у вас римские цифры
тогда еще проще. Там знаков меньше i,v,x,.. :-)
По вопросам из тем форума, личку не читаю.
 
Добавил пример

Можно решить данную задачу без использования формулы массива?
 
Kkim, а чем Вам формулы массива насолили?
=СЖПРОБЕЛЫ(ЛЕВСИМВ(B3;МИН(ПОИСК({0:1:2:3:4:5:6:7:8:9};B3&"0123456789"))-1))
=ПСТР(B3;МИН(ПОИСК({0:1:2:3:4:5:6:7:8:9};B3&"0123456789"));ДЛСТР(B3))
Изменено: Bema - 12.10.2018 08:50:04
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
аналог формулы БМВ,
Код
=МИН(ЕСЛИОШИБКА(ПОИСК(СТРОКА($1:$10)-1;B3);"Ё"))
Лень двигатель прогресса, доказано!!!
 
=СЖПРОБЕЛЫ(ЛЕВБ($B3;АГРЕГАТ(15;6;ПОИСК(СТРОКА(ДВССЫЛ("1:10"))-1;$B3);1)-1))
=ПРАВБ($B3;ДЛСТР($B3)-АГРЕГАТ(15;6;ПОИСК(СТРОКА(ДВССЫЛ("1:10"))-1;$B3);1)+1)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
для правой части
=REPLACE(B3;1;MIN(IFERROR(INDEX(FIND({0;1;2;3;4;5;6;7;8;9};B3););1=0))-1;"")
По вопросам из тем форума, личку не читаю.
 
массивная
=ПОИСКПОЗ(;1-ЕЧИСЛО(-ПСТР(B3;СТРОКА($1:$99);1));)
Изменено: Казанский - 12.10.2018 09:28:57
 
Немассивная
=ПСТР(B3;МИН(ПОИСК({1;2;3;4;5;6;7;8;9;0};B3&1234567890));9)
 
БМВ, vikttur, Казанский, JayBhagavan, Сергей, Bema, большое Вам спасибо.
Решил задачу.
Касательно формул массива, не особо хорошо в них разбираюсь и файл делаю для общего пользования и при редактировании не все используют при вводе CSE, что в свою очередь будет "ломать" файл.
Также хотел спросить, как работает логика ПОИСК({1;2;3;4;5;6;7;8;9;0}
Что дают значения в фигурных скобках, получается формула ищет каждое значение в строке?
 
Цитата
Kkim написал: как работает логика ПОИСК({1;2;3;4;5;6;7;8;9;0}
Так - не работает. Но если укажем, где искать...
Поиск каждого из значений массива констант. Получаем массив из позиций в строке. Если значения из массива констант нет в тексте, получим ошибку. Для избежания ошибки цепляем справа все числа: B3&1234567890
 
Цитата
Kkim написал:
Что дают значения в фигурных скобках
это указывает что внутри массив значений.
Цитата
Kkim написал:
получается формула ищет каждое значение в строке
да и выдает позицию в строке
Цитата
Kkim написал:
Касательно формул массива, не особо хорошо в них разбираюсь и файл делаю для общего пользования
В этом случае и для данного случая можно использовать АГРЕГАТ, но я б предпочел заменить им МИН но не использовать полностью вариант JayBhagavan и естесвенно при подходящей версии excel
=MID(B3;AGGREGATE(15;6;FIND({1;2;3;4;5;6;7;8;9;0};B3);1);9)
Или
=REPLACE(B3;1;AGGREGATE(15;6;FIND({1;2;3;4;5;6;7;8;9;0};B3);1)-1;"")

=MID(B3;AGGREGATE(15;6;FIND(ROW(1:10)-1;B3);1);9)
=REPLACE(B3;1;AGGREGATE(15;6;FIND(ROW(1:10)-1;B3);1)-1;"")
По вопросам из тем форума, личку не читаю.
 
Код
Function F_Numeric(ActiveCell)

Dim MyCell As String
Dim My_first_num As Long

My_first_num = 0
MyCell = ActiveCell
j = Len(MyCell)

For i = 1 To j
    If IsNumeric(Mid(MyCell, i, 1)) = True Then
        My_first_num = Mid(MyCell, i, 1)
        If IsNumeric(Mid(MyCell, i + 1, 1)) = True Then
            i2 = i
            j2 = 0
            Do
                i2 = i2 + 1
                j2 = j2 + 1
            Loop Until IsNumeric(Mid(MyCell, i2, 1)) = False
            My_first_num = Mid(MyCell, i, j2)
            Exit For
        End If
     Exit For
    End If
Next i

F_Numeric = My_first_num

End Function
Изменено: Андрей Сопилов - 12.10.2018 15:48:37
 
Андрей Сопилов, оформите код соответствующим тегом.
 
в дополнение к #15,вариант трёх UDF в столбцах E FG ,например ccc в столбце G
Код
Function ccc$(t$)
 With CreateObject("VBScript.RegExp"): .Pattern = "\D+"
  If .test(t) Then ccc = Trim(.Replace(t, ""))
 End With
End Function
Изменено: кузя1972 - 12.10.2018 15:18:43
 
Зачем писать код на VBA, если всё уже написано?
См. функцию автора сайта RegExpExtract().
https://www.planetaexcel.ru/techniques/7/4844/

Речь идет об использовании регулярных выражений. Это как раз тот случай. И вряд ли это сложно.
Итак, пишем в один столбец (справа) следующую формулу:
=RegExpExtract(СЖПРОБЕЛЫ(A2);"(^[^\d]+)|\d.*$")

и во второй столбец (еще правее; отличие в последнем аргументе, который говорит, какой элемент по порядку извлечь):
=RegExpExtract(СЖПРОБЕЛЫ(A2);"(^[^\d]+)|\d.*$";2)

Комментарий.
Текст находится в столбце A (ссылка на A2). Лишние пробелы удаляются.
Регулярное выражение
(^[^\d]+)|\d.*$
означает найти:
с начала строки ^ один или более символов, кроме цифр [^\d]+,
ИЛИ |
подстроку, начинающуюся с цифры (как Вы и просили) \d, и всё до конца строки .*$.

Регулярное выражение можно для наглядности занести в отдельную ячейку и сослаться на нее абсолютной ссылкой.

P.S. С учетом заметки от автора выше заменим [^\d]+ на \D+
(^\D+)|\d.*$
Изменено: eeigor - 12.10.2018 15:56:11
 
eeigor, в добавление к #18,тогда лучше использовать более эффективный вариант

 
Код
RegExpExtract(СЖПРОБЕЛЫ(B3);"(?:^[^\d]+)|\d.*$")
Изменено: кузя1972 - 12.10.2018 16:07:13
 
Да, это будет приемлемый вариант:
(?:^\D+)|\d.*$

При условиях автора заметки:
"Имеется номенклатурный список из названия и характеристик. Характеристика номенклатуры начинается с цифры..."
И если включение программного модуля с одной функцией не сильно усложнит задачу.
Автору заметки хотелось узнать более простой вариант. Вряд ли это совсем уж просто. Правда, позволяет использовать, не вникая: бери "как есть".
В таблицу данных с именем "Таблица1" надо вставить свои данные и заполнить все ячейки одной и той же формулой.

В файле на первом листе готовый пример с одной формулой для всех ячеек:
=RegExpExtract(СЖПРОБЕЛЫ(Таблица1[Исходник]);R1C2;R1C)

P.S. Как ни странно, и так работает:
\D+|\d.*
но с ограничителями строки в начале и в конце, кажется, должно работать быстрее:
^\D+|\d.*$
Изменено: eeigor - 12.10.2018 22:35:00
Страницы: 1
Наверх