Как вырезать подстроку в Excel: от простых функций до сложных приёмов

Работа с текстовыми данными в Microsoft Excel часто требует извлечения фрагментов из ячеек — будь то фамилии из ФИО, домены из email-адресов или коды из артикулов. Даже опытные пользователи иногда тратят часы на ручное копирование, не подозревая, что задачу можно автоматизировать за считанные секунды. Эта статья раскроет все возможные способы вырезания подстрок — от элементарных функций ЛЕВСИМВ до продвинутых техник с регулярными выражениями и Power Query.

Мы разберём не только стандартные инструменты, но и малоизвестные трюки: как извлечь текст между двумя символами, удалить лишние пробелы перед вырезкой или автоматически разделить данные по шаблону. Особое внимание уделим типичным ошибкам — например, почему функция ПСТР возвращает #ЗНАЧ! и как этого избежать. Готовые примеры формул и пошаговые скриншоты помогут применить знания на практике сразу после прочтения.

Базовые функции: ЛЕВСИМВ, ПРАВСИМВ и ПСТР

Начнём с трёх «китов», на которых держится работа с подстроками в Excel. Эти функции входят в стандартный набор текстовых инструментов и доступны во всех версиях программы, начиная с Excel 2003.

Функция ЛЕВСИМВ (LEFT) извлекает заданное количество символов с начала строки. Синтаксис прост: =ЛЕВСИМВ(текст; [количество_знаков]). Например, чтобы получить первые 3 символа из ячейки A1, используйте =ЛЕВСИМВ(A1; 3). Если второй аргумент опущен, по умолчанию берётся 1 символ. Важно: функция чувствительна к пробелам — если в начале ячейки есть невидимые символы (например, после импорта данных), они тоже будут учтены.

Функция ПРАВСИМВ (RIGHT) работает аналогично, но с конца строки. Полезна для извлечения расширений файлов, последних цифр артикулов или доменов верхнего уровня. Пример: =ПРАВСИМВ("document.pdf"; 3) вернёт pdf. Обратите внимание, что в Excel для Mac разделителем аргументов служит точка с запятой (;), как в русской локализации Windows.

Функция ПСТР (MID) — самая гибкая из тройки. Она позволяет вырезать фрагмент из середины строки, указав стартовую позицию и длину: =ПСТР(текст; начальная_позиция; количество_знаков). Ключевая особенность: отсчёт позиций начинается с 1, а не с 0, как в большинстве языков программирования. Например, чтобы извлечь BCD из строки ABCDEF, используйте =ПСТР("ABCDEF"; 2; 3).

  • 🔹 ЛЕВСИМВ: идеальна для извлечения префиксов (кодов стран, первых букв)
  • 🔹 ПРАВСИМВ: незаменима для суффиксов (доменов, расширений файлов)
  • 🔹 ПСТР: универсальна для любых фрагментов по известным координатам
  • 🔹 Ошибка #ЗНАЧ!: возникает, если начальная_позиция больше длины текста
📊 Какую функцию вы используете чаще всего?
ЛЕВСИМВ
ПРАВСИМВ
ПСТР
Другие функции
Не знаю таких функций

Продвинутые техники: ПОИСК, НАЙТИ и их комбинации

Когда положение подстроки заранее неизвестно, на помощь приходят функции ПОИСК (SEARCH) и НАЙТИ (FIND). Они возвращают позицию искомого символа или подстроки, что позволяет динамически рассчитывать аргументы для ПСТР.

Разница между ПОИСК и НАЙТИ критична: ПОИСК игнорирует регистр и поддерживает подстановочные знаки (? и *), тогда как НАЙТИ чувствительна к регистру и работает только с точными совпадениями. Например, =ПОИСК("а"; "Абвгд") вернёт 1, а =НАЙТИ("а"; "Абвгд") — ошибку #ЗНАЧ!.

Классический пример комбинации функций — извлечение домена из email-адреса. Формула выглядит так: =ПСТР(A1; ПОИСК("@"; A1)+1; ДЛСТР(A1)-ПОИСК("@"; A1)). Здесь ПОИСК("@"; A1) находит позицию символа @, а ДЛСТР(A1) возвращает общую длину строки. Аналогично можно вырезать текст между двумя разделителями, например, скобками или тире.

