Как вытянуть цифры по порядку в Excel: формулы, функции и макросы

Зачем извлекать цифры из текста и где это применяется

Работа с неструктурированными данными — одна из самых частых задач в Microsoft Excel. Представьте: у вас есть столбец с адресами типа "ул. Ленина, д. 15, кв. 42", номерами документов "Контракт №2023-045/А" или логами с метками времени "[14:30] Ошибка подключения". Вручную выделять цифры из сотен строк — неблагодарное занятие, а автоматизация этого процесса экономит часы работы.

Способы извлечения чисел по порядку в Excel варьируются от элементарных формул до сложных скриптов на VBA. Выбор метода зависит от:

  • 📌 Структуры исходных данных — фиксированный шаблон (например, всегда "Товар №123") или хаотичный текст ("Заказ от 15.05, сумма 1200 руб.").
  • 📌 Требуемого результата — нужно ли сохранить ведущие нули (например, в артикулах "00123"), или важны только значимые цифры.
  • 📌 Объёма данных — для 10 строк подойдёт ручное решение, для 10 000 — только автоматизированное.

В этой статье разберём 5 рабочих методов — от базовых функций до продвинутых техник, а также типичные ошибки и способы их обхода. Особое внимание уделим извлечению чисел из текста с сохранением их порядка (например, из строки "5 яблок и 3 груши" получить "53", а не "35").

📊 Как часто вам приходится извлекать цифры из текста в Excel?
Ежедневно
Раз в неделю
Редко, но методично
Никогда не сталкивался

Метод 1: Функции ЛЕВСИМВ, ПРАВСИМВ и ПСТР для фиксированных шаблонов

Если цифры в тексте всегда находятся на одних и тех же позициях (например, артикул в формате "ABC-123-XYZ"), проще всего использовать комбинацию текстовых функций. Рассмотрим на примере строки "Заказ #456 от 10.05", где нужно извлечь число 456:

  1. Найдите позицию символа "#" с помощью НАЙТИ:
    =НАЙТИ("#"; A1)

    Результат: 7 (позиция "#" в строке).

  2. Извлеките 3 символа справа от "#":
    =ПСТР(A1; НАЙТИ("#"; A1)+1; 3)

    Результат: "456".

Для более гибкого решения (если количество цифр варьируется) комбинируйте ПСТР с ДЛСТР и ПОИСК:

=ПСТР(A1; НАЙТИ("#";A1)+1; НАЙТИ(" ";A1;НАЙТИ("#";A1))-НАЙТИ("#";A1)-1)
⚠️ Внимание: Если разделитель перед числом — не символ, а пробел (например, "Заказ 456"), используйте ПОИСК(" ";A1;НАЙТИ("Заказ";A1)) вместо фиксированного смещения. Иначе формула вернёт ошибку #ЗНАЧ!.
Исходный текстФормулаРезультат
"Артикул: 0042"=ПСТР(A1;10;4)"0042"
"Температура: +23.5°C"=ПСТР(A1;14;4)"23.5"
"Счёт #1045 от 01.06"=ПСТР(A1;6;4)"1045"

Убедитесь, что разделитель перед числом всегда одинаковый|Посчитайте количество символов в числе (фиксированное или переменное)|Проверьте, нет ли пробелов перед/после разделителя|Тестируйте формулу на 3-5 примерах данных-->

Метод 2: Регулярные выражения через Power Query (Excel 2016+)

Для сложных шаблонов (например, извлечение всех чисел из строки типа "3 ящика по 15 кг и 2 пакета") удобно использовать Power Query — инструмент ETL (извлечение, преобразование, загрузка), встроенный в современные версии Excel. Он поддерживает регулярные выражения, которые позволяют гибко обрабатывать текст.

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

  1. Выделите диапазон с данными → Данные → Из таблицы/диапазона (Excel создаст таблицу, если её нет).
  2. В открывшемся редакторе Power Query выберите столбец → Преобразовать → Извлечь → Текст по шаблону.
  3. Введите регулярное выражение:
    \d+

    (где \d — любая цифра, + — одна или более подряд).

  4. Нажмите ОКЗакрыть и загрузить.

Результат: в новом столбце появятся все числа из исходного текста, соединённые без разделителей (например, из "5 коробок и 1 пакет" получится "51"). Чтобы разделить их, используйте Разделить столбец → По разделителю с параметром Каждый символ.

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

Используйте регулярное выражение \d+[.,]?\d*. Оно захватит:

- Целые числа (42)

- Дробные с точкой (3.14)

- Дробные с запятой (5,28)

Но учтите, что в Excel числа с запятой могут не распознаваться как числовые значения — их придётся заменять на точки через ЗАМЕНИТЬ.

Метод 3: Формулы массива для извлечения всех чисел по порядку

