Вы когда-нибудь сталкивались с ситуацией, когда в ячейках Excel хранятся смешанные данные — например, артикулы товаров в формате ABC12345, номера документов типа ДОГ-2026/007 или телефонные номера с префиксами +7(999)123-45-67? Извлечение чисел из такого хаоса — типичная задача при работе с импортированными данными, отчётами или базами клиентов. Вручную редактировать сотни строк нереально, но в Excel есть как минимум 7 способов автоматизировать этот процесс.
В этой статье мы разберём методы разной сложности: от простых функций Excel (которые справится даже новичок) до пользовательских макросов VBA для обработки тысяч строк за секунды. Вы узнаете, как вытащить цифры из начала, конца или середины текста, как сохранить ведущие нули (например, в номерах 0012345), и почему стандартная функция ЗНАЧЕН() часто даёт сбой. А ещё — как избежать типичной ошибки с преобразованием чисел в даты (например, когда "1-2" становится "01-фев").
1. Почему стандартные функции Excel не всегда работают
Многие пользователи первым делом пытаются применить функцию ЗНАЧЕН() (или VALUE() в английской версии) — и получают ошибку #ЗНАЧ!. Всё потому, что эта функция преобразует только строки, которые Excel распознаёт как числа. Например, она справится с "123" или "50.5", но вернёт ошибку для "А123" или "100р".
Другая распространённая проблема — автоматическое форматирование. Если в ячейке было 00123, а после очистки осталось 123, Excel может отбросить ведущие нули, превратив число в дату или просто урезав его. Это критично для номеров договоров, инвентарных номеров или postal-кодов. Решение — предварительно отформатировать ячейки как Текстовый формат.
⚠️ Внимание: Функции вродеПСТР()илиЛЕВСИМВ()не помогут, если положение цифр в строке не фиксировано. Например, в"Товар 123 (5 шт)"цифры разбросаны по разным позициям — здесь нужны регулярные выражения или макросы.
- 🔢 Число в начале:
"123АБВ"→123 - 🔤 Число в конце:
"АБВ123"→123 - 🔢🔤 Числа и буквы чередуются:
"А1Б2В3"→123 - 📊 Смешанный формат:
"Договор №123 от 01.01.2026"→1232026
2. Способ 1: Функции ПОИСК + ПСТР (для чисел в начале/конце строки)
Если цифры в ваших данных всегда стоят в начале или конце строки, можно обойтись без макросов. Например, для извлечения чисел из начала ячейки A1 (где текст в формате "123АБВ") используйте формулу:
=ЗНАЧЕН(ЛЕВСИМВ(A1; НАЙТИ(МИН(ЕСЛИОШИБКА(НАЙТИ(СТРОКА($A$1:$A$10);A1);""));A1)-1)))
Но этот вариант громоздкий и требует массива. Гораздо проще — комбинация ПОИСК() с ПСТР():
=ПСТР(A1;1;ПОИСК(МИН(ЕСЛИОШИБКА(НАЙТИ({0;1;2;3;4;5;6;7;8;9};A1);""));A1)-1)
Для чисел в конце строки (формат "АБВ123") подойдёт:
=ПСТР(A1;ПОИСК(МАКС(ЕСЛИОШИБКА(НАЙТИ({0;1;2;3;4;5;6;7;8;9};A1);0)));ДЛСТР(A1))
⚠️ Внимание: Эти формулы работают только в Excel 2019 и новее (или в Office 365). В старых версиях придётся использовать массив с CTRL+SHIFT+ENTER.
3. Способ 2: Пользовательская функция VBA (универсальный метод)
Для обработки любых комбинаций букв и цифр (например, "А1Б2В3Г4" → 1234) проще всего написать простой макрос. Откройте редактор VBA (ALT+F11), вставьте новый модуль (Insert → Module) и добавьте этот код:
Function ExtractNumbers(rng As Range) As String
Dim strInput As String
Dim strOutput As String
Dim i As Integer
strInput = rng.Value
strOutput = ""
For i = 1 To Len(strInput)
If IsNumeric(Mid(strInput, i, 1)) Then
strOutput = strOutput & Mid(strInput, i, 1)
End If
Next i
ExtractNumbers = strOutput
End Function
Теперь в любой ячейке можно использовать функцию =ExtractNumbers(A1). Она вернёт все цифры подряд, игнорируя буквы, знаки препинания и пробелы. Преимущества метода:
- ⚡ Работает со всеми версиями Excel (включая 2003)
- 🔄 Обрабатывает динамические данные (обновляется при изменении исходной ячейки)
- 📌 Сохраняет ведущие нули (если ячейка отформатирована как текст)
4. Способ 3: Power Query (для больших массивов данных)
Если вам нужно очистить тысячи строк (например, импорт из 1С или CRM-системы), оптимально использовать Power Query (в Excel 2016+ или Office 365). Алгоритм:
- Выделите исходные данные →
Данные → Из таблицы/диапазона. - В редакторе Power Query выделите столбец →
Преобразовать → Извлечь → Текст после делителя. - В качестве делителя укажите регулярное выражение
[^0-9](удалит всё, кроме цифр). - Нажмите
Закрыть и загрузить.
Преимущество Power Query — независимость от формул: данные обновляются при изменении источника, а сам процесс можно автоматизировать. Минус — в старых версиях Excel (до 2016) этот инструмент недоступен.
Как включить Power Query в Excel 2010-2013?
В этих версиях Power Query называется надстройкой "Power Query для Excel". Скачайте её бесплатно с сайта Microsoft и установите через Файл → Параметры → Надстройки → Управление надстройками COM.
| Метод | Сложность | Поддерживает ведущие нули | Работает в Excel 2010 | Обрабатывает большие данные |
|---|---|---|---|---|
Функции ПОИСК+ПСТР |
Средняя | ❌ Нет | ✅ Да (с массивом) | ❌ Медленно |
| Пользовательская функция VBA | Низкая | ✅ Да | ✅ Да | ✅ Быстро |
| Power Query | Высокая | ✅ Да | ❌ Нет | ✅ Очень быстро |
| Регулярные выражения (через VBA) | Очень высокая | ✅ Да | ✅ Да | ✅ Быстро |
5. Способ 4: Регулярные выражения (для опытных пользователей)
Если вы знакомы с регулярными выражениями (regex), можно использовать их прямо в Excel через VBA. Этот метод самый гибкий — он позволяет извлекать цифры по сложным шаблонам (например, только первые 3 цифры или числа после определённого символа).
Добавьте в модуль VBA эту функцию:
Function ExtractNumbersRegex(rng As Range, Optional pattern As String = "[0-9]") As String
Dim regex As Object
Dim matches As Object
Dim result As String
Set regex = CreateObject("VBScript.RegExp")
regex.Global = True
regex.Pattern = pattern
If regex.Test(rng.Value) Then
Set matches = regex.Execute(rng.Value)
For Each match In matches
result = result & match.Value
Next match
End If
ExtractNumbersRegex = result
End Function
Теперь вы можете:
- 🔢 Извлечь все цифры:
=ExtractNumbersRegex(A1) - 📌 Взять только первые 4 цифры:
=ExtractNumbersRegex(A1; "[0-9]{4}") - 💰 Оставить числа после символа "$":
=ExtractNumbersRegex(A1; "(?<=\$)[0-9]+")
Убедитесь, что включена поддержка VBA (Файл → Параметры → Надстройки → Разработчик)
Сохраните файл как .xlsm
Проверьте, что в ячейках нет скрытых символов (используйте =КОДСИМВ())
Отформатируйте целевые ячейки как Текстовый формат
-->
6. Способ 5: Надстройка "Текст по столбцам" (для простых случаев)
Если цифры в ваших данных всегда отделены от букв одним и тем же разделителем (например, "АБВ-123" или "123:АБВ"), можно воспользоваться стандартным инструментом Текст по столбцам:
- Выделите столбец с данными.
- Перейдите в
Данные → Текст по столбцам. - Выберите
С разделителями→ укажите ваш разделитель (дефис, двоеточие и т.д.). - На шаге формата данных выберите
Текстовыйдля столбца с цифрами.
Этот метод подходит для структурированных данных, где разделитель стабилен. Например, он легко справится с преобразованием "Договор-12345" в 12345, но бессилен против "А1Б2В3".
⚠️ Внимание: Если в исходных данных несколько разделителей (например,"АБВ-123/456"), инструмент разобьёт строку на несколько частей. В этом случае лучше использоватьPower QueryилиVBA.
7. Способ 6: Формула массива для Excel 365 (динамические массивы)
В Excel 365 и Excel 2021 появилась поддержка динамических массивов, что упрощает работу с текстом. Чтобы извлечь все цифры из диапазона A1:A10, используйте:
=ТЕКСТСОЕДИНИТЬ("";ИСТИНА;ЕСЛИОШИБКА(--ПОДСТАВИТЬ(ПОСИМВ(A1:A10;ПОСЛЕДОВАТ(1;МАКС(ДЛСТР(A1:A10))));"");""))
Эта формула:
- Разбивает каждую строку на символы (
ПОСИМВ). - Пробует преобразовать каждый символ в число (
--). - Игнорирует ошибки (буквы и знаки).
- Объединяет оставшиеся цифры (
ТЕКСТСОЕДИНИТЬ).
Преимущество: формула автоматически заполняет соседние ячейки (thanks to spill range), поэтому не нужно копировать её вниз.
8. Способ 7: Онлайн-сервисы (если Excel недоступен)
Если у вас нет Excel или нужно обработать данные одноразово, можно воспользоваться бесплатными онлайн-инструментами:
- 🌐 TextFixer — извлекает цифры из текста, поддерживает регулярные выражения.
- 📊 ConvertCSV — загружаете файл
.csvили.xlsx, получаете очищенные данные. - 🔧 Regex101 — для тестирования регулярных выражений перед использованием в Excel.
Минусы онлайн-сервисов:
- 🔒 Конфиденциальность: не загружайте чувствительные данные (номера паспортов, банковские реквизиты).
- 📶 Ограничения по размеру файла (обычно до 1-5 МБ).
- ⚙️ Нет автоматизации: придётся повторять процесс при обновлении данных.
FAQ: Частые вопросы по очистке чисел в Excel
❓ Почему после извлечения цифр Excel показывает даты вместо чисел?
Excel автоматически преобразует числа в формат даты, если они соответствуют шаблону (например, 1-2 становится 01-фев или 31-12 — 31 дек). Чтобы избежать этого:
- Перед извлечением отформатируйте целевые ячейки как
Текстовый. - Используйте апостроф перед числом (например,
'123). - В VBA добавьте строку
ExtractNumbers = "'" & strOutput.
❓ Как извлечь цифры из ячеек с формулами (а не значениями)?
Функции Excel работают с значениями ячеек, а не формулами. Если в A1 формула ="АБВ"&123, то =ExtractNumbers(A1) вернёт 123, но если нужно обработать саму формулу как текст — сначала преобразуйте её в строку:
- Скопируйте ячейку с формулой.
- Вставьте как
Значения(CTRL+ALT+V → Т). - Примените функцию очистки.
Для автоматизации используйте VBA:
Range("B1").Value = ExtractNumbers(Range("A1").Formula)
❓ Можно ли извлечь цифры, сохраняя разделители (например, "123-456" → "123456")?
Да, модифицируйте функцию VBA или regex. Например, чтобы оставить дефисы между цифрами:
Function ExtractNumbersWithDash(rng As Range) As String
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "[^0-9-]" ' Сохраняем цифры и дефисы
ExtractNumbersWithDash = regex.Replace(rng.Value, "")
End Function
Или используйте regex [^0-9\-] в Power Query.
❓ Почему макрос работает медленно на больших данных?
VBA обрабатывает данные построчно, что тормозит при работе с десятками тысяч строк. Ускорить выполнение помогут:
- 🔄 Отключение обновления экрана:
Application.ScreenUpdating = False - ⚡ Обработка массива в памяти (вместо ячеек).
- 📊 Использование Power Query (он оптимизирован для больших данных).
Пример оптимизированного кода:
Sub FastExtractNumbers()
Application.ScreenUpdating = False
Dim data As Variant, result() As String
Dim i As Long, j As Long
Dim str As String, char As String
data = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
ReDim result(1 To UBound(data, 1))
For i = 1 To UBound(data, 1)
str = data(i, 1)
For j = 1 To Len(str)
char = Mid(str, j, 1)
If IsNumeric(char) Then result(i) = result(i) & char
Next j
Next i
Range("B1").Resize(UBound(result)).Value = Application.Transpose(result)
Application.ScreenUpdating = True
End Sub
❓ Как извлечь только целые числа, игнорируя дроби (например, "123.45" → "123")?
Используйте regex с шаблоном \d+ (только целые числа) или модифицируйте функцию VBA:
Function ExtractIntegers(rng As Range) As String
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "\D" ' Удаляем всё, кроме цифр
ExtractIntegers = regex.Replace(rng.Value, "")
' Удаляем всё после точки (если она есть)
If InStr(ExtractIntegers, ".") > 0 Then
ExtractIntegers = Left(ExtractIntegers, InStr(ExtractIntegers, ".") - 1)
End If
End Function