Убедитесь, что искомый символ точно есть в строке

Помните, что ПОИСК возвращает позицию первого вхождения

Учитывайте регистр при использовании НАЙТИ

Проверьте наличие пробелов перед/после разделителей-->

Функция Синтаксис Пример использования Чувствительность к регистру
ПОИСК =ПОИСК(искомая_подстрока; текст; [начальная_позиция]) =ПОИСК(" "; A1) — найти первый пробел Нет
НАЙТИ =НАЙТИ(искомая_подстрока; текст; [начальная_позиция]) =НАЙТИ("A"; A1) — найти заглавную "A" Да
ПОИСКБ =ПОИСКБ(искомая_подстрока; текст; [начальная_позиция]) =ПОИСКБ("я"; A1) — поиск с конца строки Нет

Для извлечения текста между двумя одинаковыми разделителями (например, между двумя дефисами) используйте формулу: =ПСТР(A1; ПОИСК("-"; A1)+1; ПОИСК("-"; A1; ПОИСК("-"; A1)+1)-(ПОИСК("-"; A1)+1)). Эта конструкция сначала находит первый дефис, затем ищет второй дефис, начиная поиск сразу после первого, и вырезает текст между ними.

Регулярные выражения через Power Query

Если вам нужно извлечь подстроки по сложному шаблону (например, все email-адреса из текста или номера телефонов в формате +7 XXX-XXX-XX-XX), стандартные функции Excel окажутся бессильны. Здесь на помощь приходит Power Query — инструмент для преобразования данных, поддерживающий регулярные выражения (regex).

Алгоритм действий:

  1. Выделите исходные данные и перейдите на вкладку ДанныеИз таблицы/диапазона.
  2. В открывшемся редакторе Power Query выберите столбец с текстом, кликните правой кнопкой и выберите Разделить столбецПо разделителю.
  3. В качестве разделителя укажите Специальный и введите regex-шаблон. Например, для извлечения всех чисел из текста используйте шаблон [^0-9].
  4. Нажмите ОК и загрузите данные обратно в Excel.

Для извлечения подстрок по regex напрямую (без разделения) используйте функцию Text.Select в языке M (формульный язык Power Query). Пример кода для извлечения всех буквенных символов:

let

Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],

ExtractLetters = Table.TransformColumns(Source, {{"Текст", each Text.Select(_, {"A".."Z", "a".."z", "А".."Я", "а".."я"}), type text}})

in

ExtractLetters

Примеры полезных regex-шаблонов

📧 Для email: [A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}

📞 Для телефонов: \+?[78][-()\s]?\d{3}[-()\s]?\d{3}[-()\s]?\d{2}[-()\s]?\d{2}

💰 Для сумм в рублях: \d{1,3}(?:\s?\d{3})*(?:,\d{2})?\s?₽

🔢 Для чисел в тексте: \d+

⚠️ Внимание: Регулярные выражения в Power Query используют синтаксис .NET, который отличается от классического Perl-синтаксиса. Например, для обозначения «любой цифры» здесь используется \d, а не [0-9], хотя оба варианта будут работать.

Извлечение подстрок по шаблону с ТЕКСТ.ПОСЛЕ и ТЕКСТ.ДО

В Excel 2019 и более поздних версиях (а также в Excel 365) появились две революционные функции: ТЕКСТ.ПОСЛЕ (TEXTAFTER) и ТЕКСТ.ДО (TEXTBEFORE). Они радикально упрощают извлечение фрагментов текста по разделителю.

Функция ТЕКСТ.ПОСЛЕ возвращает часть строки, расположенную после указанного разделителя. Синтаксис: =ТЕКСТ.ПОСЛЕ(текст; разделитель; [вхождение]; [совпадение_регистра]; [если_не_найдено]; [если_пусто]). Например, чтобы извлечь домен из email user@example.com, достаточно написать =ТЕКСТ.ПОСЛЕ("user@example.com"; "@").

