Как отделить текст от цифр в excel

Добрый день уважаемый читатель!

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

Разобрать слитый текст на необходимые составляющие возможно произвести с помощью:

Мастер разбора текстов

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

Для выполнения задачи вызываем диалоговое окно «Мастер текстов (разбор)» и в 3 шага разделяем текст:

  1. Для начала нужно выделить данные, которые необходимо разделить, следующим шагом на вкладке «Данные» в разделе «Работа с данными» нажимаете иконку «Текст по столбцам» и в вызванном диалоговом окне мастера указываем формат рабочего текста. Выбираем 2 вида форматов:
  • С разделителями – это когда существует текст или символ, который условно будет отделять будущее содержимое отдельных ячеек;
  • Фиксированной ширины – это когда при помощи пробелов в тексте имитируется столбики одинаковой ширины.
  1. Вторым шагом, в нашем примере, указываем символ, выполняющий роль разделителя. В случаях, когда в тексте идут подряд пару разделителей, несколько пробелов, к примеру, то установка флажка для пункта «Считать последовательные разделители одним» укажет для Excel принимать их за один разделитель. Дополнительное условие «Ограничитель строк» поможет указать, что текстовые значения, содержащиеся в кавычках не делить (к примеру, название фирмы «Рудольф, Петер и Саймон»);
  2. Последним шагом, для уже разделённых столбиков, нужно указать в диалоговом окне мастера, предварительно выделив их, выбрать необходимый формат получаемых данных:
  • Общий – не проводит изменения данных, оставляя их в первоначальном виде, будет оптимальным выбором в большинстве случаев;
  • Текстовый – данный формат, в основном, необходим для столбиков с числовыми значениями, которые программа в обязательном порядке должна интерпретировать как текст. (К примеру, это числа с разделителем по тысяче или номер пластиковой карточки);
  • Дата – этот формат используется для столбиков с датами, кстати, формат самой даты можно выбрать в выпадающем списке.

В случае, когда будете использовать символы, которые не похожи на стандартные, назначенные в региональных настройках, можете использовать кнопку «Подробнее» для правильного их распознавания.

Рассоединяем текст с помощью формул

Для этого способа нам понадобятся возможности сочетаний функций ПОИСК и ПСТР. При помощи функции ПОИСК мы будем искать все пробелы, которые есть между словами (например, между фамилией, именем и отчеством). Потом функцией ПСТР выделяем необходимое количество символов для дальнейшего разделения.

И если с первыми двумя словами понятно, что и как разделять, то разделителя для последнего слова нет, а это значит что нужно указать в качестве аргумента условно большое количество символов, как аргумент «число_знаков» для функции ПСТР, например, 100, 200 или больше.

А теперь поэтапно рассмотрим формирование формулы для разделения текста в ячейке:

  • Во-первых, нам необходимо найти два пробела, которые разделяют наши слова, для поиска первого пробела нужна формула: =ПОИСК(" ";B2;1), а для второго подойдет: =ПОИСК(" ";B2;C2+1);
  • Во-вторых, определяем, сколько символов нужно выделить в строке. Поскольку позиции разделителя мы уже определили, то символов для разделения у нас будет на один меньше. Значит, будем использовать функцию ПСТР для изъятия слов, с ячейки используя как аргумент «количество_знаков» результат работы предыдущей формулы. Для определения первого слова (Фамилии) нужна формула: =ПСТР(B2;1;ПОИСК(" ";B2;1)), для определения второго значения (Имя): =ПСТР(B2;ПОИСК(" ";B2;1)+1;ПОИСК(" ";B2;ПОИСК(" ";B2;1)+1) -ПОИСК(" ";B2;1)), а теперь определим последнее значение (Отчество): =ПСТР(B2;ПОИСК(" ";B2;ПОИСК(" ";B2;1)+1)+1;100).
Читайте также:  Как обнулить телефон huawei

В результате мы разделили ФИО на три слова, что позволит с ними эффективно работать.

Если же значение в ячейке будете делить на две части, то ищете только один пробел (или иной разделитель), а вот чтобы разделить более 4 слов, в формулу добавьте поиск необходимых разделителей.

Выдергиваем слова с помощью макросов VBA

Рассмотрим два способа разделить текст в ячейке:

  1. Выдергиваем отдельные слова по разделителю;
  2. Делим текст без пробелов.

Способ №1.

