Как вычесть число из строки в Excel: от простых формул до VBA-скриптов

Вы когда-нибудь сталкивались с ситуацией, когда в ячейке Excel хранится текст с числом (например, "Товар123" или "Цена: 500 руб"), а вам нужно вычесть из этого числа определенную величину? Стандартные арифметические операции здесь не работают — Excel воспринимает содержимое как текст, а не как число. Эта задача возникает при обработке прайс-листов, логов систем, отчетов с неструктурированными данными.

Проблема в том, что Excel не умеет автоматически извлекать числа из строк без дополнительных команд. Попытка применить формулу `=A1-10` к ячейке с текстом "Заказ#45" приведет к ошибке #ЗНАЧ!. Решить задачу можно пятью способами: от простых функций до автоматизации через Power Query и VBA. Выбор метода зависит от объема данных, их структуры и вашего уровня владения Excel.

В этой статье мы разберем все варианты — от ручного извлечения чисел до написания скриптов, которые обработают тысячи строк за секунды. Особое внимание уделим типичным ошибкам, из-за которых формулы возвращают неверный результат, и покажем, как их избежать.

1. Базовый метод: функции LEFT/RIGHT + вычитание

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

  • 📌 "Код_2023" (число в конце)
  • 📌 "500_руб" (число в начале)
  • 📌 "Item#15" (число после разделителя)

Допустим, у вас в ячейке A1 хранится текст "Партия_48", и нужно вычесть из числа 48 значение 5. Используйте комбинацию функций RIGHT (для числа в конце) или LEFT (для числа в начале) с LEN и FIND:

=RIGHT(A1; ДЛСТР(A1)-НАЙТИ("_";A1))-5

Разберем формулу по шагам:

  1. НАЙТИ("_";A1) — находит позицию символа _ (разделителя) в строке.
  2. ДЛСТР(A1) — возвращает общую длину строки.
  3. ДЛСТР(A1)-НАЙТИ("_";A1) — вычисляет количество символов после разделителя (в нашем случае 2 для "48").
  4. RIGHT(A1; ...) — извлекает эти символы как текст.
  5. -5 — вычитает число из извлеченного значения.

2. Универсальный способ: извлечение чисел с помощью формул

Когда положение числа в строке нефиксированно (например, "Цена товара: 1500 руб, скидка 10%"), потребуется извлечь все числовые символы перед вычитанием. Для этого используйте массив функций:

=СУММПРОИЗВ(--(ЕЧИСЛО(--ПСТР($A1;СТРОКА($1:$10);1))))*10^(СТРОКА($1:$10)-1)-100

Эта формула работает так:

  • 🔢 ПСТР($A1;СТРОКА($1:$10);1) — разбивает строку на отдельные символы.
  • 🔢 ЕЧИСЛО(--...) — проверяет, является ли символ числом.
  • 🔢 СУММПРОИЗВ — суммирует числа с учетом их позиции (единицы, десятки и т.д.).
  • 🔢 -100 — вычитает нужное значение.

Формула должна вводиться как массивная (в старых версиях Excel — нажать Ctrl+Shift+Enter). В Excel 365 и Excel 2019 она работает без дополнительных действий.

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

Если в строке нет ни одного числа, функция ЕЧИСЛО вернет массив из ЛОЖЬ, а операция --ЛОЖЬ приведет к ошибке. Решение: оберните формулу в ЕСЛИОШИБКА или добавьте проверку ЕПУСТО.

Пример: для строки "Заказ №78 от 15.05, сумма 2500" формула извлечет 782500 (объединит все числа подряд). Чтобы разделить их, потребуется дополнительная обработка (см. следующий раздел).

3. Разделение чисел в строке с несколькими значениями

Если в строке содержится несколько чисел (например, "Артикул 100, количество 5, цена 300"), и нужно вычесть значение только из одного из них, используйте комбинацию функций ПОИСК, ПСТР и ЗАМЕНИТЬ. Алгоритм:

  1. Найдите позицию искомого числа (например, цены после слова "цена").
  2. Извлеките его с помощью ПСТР.
  3. Преобразуйте в число и выполните вычитание.

Формула для извлечения цены из строки "Артикул 100, количество 5, цена 300" и вычитания 50:

=--ПСТР(A1; ПОИСК("цена"; A1)+5; ПОИСК(" "; A1; ПОИСК("цена"; A1))-(ПОИСК("цена"; A1)+5))-50

Пояснения:

  • 🔍 ПОИСК("цена"; A1)+5 — находит начало числового значения (после слова "цена" и пробела).
  • 🔍 ПОИСК(" "; A1; ПОИСК("цена"; A1)) — находит следующий пробел после слова "цена" (конец числа).
  • 🔍 --ПСТР(...) — извлекает подстроку и преобразует её в число.
📊 Какой метод извлечения чисел вы используете чаще?
Функции LEFT/RIGHT
Массивные формулы
Power Query
VBA
Не извлекаю числа

4. Автоматизация с Power Query (для больших данных)