Функция ТЕКСТ.ДО работает зеркально — возвращает текст до разделителя. Аналогичный пример для извлечения имени пользователя: =ТЕКСТ.ДО("user@example.com"; "@"). Особенность этих функций — поддержка нескольких вхождений разделителя. Например, =ТЕКСТ.ПОСЛЕ("абв.где.жзи"; "."; 2) вернёт жзи, пропустив первое вхождение точки.

Дополнительные аргументы позволяют тонко настраивать поведение:

  • 🔢 [вхождение]: номер вхождения разделителя (по умолчанию 1)
  • 🔤 [совпадение_регистра]: ИСТИНА для учёта регистра
  • [если_не_найдено]: значение, возвращаемое при отсутствии разделителя
  • 🗑️ [если_пусто]: значение для пустых ячеек

=ТЕКСТ.ПОСЛЕ(ТЕКСТ.ДО("[пример]"; "]"); "[")-->

Автоматизация с помощью VBA-макросов

Когда стандартных функций недостаточно (например, для обработки тысяч строк с сложной логикой), на помощь приходит VBA. Скрипт ниже извлекает все числовые подстроки из выделенного диапазона и записывает их в соседний столбец:

Sub ExtractNumbers()

Dim rng As Range

Dim cell As Range

Dim output As String

Dim i As Integer

Dim char As String

Set rng = Selection

For Each cell In rng

output = ""

For i = 1 To Len(cell.Value)

char = Mid(cell.Value, i, 1)

If IsNumeric(char) Then output = output & char

Next i

cell.Offset(0, 1).Value = output

Next cell

End Sub

Чтобы использовать этот макрос:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. Вставьте код в новый модуль (Insert → Module).
  3. Выделите диапазон с исходными данными и запустите макрос (F5).
  4. Результаты появятся в столбце справа от выделенного диапазона.

Для более сложных задач (например, извлечения текста по regex) можно использовать объекты Regular Expressions в VBA. Пример кода для извлечения всех слов длиной более 4 символов:

Function ExtractLongWords(rng As Range) As String

Dim regex As Object

Dim matches As Object

Dim result As String

Set regex = CreateObject("VBScript.RegExp")

regex.Pattern = "\b\w{5,}\b"

regex.Global = True

Set matches = regex.Execute(rng.Value)

For Each match In matches

result = result & match.Value & ", "

Next match

If Len(result) > 0 Then

ExtractLongWords = Left(result, Len(result) - 2)

Else

ExtractLongWords = ""

End If

End Function

⚠️ Внимание: Макросы с объектами Regular Expressions требуют подключения библиотеки Microsoft VBScript Regular Expressions (в редакторе VBA перейдите в Tools → References и отметьте соответствующий пункт). Без этого код вернёт ошибку.

Типичные ошибки и как их избежать

Даже опытные пользователи сталкиваются с ошибками при работе с подстроками. Вот самые распространённые ловушки и способы их обхода:

1. Ошибка #ЗНАЧ! в функции ПСТР

Причины:

  • 🔢 начальная_позиция больше длины текста (используйте ЕСЛИОШИБКА для обработки)
  • 📏 Отрицательное значение количество_знаков (должно быть ≥ 0)
  • 🗑️ Пустая ячейка (проверяйте функцией ЕПУСТО)

Решение: оберните формулу в ЕСЛИОШИБКА:

=ЕСЛИОШИБКА(ПСТР(A1; 5; 3); "").

2. Неправильный отсчёт позиций
Excel начинает отсчёт с 1, а не с 0, как в большинстве языков программирования. Если вы привыкли к нумерации с нуля (например, из Python или JavaScript), добавьте +1 к расчётам. Например, чтобы извлечь символ с индексом 0 в программистском понимании, используйте =ПСТР(A1; 1; 1).

3. Проблемы с пробелами

Невидимые пробелы (особенно неразрывные) часто ломают логику извлечения. Перед работой с подстроками очищайте текст функцией СЖПРОБЕЛЫ:

=СЖПРОБЕЛЫ(A1). Для удаления всех пробелов используйте =ПОДСТАВИТЬ(A1; " "; "").

4. Чувствительность к регистру

Функции НАЙТИ и ПОИСК ведут себя по-разному с регистром. Если вам нужно точное совпадение, используйте НАЙТИ, иначе — ПОИСК. Для принудительного игнорирования регистра преобразуйте текст в нижний регистр:

=ПОИСК(НИЖНРЕГ("Пример"); НИЖНРЕГ(A1)).

Ошибка Причина Решение
#ИМЯ? Опечатка в названии функции Проверьте синтаксис (например, ЛЕВСИМВ, а не ЛЕВСИМВ)
#ЗНАЧ! в ПСТР начальная_позиция > длины строки Используйте МИН(начальная_позиция; ДЛСТР(текст))
Неверный результат Невидимые символы (табуляции, переводы строк) Примените СЖПРОБЕЛЫ или ЧИСТ
Макрос не работает Отключены макросы в настройках безопасности Перейдите в Файл → Параметры → Центр управления безопасностью

Практические примеры: от простого к сложному

Разберём реальные задачи, с которыми пользователи сталкиваются ежедневно, и оптимальные способы их решения.

Задача 1: Извлечь фамилию из ФИО

Предположим, в ячейке A1 содержится "Иванов Иван Иванович". Чтобы получить фамилию:

=ЛЕВСИМВ(A1; ПОИСК(" "; A1)-1).

Эта формула находит позицию первого пробела и извлекает все символы до него. Для имён и отчеств используйте:

=ПСТР(A1; ПОИСК(" "; A1)+1; ПОИСК(" "; A1; ПОИСК(" "; A1)+1)-ПОИСК(" "; A1)-1).

Задача 2: Выделить домен из URL

Для адреса "https://example.com/page" в ячейке A1:

=ПСТР(A1; ПОИСК("://"; A1)+3; ПОИСК("/"; A1; ПОИСК("://"; A1)+3)-(ПОИСК("://"; A1)+3)).

Для Excel 365 проще:

=ТЕКСТ.ПОСЛЕ(ТЕКСТ.ДО(A1; "/"; 3); "://").

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

Если в ячейке "яблоки, бананы, груши", чтобы получить второй элемент:

=ТЕКСТ.ПОСЛЕ(ТЕКСТ.ДО(A1; ","; 2); ","; 1).

Для разделения на отдельные ячейки используйте инструмент Текст по столбцам на вкладке Данные.

Задача 4: Извлечь все цифры из текста

Для строки "Заказ №12345 от 01.01.2023":

=СЦЕПИТЬ(ЕСЛИОШИБКА(--ПСТР(A1; СТРОКА(ДВССЫЛ("1:100")); 1); ""); "").

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

FAQ: Частые вопросы по работе с подстроками

Как вырезать текст после последнего разделителя?

Используйте комбинацию ПРАВСИМВ и ПОИСКБ: =ПРАВСИМВ(A1; ДЛСТР(A1)-ПОИСКБ(" "; A1)).

Для Excel 365 проще: =ТЕКСТ.ПОСЛЕ(A1; " "; -1), где -1 указывает на последнее вхождение.

Можно ли извлечь подстроку по регулярному выражению без Power Query?

В стандартном Excel — нет. Однако вы можете использовать VBA с объектами RegExp или надстройки вроде Kutools for Excel, которые добавляют поддержку regex в формулы.

Почему функция ТЕКСТ.ПОСЛЕ возвращает #ИМЯ?

Эта функция доступна только в Excel 2019 и новее (или Excel 365). В старых версиях используйте комбинацию ПРАВСИМВ/ПОИСК или обновите программу.

Как извлечь текст между двумя разными разделителями?

Для строки "[Пример]" (извлечь текст между [ и ]): =ПСТР(A1; ПОИСК("["; A1)+1; ПОИСК("]"; A1)-(ПОИСК("["; A1)+1)).

В Excel 365:

=ТЕКСТ.ПОСЛЕ(ТЕКСТ.ДО(A1; "]"); "[").

Как обработать тысячи строк без замедления?

Для больших объёмов данных:

  • 🔄 Отключите автоматический пересчёт формул (Формулы → Параметры вычислений → Вручную).
  • 🖥️ Используйте Power Query — он оптимизирован для работы с большими наборами данных.
  • ⚡ Замените формулы на значения после обработки (Копировать → Специальная вставка → Значения).