Поскольку вас интересует автоматическое деление текста, значит надо написать хорошую функцию на VBA и внедрить ее в рабочую книгу. Для начала переходим на вкладку «Разработчик» и выбираем «Visual Basic» или вызываем эту возможность с помощью горячего сочетания клавиш Alt+F11. (детальнее в статье «Как создать макрос в Excel»).

Создаем новый модуль в меню «Insert» наживаем пункт «Module» и переносим в него нижеприведенный код:

В этом курсе:

С помощью мастера распределения текста по столбцам текст, содержащийся в одной ячейке, можно разделить на несколько.

Выделите ячейку или столбец с текстом, который вы хотите разделить.

На вкладке Данные нажмите кнопку Текст по столбцам.

В мастере распределения текста по столбцам установите переключатель с разделителями и нажмите кнопку Далее.

Выберите разделители для своих данных. Например, запятую и пробел. Данные можно предварительно просмотреть в окне Образец разбора данных.

Нажмите кнопку Далее.

Выберите значение в разделе Формат данных столбца или используйте то, которое Excel выберет автоматически.

В поле Поместить в выберите место на листе, где должны отображаться разделенные данные.

Нажмите кнопку Готово.

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community, попросить помощи в сообществе Answers community, а также предложить новую функцию или улучшение на веб-сайте Excel User Voice.

Вот бывает так: есть у Вас в ячейке некий текст. Допустим "Было доставлено кусков мыла 763шт.". Вам нужно из этого только 763 — чтобы можно было провести с этим некие математические действия. Если это только одна ячейка — проблем тут нет, а если таких ячеек пару тысяч? И к тому же все разные?

  • Было доставлено кусков мыла 763шт.
  • Всего пришло 34
  • Тюбики — 54 доставлено
  • и т.д.

Никакой зацепки для извлечения данных. Пару тысяч таких строк удалять вручную весьма утомительное занятие, надо сказать. Да еще и не быстрое.
Есть несколько вариантов решения подобной задачи.

СПОСОБ 1: не используем макросы
можно применить формулу массива, вроде такой:
=ПСТР( A1 ;МИН(ЕСЛИ(ЕЧИСЛО(-ПСТР( A1 ;СТРОКА( $1:$99 );1));СТРОКА( $1:$99 )));ПРОСМОТР(2;1/ЕЧИСЛО(-ПСТР( A1 ;СТРОКА( $1:$99 );1));СТРОКА( $1:$99 ))-МИН(ЕСЛИ(ЕЧИСЛО(-ПСТР( A1 ;СТРОКА( $1:$99 );1));СТРОКА( $1:$99 )))+1)
Три важных момента:

  1. Формула вводится в ячейку сочетанием клавиш Ctrl+Shift+Enter, т.к. является формулой массива. Подробнее про эти формулы читайте в статье: Что такое формула массива
  2. в таком виде формула работает с текстом, количество символов в котором не превышает 99. Чтобы расширить необходимо в формуле во всех местах заменить СТРОКА( $1:$99 ) на СТРОКА( $1:$200 ) . Т.е. вместо 99 указать количество символов с запасом. Только не увлекайтесь, иначе может получиться, что формула будет работать слишком долго
  3. формула не обработает корректно текст " Было доставлено кусков мыла 763шт., а заказывали 780 " и ему подобный, где числа раскиданы по тексту.

Теперь коротко разберем формулу на примере фразы: Было доставлено кусков мыла 763шт.

  • в A1 сам текст, из которого необходимо извлечь числа: Было доставлено кусков мыла 763шт., а заказывали 780
  • блок: МИН(ЕСЛИ(ЕЧИСЛО(-ПСТР( A1 ;СТРОКА( $1:$99 );1));СТРОКА( $1:$99 )))
    вычисляет позицию первой цифры в ячейке — 29
  • блок: ПРОСМОТР(2;1/ЕЧИСЛО(-ПСТР( A1 ;СТРОКА( $1:$99 );1));СТРОКА( $1:$99 ))
    вычисляет позицию последней цифры в ячейке — 31
  • в результате получается: =ПСТР( A1 ;29;3129+1)
    функция ПСТР извлекает из текста, указанного первым аргументом( A1 ) текст, начиная с указанной позиции(29) с количеством символов, указанным третьим аргументом(3129+1)
  • И в итоге:
    =ПСТР( A1 ;29;3129+1)
    => =ПСТР( A1 ;29;2+1)
    => =ПСТР( A1 ;29;3)
    => 763
Читайте также:  Как найти пропавший планшет