Если вам нужно обработать тысячи строк, Power Query (вкладка Данные → Получить данные) справится с задачей эффективнее формул. Алгоритм:

  1. Загрузите данные в Power Query (Данные → Из таблицы/диапазона).
  2. Добавьте пользовательский столбец с формулой извлечения числа (например, для строки "Товар123"):
    = try Number.FromText(Text.Select([Column1], {"0".."9"})) otherwise null

    Здесь Text.Select оставляет только цифры, а Number.FromText преобразует результат в число.

  3. Добавьте еще один столбец для вычитания: = [Custom]-10.
  4. Удалите исходный столбец и загрузите данные обратно в Excel.

Преимущества метода:

  • ⚡ Обрабатывает миллионы строк без замедления.
  • 🔄 Легко обновляется при изменении исходных данных.
  • 📊 Позволяет добавлять дополнительные преобразования (например, замену текста).

☑️ Подготовка данных для Power Query

Выполнено: 0 / 4

Пример обработки строки "Заказ #105 на сумму 2500.50 руб":

Исходная строкаФормула Power QueryРезультат
"Заказ #105 на сумму 2500.50 руб"= Number.FromText(Text.Select([Column1], {"0".."9", "."}))1052500.5
"Клиент: Иванов, счет 78"= try Number.FromText(Text.Select([Column1], {"0".."9"})) otherwise 078
"Нет данных"= try Number.FromText(...) otherwise nullnull

5. VBA-скрипт для сложных случаев

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

Function ExtractAndSubtract(rng As Range, subtractValue As Double) As Variant

Dim str As String

Dim num As String

Dim i As Integer

Dim char As String

str = rng.Value

num = ""

For i = 1 To Len(str)

char = Mid(str, i, 1)

If IsNumeric(char) Or char = "." Or char = "," Then

num = num & char

End If

Next i

If num <> "" Then

num = Replace(num, ",", ".") ' Замена разделителя для международного формата

ExtractAndSubtract = CDbl(num) - subtractValue

Else

ExtractAndSubtract = CVErr(xlErrValue) ' Ошибка #ЗНАЧ!

End If

End Function

Теперь в Excel можно использовать функцию как обычно:

=ExtractAndSubtract(A1; 10)

Особенности скрипта:

  • 🔹 Извлекает все числа из строки, включая дробные (с точкой или запятой).
  • 🔹 Автоматически заменяет запятую на точку для корректной работы с дробями.
  • 🔹 Возвращает ошибку #ЗНАЧ!, если в строке нет чисел.

Внимание: если в строке содержатся отрицательные числа (например, "Температура -5°C"), скрипт выше извлечет только цифру 5, игнорируя знак. Чтобы это исправить, добавьте в цикл проверку на символ "-" перед числом.

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

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

⚠️ Внимание: Если формула возвращает #ЗНАЧ!, проверьте регион настроек Excel. В некоторых локалях разделителем целой и дробной части служит запятая, а не точка. Используйте функцию ЗАМЕНИТЬ, чтобы унифицировать формат:
=--ЗАМЕНИТЬ(ПСТР(A1;...); ","; ".")-10
ОшибкаПричинаРешение
Формула возвращает 0В строке нет чисел, но ошибка подавляется функцией ЕСЛИОШИБКА.Добавьте проверку ЕПУСТО или ЕЧИСЛО.
Неправильное число (например, 1234 вместо 12.34)Формула не учитывает позицию точки/запятой.Используйте НАЙТИ для определения позиции разделителя.
Ошибка #ЧИСЛО! при вычитанииИзвлеченное значение превышает допустимый лимит (1.79E+308).Разбейте строку на части или используйте Power Query.
Медленная работа формулМассивные формулы пересчитываются для всего диапазона.Ограничьте диапазон или перейдите на Power Query/VBA.

Еще одна распространенная проблема — лишние пробелы в строках. Например, в ячейке может храниться " 100 " (с пробелами по краям). Чтобы их убрать, используйте СЖПРОБЕЛЫ:

=--СЖПРОБЕЛЫ(ПСТР(A1;...))-5

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

Можно ли вычесть число из строки без формул?

Да, вручную: скопируйте строку в текстовый редактор, удалите все нечисловые символы, затем вставьте результат в Excel и выполните вычитание. Для больших данных этот метод неэффективен.

Почему после извлечения числа дробная часть теряется?

Скорее всего, вы используете функции LEFT/RIGHT, которые возвращают текст. Преобразуйте результат в число с помощью -- (двойное отрицание) или ЗНАЧЕН. Также проверьте, не заменяется ли точка на запятую (или наоборот) в настройках региона.

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

Excel не умеет автоматически конвертировать текстовые числа в цифры. Вам потребуется либо вручную заменить такие строки, либо использовать VBA со словарём чисел (например, "сто" = 100, "двадцать" = 20). Готовых функций для этого в Excel нет.

Можно ли применить эти методы в Google Sheets?

Да, все описанные формулы (кроме VBA и Power Query) работают и в Google Sheets. Для извлечения чисел используйте:

=ARRAYFORMULA(SUM(IFERROR(VALUE(MID(A1; ROW(INDIRECT("1:"&LEN(A1))); 1)))*10^(LEN(A1)-ROW(INDIRECT("1:"&LEN(A1))))))-100

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

Сначала извлеките число (любым из описанных методов), затем примените формулу вычитания процента. Например, чтобы вычесть 10% из числа в строке "Сумма 500":

=--ПСТР(A1; ПОИСК(" "; A1)+1; ДЛСТР(A1))*(1-10%)