Если вам нужно извлечь все цифры из текста в порядке их следования (например, из "А1Б2В3" получить "123"), используйте формулу массива на основе ПОИСКПОЗ, ДЛСТР и ПСТР:

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

Как это работает:

  • 🔢 СТРОКА($1:$100) генерирует массив чисел от 1 до 100 (максимальная длина строки в Excel).
  • 🔢 ПСТР($A1;...;1) извлекает каждый символ строки по очереди.
  • 🔢 --ПСТР(...) пытается преобразовать символ в число (цифры преобразуются, буквы дают ошибку).
  • 🔢 ЕСЛИОШИБКА отфильтровывает ошибки, оставляя только цифры.
  • 🔢 ТЕКСТСОЕДИНИТЬ объединяет все цифры в одну строку.
⚠️ Внимание: Формула должна вводиться как массивная — после ввода нажмите Ctrl+Shift+Enter (в Excel 365 это не требуется). Если строка длиннее 100 символов, увеличьте диапазон в СТРОКА($1:$100) до $1:$255.

Пример результатов:

Исходный текстФормулаРезультат
"Р-2023/05"=ТЕКСТСОЕДИНИТЬ("";ИСТИНА;ЕСЛИОШИБКА(--ПСТР(A1;СТРОКА($1:$10);1);""))"202305"
"Тел: 8(912)345-67-89"=ТЕКСТСОЕДИНИТЬ("";ИСТИНА;ЕСЛИОШИБКА(--ПСТР(A1;СТРОКА($1:$20);1);""))"89123456789"
"1-й этаж, комн. 205"=ТЕКСТСОЕДИНИТЬ("";ИСТИНА;ЕСЛИОШИБКА(--ПСТР(A1;СТРОКА($1:$15);1);""))"1205"

Метод 4: Пользовательская функция на VBA для гибкой обработки

Для повторяющихся задач или сложных шаблонов (например, извлечение чисел с учётом знаков +/- или научной нотации) напишите пользовательскую функцию (UDF) на VBA. Откройте редактор Alt+F11, вставьте новый модуль и добавьте код:

Function ExtractNumbers(ByVal txt As String, Optional delimiter As String = "") As String

Dim regex As Object, matches As Object

Set regex = CreateObject("VBScript.RegExp")

regex.Pattern = "([+-]?\d+\.?\d*|\d+\.?\d*)"

regex.Global = True

Set matches = regex.Execute(txt)

Dim result As String, i As Long

For i = 0 To matches.Count - 1

result = result & delimiter & matches(i).Value

Next i

If Len(result) > 0 And Len(delimiter) > 0 Then

result = Mid(result, Len(delimiter) + 1)

End If

ExtractNumbers = result

End Function

Как использовать:

  • 📋 Введите в ячейку: =ExtractNumbers(A1; ", ") — извлечёт все числа через запятую.
  • 📋 Для чисел без разделителя: =ExtractNumbers(A1).
  • 📋 Функция распознаёт:
    • Целые числа (42)
    • Дробные (3.14, 5,28)
    • Отрицательные (-15)
    • Числа в научной нотации (1.23E+05)
⚠️ Внимание: При первом использовании VBA Excel может заблокировать макросы. Разрешите их выполнение в Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов (выберите "Включить все макросы").

Метод 5: Разделение текста на столбцы с последующей фильтрацией

Если числа в тексте разделены фиксированными символами (запятая, тире, пробел), проще всего использовать разделение по столбцам:

  1. Выделите столбец с данными → Данные → Текст по столбцам.
  2. Выберите С разделителями → укажите символ-разделитель (например, пробел или запятую).
  3. Нажмите Готово — числа распределятся по отдельным столбцам.
  4. Скопируйте только столбцы с числами и объедините их с помощью =СЦЕПИТЬ или =ТЕКСТСОЕДИНИТЬ.

Пример: из строки "Модель X-300, серия 15" после разделения по запятой и пробелу получим:

Столбец 1Столбец 2Столбец 3Столбец 4Столбец 5
МодельX-300,серия15(пусто)

Далее извлеките числа из столбцов с помощью =ЗНАЧЕН(ЕСЛИОШИБКА(ПСТР(B1;3;3);"")) (для "X-300," вернёт 300).

Как автоматизировать процесс для большого объёма данных?