Может быть задача проще — необходимо извлечь односоставной текст, убрав цифры вначале и в конце строки, учитывая, что сам текст всегда следует после разделителя(например, тире):
12.08-АГСВ2
12.08-АГСВ1
01.03-ОВ2
12.03-КЖ6.1
Из этих данных надо получить только текст после тире(-) и отсечь цифры на конце:
АГСВ
АГСВ
ОВ
КЖ
Формула будет работать почти по тому же принципу, что и формула выше, но она проще:
=ПСТР( A1 ;ПОИСК("-"; A1 )+1;ПОИСКПОЗ(ИСТИНА;ЕЧИСЛО(—ПСТР(ПСТР( A1 ;ПОИСК("-"; A1 )+1;999);СТРОКА( $1:$99 );1));0)-1)
В данном случае мы при помощи ПОИСК("-"; A1 ) ищем сначала позицию тире, далее при помощи ПОИСКПОЗ(ИСТИНА;ЕЧИСЛО(—ПСТР(ПСТР( A1 ;ПОИСК("-"; A1 )+1;999);СТРОКА( $1:$99 );1));0) находим именно в отсеченном тексте позицию первой цифры. Передаем эти значения в ПСТР , которая отбирает из этого текста все от первого тире(+1) до первого числа, идущего после текста.

СПОСОБ 2: используем макросы
Самый главный недостаток метода при помощи формулы, приведенной выше — из текста " Было доставлено кусков мыла 763шт., а заказывали 780 " формула вернет не только числа, а и текст между первой и последней цифрой: 763шт., а заказывали 780 .
Решить же проблему извлечения цифр даже из такого текста при помощи VBA куда проще и гибче. Плюс можно не только цифры извлекать, но и наоборот — цифры удалить, а извлечь только текст. Ниже приведен код пользовательской функции, которая поможет извлечь из строки только числа либо только текст. Иными словами, результатом функции будет либо только текст, либо только числа.

Function Extract_Number_from_Text(sWord As String, Optional Metod As Integer) ‘sWord = ссылка на ячейку или непосредственно текст ‘Metod = 0 – числа ‘Metod = 1 – текст Dim sSymbol As String, sInsertWord As String Dim i As Integer If sWord = "" Then Extract_Number_from_Text = "Нет данных!": Exit Function sInsertWord = "" sSymbol = "" For i = 1 To Len(sWord) sSymbol = M ) And i > 1 Then If M And i > 1 Then If Not M End If End If sInsertWord = sInsertWord & sSymbol End If End If Next i Extract_Number_from_Text = sInsertWord End Function

Данный код необходимо поместить в стандартный модуль книги. После этого в мастере функций в категории Определенные пользователем (User Defined) будет доступна функция Extract_Number_from_Text , которую можно будет применять как обычную функцию на листе.
Для извлечения только чисел
=Extract_Number_from_Text( A1 ; 0)
или
=Extract_Number_from_Text( A1 )
Для извлечения только текста
=Extract_Number_from_Text( A1 ; 1)

Подробнее про создание пользовательских функции и их применении можно почитать в статье Что такое функция пользователя(UDF)?

Помимо функции пользователя решил выложить и вариант с использованием диалогового окна:

Выбрать ячейку или диапазон с текстом(Лист1! $A$2:$A$10 ) — здесь указывается диапазон с исходными значениями, из которого необходимо оставить только числа или только текст.

Выберите ячейку для вывода данных(Лист1! $A$2 ) — указывается одна ячейка, с которой начать вывод преобразованных значений. В качестве этой ячейки можно выбрать первую ячейку диапазона с текстом(исходного) если необходимо произвести изменения сразу в этих же ячейках(как на рисунке). Осторожнее с таким указанием, т.к. результат работы кода может быть не совсем таким, какой вы ожидали, а вернуть прежние данные уже не получится — если только не закрыть файл без сохранения изменений.

Читайте также:  Как посмотреть кто сидит через вай фай

Оставить только цифры, Оставить только текст— думаю не надо пояснять. Здесь выбираем, что оставить в качестве результата.

Небольшое дополнение к использованию кода
В коде есть строка:

If LCase(sSymbol) Like "*[0-9.,;:-]*" Then

Данная строка отвечает за текстовые символы, которые могут встречаться внутри чисел и которые надо оставить(не удалять наравне с другими не числовыми символами). Следовательно, если какие-то из данных символов не нужны в конечном тексте — их надо просто удалить. Например, чтобы оставались исключительно числа(без запятых и пр.):

