Введение: зачем Excelу «говорить» числами?
Вы когда-нибудь сталкивались с задачей автоматически сгенерировать в Excel текстовый вариант числа? Например, превратить 1 256 в «одна тысяча двести пятьдесят шесть»? Это не просто прихоть — такие преобразования требуются в бухгалтерских документах (пропись сумм в договорах), чеках, отчётах для госорганов и даже при создании персонализированных сертификатов. Вручную переписывать сотни строк? Неэффективно. К счастью, Excel предлагает несколько способов автоматизировать этот процесс — от встроенных функций до пользовательских скриптов.
Главная сложность кроется в русской морфологии: числа изменяются по родам («один рубль», но «одна копейка»), падежам («пятью тысячами») и имеют исключения («сорок, девяносто»). Готовых функций для такого преобразования в Excel нет — но есть обходные пути. В этой статье разберём 5 рабочих методов с примерами для русского языка, включая формулы, VBA-макросы и сторонние надстройки. Вы узнаете, какой способ выбрать в зависимости от объёма данных и требуемой точности.
Способ 1: Функция ПРОПНАЧ (для английского) и её ограничения
Начнём с очевидного: в Excel есть встроенная функция ПРОПНАЧ() (англ. SPELLNUMBER), которая преобразует числа в текст. Но тут есть подвох: она работает только для английского языка. Если вы попробуете применить её к русскоязычной версии Excel, получите ошибку #ИМЯ? или английский вариант числа («one thousand» вместо «одна тысяча»).
Чтобы функция заработала на английском, выполните:
- Переключите язык интерфейса Excel на английский в
Файл → Параметры → Язык. - Введите формулу:
=SPELLNUMBER(1256) - Получите результат: «one thousand, two hundred fifty-six».
⚠️ Внимание: Даже если вы используете английскую версию функции, она не учитывает валюту (рубли/доллары) и падежи. Для русских документов этот метод бесполезен без дополнительных доработок.
Если вам срочно нужно преобразовать числа на английском, этот способ сработает. Для русского языка читайте дальше — там интереснее!
Способ 2: Пользовательская функция на VBA для русского языка
Самый гибкий и точный метод — создать пользовательскую функцию на VBA, которая будет учитывать все нюансы русского языка. Ниже приведён код, который преобразует числа от 0 до 999 999 999 с правильными окончаниями для рублей и копеек.
Как установить:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - В меню выберите
Insert → Module. - Скопируйте туда этот код:
Function NumToText(ByVal n As Currency, Optional valuta As String = "руб") As StringDim RUB(3) As String, COP(3) As String, temp As String
Dim i As Integer, k As Integer
RUB(0) = "рубль": RUB(1) = "рубля": RUB(2) = "рублей"
COP(0) = "копейка": COP(1) = "копейки": COP(2) = "копеек"
If n = 0 Then NumToText = "ноль " & RUB(2): Exit Function
temp = ""
k = Int(n / 1000000)
If k > 0 Then temp = Million(k, True) & " "
k = Int((n - k * 1000000) / 1000)
If k > 0 Then temp = temp & Thousand(k, True) & " "
k = Int(n - Int(n / 1000) * 1000)
If k > 0 Then temp = temp & Thousand(k, False)
If valuta = "руб" Then
k = k Mod 100
If k >= 11 And k <= 19 Then i = 2 Else i = k Mod 10
Select Case i
Case 1: temp = temp & " " & RUB(0)
Case 2, 3, 4: temp = temp & " " & RUB(1)
Case Else: temp = temp & " " & RUB(2)
End Select
Else
k = k Mod 100
If k >= 11 And k <= 19 Then i = 2 Else i = k Mod 10
Select Case i
Case 1: temp = temp & " " & COP(0)
Case 2, 3, 4: temp = temp & " " & COP(1)
Case Else: temp = temp & " " & COP(2)
End Select
End If
NumToText = Application.WorksheetFunction.Proper(temp)
End Function
Function Million(ByVal n As Integer, ByVal male As Boolean) As String
Million = Thousand(n, male) & " миллион" & Choose(n Mod 100 > 10 And n Mod 100 < 20 Or n Mod 10 <> 1, "ов", "")
End Function
Function Thousand(ByVal n As Integer, ByVal male As Boolean) As String
Dim temp As String, i As Integer
temp = ""
i = Int(n / 100)
If i > 0 Then temp = Hundred(i, male) & " "
i = n Mod 100
If i > 0 Then temp = temp & Tens(i, male)
If n Mod 100 > 10 And n Mod 100 < 20 Then
temp = temp & " тысяч"
Else
Select Case n Mod 10
Case 1: temp = temp & " тысяча"
Case 2, 3, 4: temp = temp & " тысячи"
Case Else: temp = temp & " тысяч"
End Select
End If
Thousand = temp
End Function
Function Hundred(ByVal n As Integer, ByVal male As Boolean) As String
Hundred = Choose(n, "", "сто", "двести", "триста", "четыреста", _
"пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот")
End Function
Function Tens(ByVal n As Integer, ByVal male As Boolean) As String
Dim temp As String
If n < 10 Then
temp = Choose(n, "", "один", "два", "три", "четыре", "пять", _
"шесть", "семь", "восемь", "девять")
ElseIf n < 20 Then
temp = Choose(n, "", "десять", "одиннадцать", "двенадцать", _
"тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", _
"семнадцать", "восемнадцать", "девятнадцать")
Else
temp = Choose(Int(n / 10), "", "десять", "двадцать", "тридцать", _
"сорок", "пятьдесят", "шестьдесят", "семьдесят", _
"восемьдесят", "девяносто")
If n Mod 10 > 0 Then temp = temp & " " & Tens(n Mod 10, male)
End If
Tens = temp
End Function
- Закройте редактор VBA и сохраните файл как
.xlsm(с поддержкой макросов).
Теперь в любой ячейке можно использовать функцию:
- 📌
=NumToText(A1)— преобразует число из ячейкиA1в рубли («одна тысяча двадцать пять рублей»). - 📌
=NumToText(A1; "коп")— преобразует в копейки («пятьдесят шесть копеек»).
Убедитесь, что файл сохранён как .xlsm|
Включите макросы при открытии файла|
Проверьте функцию на числах 0, 1, 5, 11, 21, 100, 101, 999|
Протестируйте с дробными числами (например, 1256.78)
-->
⚠️ Внимание: Функция не обрабатывает отрицательные числа и числа больше 999 999 999. Для расширенной версии добавьте в код обработку минуса и миллиардов.
Способ 3: Формулы без VBA (для чисел до 9999)
Если VBA вам не знаком или макросы отключены, можно обойтись формулами. Этот метод подходит для чисел до 9 999 и требует предварительной настройки таблицы с «словами». Создайте на листе Слова следующий справочник:
| Тип | Значение | Текст |
|---|---|---|
| Единицы | 1 | один |
| 2 | два | |
| 3 | три | |
| 4 | четыре | |
| 5 | пять | |
| 6 | шесть | |
| 7 | семь | |
| 8 | восемь | |
| 9 | девять | |
| Десятки | 10 | десять |
| 20 | двадцать | |
| 30 | тридцать | |
| 40 | сорок | |
| 50 | пятьдесят | |
| 60 | шестьдесят | |
| 70 | семьдесят | |
| 80 | восемьдесят | |
| 90 | девяносто |
Затем используйте эту формулу (для числа в ячейке A1):
=ЕСЛИ(A1=0;"ноль";
ЕСЛИ(A1<10;ДВССЫЛ("Слова!C"&A1+1);
ЕСЛИ(A1<20;ДВССЫЛ("Слова!C"&A1+10);
ЕСЛИ(A1<100;
ДВССЫЛ("Слова!C"&ЦЕЛОЕ(A1/10)+19) &
ЕСЛИ(ОСТАТ(A1;10)>0;" "&ДВССЫЛ("Слова!C"&ОСТАТ(A1;10)+1);"");
ЕСЛИ(A1<1000;
ДВССЫЛ("Слова!C"&ЦЕЛОЕ(A1/100)+29) & " " &
ЕСЛИ(ОСТАТ(A1;100)>0;NumToText(ОСТАТ(A1;10));"") & " сот";
ЕСЛИ(A1<10000;
NumToText(ЦЕЛОЕ(A1/1000)) &
" тысяча" &
ЕСЛИ(ОСТАТ(A1;1000)>0;" "&NumToText(ОСТАТ(A1;100));"");
"Слишком большое число"
)
)
)
)
)
Эта формула рекурсивна (вызывает саму себя), поэтому в Excel 2019+ её нужно вводить как динамический массив (нажать Ctrl+Shift+Enter). Минус метода — ограничение на 9 999 и необходимость ручной настройки справочника.
Способ 4: Надстройки от сторонних разработчиков
Если не хочется возиться с VBA или формулами, можно воспользоваться готовыми надстройками. Они платные, но часто предлагают расширенный функционал: поддержку валют, падежей, дробных чисел и даже экспорт в Word.
Популярные решения:
- 💰 «ЧислоПрописью» от Excel-Master — поддерживает рубли, доллары, евро, гривны. Стоимость: ~500 руб.
- 📊 «Акцент: Числа прописью» — работает с 1С, имеет гибкие настройки склонений. Цена: от 800 руб.
- 🌍 «NumWord» — мультиязычная надстройка (русский, английский, немецкий). Бесплатная версия с ограничениями.
Как установить надстройку:
- Скачайте файл надстройки (
.xlamили.xla). - В Excel перейдите в
Файл → Параметры → Надстройки. - Нажмите
Перейти→Обзори выберите скачанный файл. - Активируйте надстройку и используйте новую функцию (например,
=ЧислоПрописью(A1)).
⚠️ Внимание: Перед покупкой проверьте совместимость надстройки с вашей версией Excel (32-bit или 64-bit). Некоторые решения не работают в Excel Online.
Как проверить разрядность Excel?
Откройте Excel, перейдите в Файл → Учётная запись → О программе Excel. В строке «Версия» будет указано «32-разрядная» или «64-разрядная».
Способ 5: Онлайн-конвертеры и Power Query
Если вам нужно одноразово преобразовать список чисел, можно воспользоваться онлайн-сервисами или Power Query. Первый вариант подходит для небольших объёмов, второй — для автоматизации в больших таблицах.
Онлайн-сервисы:
- 🌐 NumWord — поддерживает рубли и копейки, экспорт в Excel.
- 🌐 Text.ru — простой конвертер чисел в текст (без валют).
Power Query (для Excel 2016+):
- Выделите столбец с числами и нажмите
Данные → Из таблицы/диапазона. - В редакторе Power Query добавьте пользовательский столбец с формулой:
(Эта формула вернёт число словами на русском, но без склонений.)= Number.ToText([Число], "ru-RU") - Нажмите
Закрыть и загрузить.
Минус Power Query — отсутствие поддержки валют и падежей. Зато метод бесплатный и не требует VBA.
Сравнение методов: какой выбрать?
Выбор способа зависит от ваших задач. Ниже таблица с сравнением ключевых параметров:
| Метод | Макс. число | Поддержка валют | Склонения | Сложность | Стоимость |
|---|---|---|---|---|---|
| VBA-функция | 999 999 999 | Рубли/копейки | Да | Средняя | Бесплатно |
| Формулы | 9 999 | Нет | Нет | Высокая | Бесплатно |
| Надстройки | Неогр. | Мultiple | Да | Низкая | От 500 руб. |
| Онлайн-сервисы | Зависит от сервиса | Частично | Частично | Низкая | Бесплатно |
| Power Query | Неогр. | Нет | Нет | Средняя | Бесплатно |
Типичные ошибки и как их избежать
При преобразовании чисел в текст пользователи часто сталкиваются с типичными проблемами. Вот самые распространённые и способы их решения:
- 🔢 Ошибка #ИМЯ? — возникает, если функция
ПРОПНАЧиспользуется в русскоязычном Excel. Решение: используйте VBA или надстройки. - 💰 Неправильные склонения («один рубль» вместо «одна тысяча рублей») — проверьте код VBA на обработку падежей или обновите надстройку.
- 📉 Обрезание больших чисел — если число больше 999 999 999, VBA-функция из примера не сработает. Решение: доработайте код или используйте надстройки.
- 🔄 Циклические ссылки в формулах — при рекурсивных вызовах
NumToTextв формулах. Решение: включите итеративные вычисления вФайл → Параметры → Формулы.
Ещё одна частая ошибка — неверный формат ячеек. Убедитесь, что исходные данные имеют формат Общий или Числовой, а не Текстовый. Иначе Excel воспримет 1256 как текст, и функции не сработают.
FAQ: Ответы на частые вопросы
Можно ли преобразовать числа с копейками (например, 1256.78)?
Да, но для этого нужно доработать VBA-функцию или использовать надстройки. В приведённом выше коде функция NumToText поддерживает второй параметр: =NumToText(ЦЕЛОЕ(A1); "руб") & " " & NumToText(ОКРУГЛ((A1-ЦЕЛОЕ(A1))*100;0); "коп").
Почему после обновления Excel перестала работать моя VBA-функция?
Вероятно, в новой версии Excel изменились настройки безопасности макросов. Проверьте: Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов и выберите «Включить все макросы» (не рекомендуется для недоверенных файлов).
Как преобразовать числа в текст на украинском или казахском?
Для других языков нужно адаптировать VBA-код: заменить массивы со словами (RUB, COP) и правила склонений. Например, для украинского языка «гривня/гривні/гривень». Готовые решения можно найти на форумах, например, Excel-World.
Можно ли использовать это в Google Таблицах?
В Google Sheets нет аналога VBA, но можно использовать Apps Script. Вот пример функции:
function numToText(n) {
const units = ["", "один", "два", "три", ...];
const tens = ["", "десять", "двадцать", ...];
// Дополните логику склонений
return "реализация функции";
}
Чтобы установить, перейдите в Расширения → Apps Script.
Как автоматически обновлять текст при изменении чисел?
Если вы используете VBA-функцию или формулы, текст обновляется автоматически. Для надстроек проверьте настройки: некоторые требуют ручного обновления (кнопка «Обновить» на панели надстройки).