Почему стандартные функции Excel не справляются с числами прописью
Вы когда-нибудь пытались в Microsoft Excel автоматически преобразовать цифру 1234 в текст "одна тысяча двести тридцать четыре"? Если да, то наверняка столкнулись с тем, что стандартных функций для этой задачи... попросту нет. В отличие от 1С или специализированных бухгалтерских программ, где такая опция встроена по умолчанию, Excel из коробки предлагает только базовые инструменты для работы с текстом и числами.
Причина кроется в архитектуре программы: Excel изначально заточен под вычисления, графики и аналитику, а не на лингвистическую обработку. Однако это не значит, что задача невыполнима! Существует как минимум 5 рабочих способов получить числа прописью — от простых формул до написания собственных макросов. Далее разберём каждый из них, оценим плюсы и минусы, а также покажем, как адаптировать решения под русскоязычные реалии (включая правильные падежи для рублей и копеек).
Способ 1: Использование функции ЧИСЛОТЕКСТ (для русскоязычной версии Excel)
Если у вас установлена русская версия Excel (2013 и новее), то самый простой способ — воспользоваться встроенной функцией =ЧИСЛОТЕКСТ(). Она автоматически преобразует числа в текстовый формат с учётом правил русского языка, включая склонение валют.
Синтаксис функции:
=ЧИСЛОТЕКСТ(число; [формат])
Где [формат] — необязательный аргумент, определяющий стиль отображения. Например:
- 📌
=ЧИСЛОТЕКСТ(1234,56; "Р")→ "одна тысяча двести тридцать четыре рубля пятьдесят шесть копеек" - 📌
=ЧИСЛОТЕКСТ(42; "Д")→ "сорок два дня" - 📌
=ЧИСЛОТЕКСТ(0,75; "Ч")→ "ноль целых семьдесят пять сотых"
| Формат | Пример результата | Когда использовать |
|---|---|---|
"Р" | 100 рублей 00 копеек | Финансовые документы, счета, накладные |
"Д" | пять дней | Сроки, временные интервалы |
"М" | два месяца | Календарное планирование |
"Ч" | ноль целых пять десятых | Технические измерения, доли |
⚠️ Внимание: ФункцияЧИСЛОТЕКСТдоступна только в русскоязычных версиях Excel. В английской версии (Excel US/EN) её аналога нет — там используется функция=SpellNumber(), но она требует подключения надстройки Analysis ToolPak и работает только с английскими числительными.
Способ 2: Пользовательская функция на VBA для любых версий Excel
Если у вас англоязычная версия Excel или нужно больше гибкости (например, кастомизация падежей), придётся написать собственную функцию на VBA. Этот метод работает во всех версиях, включая Excel 2010-2023 и Office 365.
Следуйте инструкции:
- Откройте редактор VBA: нажмите
Alt + F11. - В меню выберите
Insert → Module. - Вставьте следующий код:
Function NumToText(ByVal n As Double, Optional currency As String = "руб") As String' Функция для преобразования чисел в текст прописью (русский язык)
Dim Rubles As Variant, Kop As Variant
Dim nRub As Long, nKop As Long
Dim sRub As String, sKop As String
n = Round(n, 2)
nRub = Int(n)
nKop = Round((n - nRub) * 100, 0)
' Обработка рублей
sRub = ConvertLessThanThousand(nRub Mod 1000) & " "
sRub = sRub & Choose((nRub Mod 1000) Mod 10 + 1, "рублей", "рубль", "рубля", "рубля", "рубля", "рублей", "рублей", "рублей", "рублей", "рублей")
' Обработка тысяч
If nRub >= 1000 Then
sRub = ConvertLessThanThousand(Int(nRub / 1000) Mod 1000) & " " & Choose(Int(nRub / 1000) Mod 100, _
"тысяч", "тысяча", "тысячи", "тысячи", "тысячи", "тысяч", "тысяч", "тысяч", "тысяч", "тысяч") & " " & sRub
End If
' Обработка миллионов
If nRub >= 1000000 Then
sRub = ConvertLessThanThousand(Int(nRub / 1000000) Mod 1000) & " " & Choose(Int(nRub / 1000000) Mod 100, _
"миллионов", "миллион", "миллиона", "миллиона", "миллиона", "миллионов", "миллионов", "миллионов", "миллионов", "миллионов") & " " & sRub
End If
' Обработка копеек
If nKop > 0 Then
sKop = ConvertLessThanThousand(nKop) & " "
sKop = sKop & Choose(nKop Mod 10 + 1, "копеек", "копейка", "копейки", "копейки", "копейки", "копеек", "копеек", "копеек", "копеек", "копеек")
NumToText = sRub & " " & sKop
Else
NumToText = sRub & " 00 копеек"
End If
End Function
Function ConvertLessThanThousand(ByVal n As Long) As String
Dim s As String
Dim Hundreds As Variant, Tens As Variant, Ones As Variant
Hundreds = Array("", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот")
Tens = Array("", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто")
Ones = Array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять")
s = Hundreds(Int(n / 100))
If n Mod 100 >= 20 Then
s = s & " " & Tens(Int((n Mod 100) / 10)) & " " & Ones(n Mod 10)
ElseIf n Mod 100 >= 10 Then
Select Case n Mod 100
Case 10: s = s & " десять"
Case 11: s = s & " одиннадцать"
Case 12: s = s & " двенадцать"
Case 13: s = s & " тринадцать"
Case 14: s = s & " четырнадцать"
Case 15: s = s & " пятнадцать"
Case 16: s = s & " шестнадцать"
Case 17: s = s & " семнадцать"
Case 18: s = s & " восемнадцать"
Case 19: s = s & " девятнадцать"
End Select
Else
s = s & " " & Tens(Int((n Mod 100) / 10)) & " " & Ones(n Mod 10)
End If
ConvertLessThanThousand = Application.WorksheetFunction.Trim(s)
End Function
- Сохраните модуль и закройте редактор.
Теперь в любой ячейке можно использовать функцию =NumToText(A1), где A1 — ячейка с числом. Например, для числа 1234,56 результат будет: "одна тысяча двести тридцать четыре рубля пятьдесят шесть копеек".
☑️ Проверка перед использованием VBA-кода
⚠️ Внимание: Если вы передаёте в функциюNumToTextотрицательные числа, добавьте в начало кода строкуn = Abs(n), чтобы избежать ошибок. Также учтите, что функция не обрабатывает числа больше 999 999 999 (миллиард).
Способ 3: Формулы без VBA (для небольших чисел)
Если вам нужно преобразовать небольшие числа (до 9999) и вы не хотите связываться с VBA, можно обойтись комбинацией стандартных функций: ЕСЛИ(), ВЫБОР() и ТЕКСТ(). Этот метод громоздкий, но работает без макросов.
Пример формулы для чисел от 0 до 999:
=ЕСЛИ(A1=0;"ноль";
ВЫБОР(ЦЕЛОЕ(A1/100);
""; "сто"; "двести"; "триста"; "четыреста"; "пятьсот"; "шестьсот"; "семьсот"; "восемьсот"; "девятьсот") & " " &
ЕСЛИ(И(ОСТАТ(A1;100)<20;ОСТАТ(A1;100)>=10);
ВЫБОР(ОСТАТ(A1;100)-9;"десять";"одиннадцать";"двенадцать";"тринадцать";"четырнадцать";"пятнадцать";"шестнадцать";"семнадцать";"восемнадцать";"девятнадцать");
ВЫБОР(ЦЕЛОЕ(ОСТАТ(A1;100)/10);
"";"десять";"двадцать";"тридцать";"сорок";"пятьдесят";"шестьдесят";"семьдесят";"восемьдесят";"девяносто") & " " &
ВЫБОР(ОСТАТ(A1;10);
"";"один";"два";"три";"четыре";"пять";"шесть";"семь";"восемь";"девять")))
Для обработки тысяч придётся дублировать эту конструкцию и добавлять условия. Главный минус метода — формула становится крайне громоздкой и сложной для редактирования. Рекомендуем использовать только для разовых задач с ограниченным диапазоном чисел.
Способ 4: Надстройка NumWord (для продвинутых пользователей)
Если вам регулярно нужно преобразовывать числа в текст прописью, имеет смысл установить специализированную надстройку. Одна из самых популярных — NumWord (разработчик ExcelLab). Она поддерживает:
- 🌍 Многовалютность (рубли, доллары, евро и др.)
- 📅 Разные форматы дат ("первое января две тысячи двадцать третьего года")
- 🔢 Числа до 999 триллионов
- 📊 Падежное согласование (например, "двум тысячам рублям")
Установка надстройки:
- Скачайте файл NumWord.xlam с официального сайта.
- В Excel перейдите в
Файл → Параметры → Надстройки. - Нажмите
Перейти...внизу окна, затемОбзори выберите скачанный файл. - После установки в списке функций появится категория
NumWordс функцией=NUMWORD().
Пример использования:
=NUMWORD(A1; "RUR"; TRUE)
Где:
A1— ячейка с числом;"RUR"— код валюты (рубли);TRUE— включить вывод копеек.
⚠️ Внимание: Надстройки от сторонних разработчиков могут содержать вредоносный код. Перед установкой проверьте файл на VirusTotal и скачивайте только с официальных источников.
Способ 5: Онлайн-конвертеры (для разовых задач)
Если вам нужно преобразовать числа прописью один-два раза и устанавливать надстройки или писать код нет желания, можно воспользоваться онлайн-сервисами. Они работают прямо в браузере и не требуют установки.
| Сервис | Ссылка | Особенности |
|---|---|---|
| Числа прописью | chisla-propisyu.ru | Поддерживает рубли, доллары, евро, гривны. Есть API для автоматизации. |
| NumWord | numword.com | Английская версия, но есть русифицированный вариант. Ограничение: до 1 млн. |
| Excel-Online | excel-online.net | Эмулирует функцию ЧИСЛОТЕКСТ для англоязычных версий. |
Как пользоваться:
- Скопируйте число из Excel.
- Вставьте его в поле на сайте.
- Выберите нужный формат (валюта, падеж и т. д.).
- Скопируйте результат обратно в Excel как текст.
Минусы онлайн-конвертеров:
- 🔒 Конфиденциальность: если вы работаете с финансовыми данными, передача их на сторонние серверы может быть небезопасна.
- 🚫 Ограничения: большинство сервисов не обрабатывают числа больше 1 миллиарда.
- ⏳ Ручной труд: при большом объёме данных процесс становится утомительным.
Типичные ошибки и как их избежать
Даже опытные пользователи Excel иногда сталкиваются с проблемами при преобразовании чисел в текст прописью. Вот самые распространённые ошибки и способы их решения:
- 💰 Неправильное склонение валют: функция выводит "1 рубль", но "2 рубля", а вам нужно "2 рублей". Решение: отредактируйте код VBA (см. способ 2) или используйте надстройку с настройкой падежей.
- 📉 Округление копеек: при преобразовании
1234.567копейки округляются до 57 вместо 56. Решение: используйте функцию=ОКРУГЛ()перед преобразованием:=NumToText(ОКРУГЛ(A1;2)). - 🚫 Ошибка #ИМЯ?: появляется, если функция
ЧИСЛОТЕКСТне распознаётся. Решение: проверьте язык интерфейса Excel (должен быть русский) или используйте VBA. - 🔢 Ограничение на размер числа: функции не работают с числами больше 999 999 999. Решение: разбейте число на части (миллиарды, миллионы) и обработайте каждую отдельно.
Ещё одна частая проблема — лишние пробелы в результате. Чтобы их убрать, оберните функцию в СЖПРОБЕЛЫ():
=СЖПРОБЕЛЫ(ЧИСЛОТЕКСТ(A1; "Р"))
Почему Excel не умеет преобразовывать числа в текст "из коробки"?
Microsoft Excel изначально разрабатывался как инструмент для математических вычислений и анализа данных, а не для лингвистической обработки. Встроенные функции для работы с текстом (например, ЛЕВСИМВ(), ПОИСК()) ориентированы на манипуляции с символами, а не на генерацию человекочитаемого текста. Для сравнения: в 1С или SAP такие функции есть по умолчанию, потому что эти системы изначально создавались для бухгалтерии, где числа прописью используются ежедневно (например, в платежных поручениях).
FAQ: Ответы на частые вопросы
Можно ли преобразовать числа прописью в Excel Online?
В Excel Online (браузерная версия) функция ЧИСЛОТЕКСТ не работает, так как она относится к надстройкам, недоступным в онлайн-режиме. Альтернативы:
- Используйте Power Automate (бывший Microsoft Flow) для автоматизации преобразования.
- Скопируйте данные в настольную версию Excel, выполните преобразование, затем вставьте обратно.
- Воспользуйтесь онлайн-конвертером (см. способ 5).
Как сделать, чтобы "1 рубль" отображался как "один рубль" (с маленькой буквы)?
По умолчанию функция ЧИСЛОТЕКСТ и большинство VBA-скриптов возвращают текст с заглавной буквы. Чтобы сделать первую букву строчной, используйте комбинацию функций:
=СТРОЧН(ЛЕВСИМВ(ЧИСЛОТЕКСТ(A1))) & ПРАВСИМВ(ЧИСЛОТЕКСТ(A1);ДЛСТР(ЧИСЛОТЕКСТ(A1))-1)
Или в VBA добавьте строку:
NumToText = LCase(Left(NumToText, 1)) & Mid(NumToText, 2)
Поддерживаются ли дроби (например, 1/2 → "половина")?
Стандартные функции Excel (включая ЧИСЛОТЕКСТ) не умеют преобразовывать дроби в текст. Для этой задачи потребуется:
- Написать отдельную VBA-функцию с логикой для дробей (например,
1/2→ "половина",1/4→ "четверть"). - Использовать надстройку вроде NumWord, где есть поддержка дробей.
Пример кода для простых дробей:
Function FractionToText(numerator As Integer, denominator As Integer) As String
Select Case denominator
Case 2: FractionToText = "половина"
Case 3: FractionToText = "треть"
Case 4: FractionToText = "четверть"
' ... добавьте другие дроби
Case Else: FractionToText = numerator & "/" & denominator
End Select
End Function
Как автоматически обновлять числа прописью при изменении исходных данных?
Если вы используете:
- Формулы (
ЧИСЛОТЕКСТили комбинациюЕСЛИ/ВЫБОР): обновление происходит автоматически при изменении исходной ячейки. - VBA-функцию: также обновляется автоматически, если в настройках Excel включен режим
Автоматический пересчёт(Формулы → Параметры вычислений → Автоматически). - Надстройку: проверьте настройки надстройки — некоторые требуют ручного обновления (кнопка
Refresh).
Если данные не обновляются, нажмите F9 для принудительного пересчёта.
Можно ли преобразовать числа прописью на украинском/белорусском языке?
Да, но потребуется адаптировать код VBA под правила другого языка. Основные отличия:
- Для украинского: замените массивы числительных в функции
ConvertLessThanThousandна украинские эквиваленты (например, "один" → "один", "два" → "два/дві" в зависимости от рода). - Для белорусского: добавьте поддержку склонений по падежам (в белорусском языке их 6).
Готовые решения:
- Надстройка NumWord поддерживает украинский и белорусский языки (нужно выбрать соответствующий параметр при установке).
- На сайте GitHub есть открытые VBA-скрипты для разных языков (ищите по запросу "number to text [язык]").