If LCase(sSymbol) Like "*[0-9]*" Then

если надо исключить из удаления помимо цифр точку(т.е. будут извлечены цифры и точка):

If LCase(sSymbol) Like "*[0-9.]*" Then

и т.д.
Скачать пример:

Число из текста и наоборот.xls (99,0 KiB, 12 871 скачиваний)

Статья помогла? Поделись ссылкой с друзьями!

Поиск по меткам

Здравствуйте скрипт при обработке ячейки:
Пр-ка ТНВД 5301 (пер.) 50-1006315-Б2 выдает: 530150-1006315-2
вопрос есть возможность что бы он брал только последних 15-20 сим.
с заглавными А-Я, или хотя бы цифирки.
Буду признателен за предложения.
Возможно есть проще варианты(12000 стр.записеи) обрезани до последних 10-20сим.

Александр, последние 15-20 символов можно взять при помощи функции ПРАВСИМВ(RIGHT). Так же можно совместить:
=Extract_Number_from_Text(ПРАВСИМВ(A1))
Более сложные вариации извлечения делаются под конкретные данные с учетом различных нюансов.

Добрый день!
Спасибо за замечательный код! Подскажите пожалуйста, как оставить среди неудаляемых символов пробел?
Например, в ячейке было "Т-образный поворот SPB-RF60 TE-200 SS316L".
Ваш код оставляет (после некоторой модификации) "60200316".
А хотелось бы "60 200 316".
Я не понимаю как вписать пробел в строку
Like "*[0-9.,;:-]*" Then

А всё разобрался, пробел нужно указывать в середине ряда, а не в конце.

Здравствуйте.
Использовал функцию, вызванную на VBA, все нормально, при вызове мастера функций он нормально отрабатывает
Но при выполнение в эксель, выскакивает сообщение, что здесь используется циклическая ссылка и потом появляется значение 0. В чем дело?

Добрый день!
А что надо добавить в код/формулу чтобы из строки
"ТП ВЕТЧИННАЯ ВАРЕНАЯ 400Г (162854) /Ш/"
— вытащить только цифры до буквы Г?
— или без содержимого скобок
Заранее большое спасибо!

Нашла пока только такой вариант решения:
=ЛЕВСИМВ(B5;ПОИСК("г ";B5)-1)
Затем в другой колонке
=ЕСЛИОШИБКА(ПСТР(C5;МИН(ЕСЛИ(ЕЧИСЛО(-ПСТР(C5;СТРОКА($1:$99);1));СТРОКА($1:$99)));ПРОСМОТР(2;1/ЕЧИСЛО(-ПСТР(C5;СТРОКА($1:$99);1));СТРОКА($1:$99))-МИН(ЕСЛИ(ЕЧИСЛО(-ПСТР(C5;СТРОКА($1:$99);1));СТРОКА($1:$99)))+1);1000)
И в третьей колонке = из предыдущей и преобразовать в числовой формат макросом
Результат достигнут, но если расскажите как можно было сделать изящнее — обязательно запомню))

Public Function RegExpExtract(Text As String, Pattern As String, Optional Item As Integer = 1) As String On Error GoTo ErrHandl Set regex = CreateObject("VBScript.RegExp") regex.Pattern = Pattern regex.Global = True If regex.Test(Text) Then Set matches = regex.Execute(Text) RegExpExtract = matches.Item(Item — 1) Exit Function End If ErrHandl: RegExpExtract = CVErr(xlErrValue) End Function

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

Денис, спасибо. Но есть все равно пара замечаний, раз уж предлагаете воспользоваться функцией. Неплохо было бы добавить и пример применения. Иначе как тому, кто зайдет почитать использовать Ваше решение?
Я умею использовать регулярки и по коду вижу, что помимо текста надо указать не только шаблон, но еще и номер элемента, который получить. Что является немаловажным замечанием.
Для извлечения первого числа(без разделения групп разрядов) — =(RegExpExtract( A1 ;"d";1)
Для извлечения первого текста(что не очень удобно, если чисел в тексте много) — =(RegExpExtract( A1 ;"D";1)
Оба варианта слегка халтурны, но для понимания общего смысла использования подойдут.
В общем и целом я бы в функцию еще параметр IgnoreCase добавил(при извлечении текста по шаблону может потребоваться). Да и Multiline тоже иногда может играть роль(зависит от шаблона и текста), поэтому его тоже лучше ставить в True сразу в случае с такими функциями.

Adblock
detector