Запишите макрос для разделения текста:

  1. Выполните разделение вручную для одной строки.
  2. Включите запись макроса: Вид → Макросы → Записать макрос.
  3. Повторите действия для другой строки.
  4. Остановите запись и сохраните макрос. Теперь его можно применить ко всему диапазону.

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

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

  • 🚫 Потеря ведущих нулей: Excel автоматически убирает нули в начале чисел (например, "00123" становится 123). Решение: преобразуйте результат в текст с помощью =ТЕКСТ(значение; "00000") или добавьте апостроф перед числом ('00123).
  • 🚫 Ошибка #ЗНАЧ! при использовании ПСТР: возникает, если указанная позиция выходит за пределы строки. Решение: проверяйте длину строки с помощью ДЛСТР перед извлечением.
  • 🚫 Неправильный порядок чисел: если использовать НАЙТИ для нескольких чисел без учёта их позиций, результат может быть перепутан (например, из "5 и 3" получится "35" вместо "53"). Решение: используйте методы из Метода 3 (формулы массива).
  • 🚫 Проблемы с региональными настройками: в некоторых локалях Excel использует запятую как разделитель целой и дробной части, а точку — как разделитель тысяч. Решение: замените разделители перед обработкой: =ЗАМЕНИТЬ(ЗАМЕНИТЬ(A1; "."; ","); ","; ".").

Перед применением любого метода протестируйте его на копии данных — особенно если работаете с важными документами. Например, функция ЗНАЧЕН может округлить дробные числа (например, "3.14159" станет 3,14 при определённых настройках).

FAQ: Ответы на частые вопросы

Как извлечь только первое число из строки?

Используйте комбинацию НАЙТИ, ПСТР и МИН для поиска первой цифры:

=ПСТР(A1; МИН(ЕСЛИОШИБКА(НАЙТИ({0;1;2;3;4;5;6;7;8;9};A1);"")); ДЛСТР(A1))

Формула вводится как массивная (Ctrl+Shift+Enter в Excel 2019 и старше). Для извлечения только первого числа до первого нецифрового символа добавьте поиск разделителя:

=ПСТР(A1; МИН(ЕСЛИОШИБКА(НАЙТИ({0;1;2;3;4;5;6;7;8;9};A1);"")); НАЙТИ(" ";A1;МИН(ЕСЛИОШИБКА(НАЙТИ({0;1;2;3;4;5;6;7;8;9};A1);"")))-МИН(ЕСЛИОШИБКА(НАЙТИ({0;1;2;3;4;5;6;7;8;9};A1);"")))
Можно ли извлечь числа с учётом их знака (+/-)?

Да, для этого модифицируйте регулярное выражение в Power Query или VBA. Например, в UDF из Метода 4 шаблон ([+-]?\d+\.?\d*) уже учитывает знаки. Для формул используйте:

=ЕСЛИ(НАЙТИ("-";A1)>0; "-"; "") & ТЕКСТСОЕДИНИТЬ("";ИСТИНА;ЕСЛИОШИБКА(--ПСТР(A1;СТРОКА($1:$100);1);""))

Эта формула добавит "-" в начало результата, если в исходном тексте есть минус.

Как извлечь числа из ячеек с датами (например, "15.05.2023")?

Excel воспринимает даты как числа (например, 15.05.2023 = 45056 в числовом формате). Чтобы извлечь день, месяц или год отдельно, используйте:

  • 📅 День: =ДЕНЬ(ЗНАЧЕН(A1))
  • 📅 Месяц: =МЕСЯЦ(ЗНАЧЕН(A1))
  • 📅 Год: =ГОД(ЗНАЧЕН(A1))
  • 📅 Весь текст даты: =ТЕКСТ(ЗНАЧЕН(A1); "дд.мм.гггг")

Если дата записана как текст (не преобразуется в числовой формат), используйте ПСТР:

=ПСТР(A1;1;2)  // день

=ПСТР(A1;4;2) // месяц

=ПСТР(A1;7;4) // год

Почему формула возвращает #ЗНАЧ! или #ЧИСЛО?

Ошибки возникают по следующим причинам:

  • 🔴 #ЗНАЧ!:
    • В формуле указан диапазон вне листа (например, СТРОКА($1:$1000), когда в строке меньше 1000 символов).
    • Используется ПСТР с отрицательной длиной или позицией.
  • 🔴 #ЧИСЛО!:
    • В функции НАЙТИ не найден искомый символ.
    • Результат формулы превышает максимальное значение для числа в Excel (1.79E+308).

Решение: проверьте исходные данные на наличие пустых ячеек или несоответствие шаблону. Добавьте обработку ошибок с помощью ЕСЛИОШИБКА:

=ЕСЛИОШИБКА(ваша_формула; "")
Как извлечь числа из текста с буквами (например, "A1B2C3")?

Используйте формулу массива из Метода 3, но с модификацией для учёта букв:

=ТЕКСТСОЕДИНИТЬ("";ИСТИНА;ЕСЛИ(И(КОДСИМВ(ПСТР(A1;СТРОКА($1:$10);1))>=48; КОДСИМВ(ПСТР(A1;СТРОКА($1:$10);1))<=57); ПСТР(A1;СТРОКА($1:$10);1); ""))

Пояснение: КОДСИМВ возвращает код символа в ASCII. Цифры имеют коды от 48 ("0") до 57 ("9"). Формула проверяет каждый символ и оставляет только цифры.