Почему стандартный подсчёт символов в Excel не работает с цифрами
На первый взгляд, задача подсчёта цифр в диапазоне кажется тривиальной: достаточно использовать функцию ДЛСТР или её английский аналог LEN. Но здесь кроется подвох. Эти функции возвращают общее количество символов в ячейке, включая буквы, пробелы, знаки препинания и даже невидимые символы вроде табуляции. Если ваша ячейка содержит текст "Привет123!", ДЛСТР вернёт 9, хотя цифр там всего 3.
Более того, Excel не различает цифры как символы (например, "5" в тексте) и числа как числовые значения (5 в ячейке с форматом "Числовой"). Для программы это принципиально разные сущности: число 123 в ячейке с форматом Общий хранится как числовое значение, а текст "123" — как строка из трёх символов. Этот нюанс часто становится причиной ошибок при подсчёте.
Дополнительную сложность добавляют:
- 🔢 Отрицательные числа (знак "минус" тоже символ!)
- 💰 Денежные форматы (разделители тысяч и символ валюты)
- 📊 Научная нотация (например,
1,23E+05вместо123000) - 📝 Ведущие нули (в текстовом формате сохраняются, в числовом — обрезаются)
⚠️ Внимание: Если вы работаете с данными, импортированными из CSV или баз данных, проверьте формат ячеек. Часто числа импортируются как текст с невидимыми символами (например, NBSP), что искажает результаты подсчёта.
Способ 1: Функция ДЛСТР + ПОДСТАВИТЬ для текстового диапазона
Самый простой метод работает, если все данные в диапазоне хранятся в текстовом формате. Комбинация функций ДЛСТР и ПОДСТАВИТЬ позволяет удалить все нецифровые символы, а затем посчитать длину оставшейся строки:
=ДЛСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"0";"");"1";"");"2";"");"3";"");"4";"");"5";"");"6";"");"7";"");"8";"");"9";"")
Эта формула последовательно удаляет все цифры от 0 до 9, а затем измеряет длину строки до и после удаления. Разница между исходной длиной (ДЛСТР(A1)) и длиной строки без цифр даст искомое количество:
=ДЛСТР(A1) - ДЛСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(...)))
Для удобства можно создать пользовательскую функцию (см. раздел про VBA) или использовать массивную формулу, которая обработает весь диапазон за один раз:
=СУММПРОИЗВ(--(НЕОШИБКА(ПОИСК(СТРОКА($A$1:$A$10);"0123456789"))))
| Исходные данные (A1:A3) | Формула | Результат |
|---|---|---|
"Привет123!" |
=ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(...)) |
3 |
"Тест: 45.67 руб." |
=ДЛСТР(A2)-ДЛСТР(ПОДСТАВИТЬ(...)) |
4 |
"100%" |
=ДЛСТР(A3)-ДЛСТР(ПОДСТАВИТЬ(...)) |
3 |
Способ 2: Подсчёт цифр в числовых ячейках (без текста)
Если ваш диапазон содержит только числа (без текста), задача упрощается. Здесь поможет комбинация функций ЦЕЛОЕ, ЛОГ10 и обработка отрицательных значений:
=ЕСЛИ(A1<0; ДЛСТР(ТЕКСТ(ABS(A1);"0")); ДЛСТР(ТЕКСТ(A1;"0")))
Разберём по шагам:
ABS(A1)— убирает знак "минус" для отрицательных чисел.ТЕКСТ(..., "0")— преобразует число в текст без десятичных разрядов.ДЛСТР— считает количество символов в полученной строке.
Для чисел с десятичными разрядами используйте формат "0.000..." (количество нулей = количество знаков после запятой):
=ДЛСТР(ПОДСТАВИТЬ(ТЕКСТ(A1;"0.00");",";"")) - 1
⚠️ Внимание: Эта формула не учитывает научную нотацию (например, 1E+10 будет обработано как 4 символа, хотя фактически число содержит 11 цифр). Для таких случаев требуется VBA или предварительное преобразование формата.
Способ 3: Массивные формулы для смешанных данных
Когда диапазон содержит и числа, и текст, пригодится массивная формула на основе СУММПРОИЗВ и ПОИСКПОЗ. Она проверяет каждый символ в ячейке на принадлежность к цифрам (0-9):
=СУММПРОИЗВ(ДЛСТР(A1:A10)-ДЛСТР(ПОДСТАВИТЬ(A1:A10;СТРОКА($1:$9);"")))
Как это работает:
- 🔹
СТРОКА($1:$9)создаёт вертикальный массив чисел от 1 до 9 (и 0, если расширить до$0:$9). - 🔹
ПОДСТАВИТЬудаляет из каждой ячейки все цифры, соответствующие текущему числу из массива. - 🔹
ДЛСТРвычисляет разницу между исходной длиной и длиной после удаления. - 🔹
СУММПРОИЗВсуммирует результаты по всему диапазону.
Для Excel 365 и 2021 доступна более лаконичная версия с LET:
=LET(
цифры; СТРОКА(0:9);
данные; A1:A10;
СУММ(ДЛСТР(данные) - ДЛСТР(ПОДСТАВИТЬ(данные; цифры; "")))
)
Почему формула не работает с русскими буквами?
Массивная формула ищет только символы из диапазона 0-9. Русские буквы (или латиницу) она игнорирует, так как они не входят в список заменяемых символов. Если нужно исключить и буквы, добавьте в ПОДСТАВИТЬ дополнительные диапазоны, например, СИМВОЛ(1040:1103) для кириллицы.
Способ 4: Пользовательская функция VBA для гибкого подсчёта
Если вам нужно регулярно считать цифры в больших диапазонах, создайте собственную функцию VBA. Она позволит:
- 📌 Игнорировать знаки препинания и пробелы.
- 📌 Учитывать ведущие нули.
- 📌 Обрабатывать научную нотацию.
- 📌 Работать с диапазонами любой размерности.
Откройте редактор VBA (Alt+F11), вставьте новый модуль и добавьте код:
Function CountDigits(rng As Range) As Long
Dim cell As Range
Dim char As String
Dim digitCount As Long
digitCount = 0
For Each cell In rng
For i = 1 To Len(cell.Value)
char = Mid(cell.Value, i, 1)
If char >= "0" And char <= "9" Then
digitCount = digitCount + 1
End If
Next i
Next cell
CountDigits = digitCount
End Function
Теперь в Excel можно использовать =CountDigits(A1:A100). Функция вернёт общее количество цифр во всём диапазоне.
🔹 Включить поддержку макросов в Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов
🔹 Сохранить файл как .xlsm (с поддержкой макросов)
🔹 Проверить диапазон на наличие объединённых ячеек (они могут вызвать ошибку)
🔹 Убедиться, что в данных нет символов с кодом > 255 (они обрабатываются иначе)
-->
Способ 5: Power Query для обработки больших данных
Для диапазонов с десятками тысяч строк оптимально использовать Power Query (вкладка Данные → Получение данных). Алгоритм:
- Загрузите диапазон в Power Query (
Из таблицы/диапазона). - Добавьте пользовательский столбец с формулой:
= Text.Select([Column1], {"0".."9"}) - Добавьте ещё один столбец с
= Text.Length([Custom]). - Удалите вспомогательные столбцы, оставив только подсчёт.
- Загрузите результат обратно в Excel.
Преимущества метода:
- ⚡ Обрабатывает миллионы строк без тормозов.
- 🔄 Позволяет обновлять данные одним кликом.
- 📊 Интегрируется с другими преобразованиями (фильтрация, сортировка).
⚠️ Внимание: Power Query преобразует все данные в текстовый формат. Если вам нужно сохранить исходные числовые значения, дублируйте столбец до начала преобразований.
Типичные ошибки и как их избежать
Даже опытные пользователи Excel сталкиваются с проблемами при подсчёте цифр. Вот самые распространённые:
| Ошибка | Причина | Решение |
|---|---|---|
| Формула возвращает #ЗНАЧ! | В диапазоне есть объединённые ячейки или ошибки (#ДЕЛ/0!, #Н/Д). | Используйте ЕСЛИОШИБКА или разъедините ячейки. |
| Неправильный подсчёт для денежных форматов | Символ валюты (₽, $, €) и разделители тысяч считаются как символы. | Преобразуйте данные в текст с ТЕКСТ и укажите формат без символов. |
| ВBA-функция не видит ведущие нули | Числа с ведущими нулями хранятся как текст, но Excel их обрезает. | Предварительно отформатируйте ячейки как Текстовый. |
| Массивная формула не обновляется | Забыли ввести как массивую (Ctrl+Shift+Enter). |
Перевведите формулу с правильной комбинацией клавиш. |
Ещё одна частая проблема — невидимые символы, например, NBSP (неразрывный пробел) или CR/LF (переносы строк). Чтобы их обнаружить, используйте функцию КОДСИМВ для проверки ASCII-кодов символов:
=КОДСИМВ(ЛЕВСИМВ(A1))
Если код возвращает 160 вместо 32 (обычный пробел), значит в данных есть NBSP. Удалите его через ПОДСТАВИТЬ(A1;СИМВОЛ(160);"").
FAQ: Ответы на частые вопросы
Можно ли посчитать цифры в диапазоне без VBA?
Да, используйте массивую формулу на основе СУММПРОИЗВ и ДЛСТР (см. Способ 3). Для Excel 365 подойдёт также функция LET с СТРОКА.
Почему формула считает пробелы как цифры?
Пробелы не являются цифрами, но если вы используете ДЛСТР без предварительной очистки данных, они включаются в общую длину строки. Чтобы исключить пробелы, добавьте в формулу ПОДСТАВИТЬ(A1;" "; "").
Как посчитать цифры в ячейках с дробными числами?
Для дробных чисел используйте формат ТЕКСТ(ячейка; "0.000..."), где количество нулей после точки равно количеству десятичных знаков. Затем примените ДЛСТР и вычтите 1 (для точки). Пример: =ДЛСТР(ПОДСТАВИТЬ(ТЕКСТ(A1;"0.00");",";"")) - 1.
Работает ли этот метод в Google Sheets?
Да, все приведённые формулы (кроме VBA) совместимы с Google Sheets. Для массивов используйте ARRAYFORMULA вместо Ctrl+Shift+Enter.
Как посчитать только уникальные цифры в диапазоне?
Для подсчёта уникальных цифр используйте комбинацию СЦЕПИТЬ, ПОДСТАВИТЬ и ДЛСТР с удалением повторов. Пример для одной ячейки: =ДЛСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"0";"|");"0";"");"||";"|"))-1 (аналогично для других цифр).