Почему в Excel нужны числа прописью и где это применяется
Работа с числами в текстовом формате — распространённая задача в бухгалтерии, финансовой отчётности и юридических документах. Например, в договорах суммы указывают и цифрами, и прописью, чтобы избежать подделок. В Microsoft Excel нет встроенной функции для автоматического преобразования чисел в слова, но есть несколько обходных путей: от использования комбинаций стандартных функций до написания пользовательских макросов на VBA.
Самый простой способ — воспользоваться надстройками или готовыми шаблонами, но они не всегда доступны в корпоративных сетях с ограниченными правами. К тому же, автоматизация через формулы позволяет гибко настраивать вывод: например, добавлять валюту («рублей», «долларов»), склонять слова по падежам или обрабатывать дробные числа. В этой статье разберём все актуальные методы, включая нюансы для разных версий Excel (2010–2023) и Office 365.
Важно учитывать, что преобразование чисел в текст может влиять на производительность больших таблиц. Например, сложные формулы с вложенными IF или массивами замедляют пересчёт данных. Поэтому для обработки тысяч строк лучше использовать VBA или Power Query.
Способ 1: Стандартные функции Excel (без макросов)
Если вам нужно преобразовать число в текст прописью без программирования, можно обойтись комбинацией функций CHOSE, MID, TEXT и вложенных IF. Этот метод подходит для чисел до 999 999, но требует ручной настройки для каждой цифры.
Пример формулы для числа от 0 до 999:
=ЕСЛИ(A1=0;"ноль";
СЦЕПИТЬ(
ЕСЛИ(ЦЕЛОЕ(A1/100)>0;
CHOOSE(ЦЕЛОЕ(A1/100);
"сто";"двести";"триста";"четыреста";"пятьсот";
"шестьсот";"семьсот";"восемьсот";"девятьсот"
);
""
);
" ";
ЕСЛИ(ОСТАТ(ЦЕЛОЕ(A1/10);10)>1;
CHOOSE(ОСТАТ(ЦЕЛОЕ(A1/10);10);
"десять";"двадцать";"тридцать";"сорок";"пятьдесят";
"шестьдесят";"семьдесят";"восемьдесят";"девяносто"
);
""
);
ЕСЛИ(И(ОСТАТ(A1;100)<20;ОСТАТ(A1;100)>9);
CHOOSE(ОСТАТ(A1;10);
"десять";"одиннадцать";"двенадцать";"тринадцать";"четырнадцать";
"пятнадцать";"шестнадцать";"семнадцать";"восемнадцать";"девятнадцать"
);
""
);
ЕСЛИ(ОСТАТ(A1;10)>0;
CHOOSE(ОСТАТ(A1;10);
"один";"два";"три";"четыре";"пять";"шесть";"семь";"восемь";"девять"
);
""
)
)
)
Для обработки тысяч и миллионов формула усложняется в 2–3 раза. Основной недостаток метода — длина формулы может превысить лимит в 8192 символа для ячейки в Excel 2010–2016. В новых версиях (2019+) лимит увеличен до 16384 символов, но читаемость формулы всё равно страдает.
Способ 2: Пользовательская функция на VBA
Наиболее гибкий и производительный способ — написать функцию на VBA, которая будет обрабатывать числа любой длины. Откройте редактор макросов (Alt + F11), вставьте новый модуль (Insert → Module) и добавьте следующий код:
Function NumToText(ByVal Number As Double) As String
Dim Rubles As Variant, Kop As Variant
Dim Temp As String, Dec As String
' Массивы для чисел
Dim Units(1 To 9) As String, Teens(1 To 9) As String
Dim Tens(1 To 9) As String, Hundreds(1 To 9) As String
' Заполняем массивы
Units = Array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять")
Teens = Array("десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", _
"пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать")
Tens = Array("", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", _
"шестьдесят", "семьдесят", "восемьдесят", "девяносто")
Hundreds = Array("", "сто", "двести", "триста", "четыреста", "пятьсот", _
"шестьсот", "семьсот", "восемьсот", "девятьсот")
' Разделяем рубли и копейки
Rubles = Int(Number)
Kop = Round((Number - Rubles) * 100, 0)
' Обрабатываем рубли
Temp = ConvertLessThanThousand(Rubles, Units, Teens, Tens, Hundreds, "рубль", "рубля", "рублей")
If Rubles > 0 Then Temp = Temp & " "
' Обрабатываем копейки
If Kop > 0 Then
Temp = Temp & ConvertLessThanThousand(Kop, Units, Teens, Tens, Hundreds, "копейка", "копейки", "копеек")
Else
Temp = Temp & "00 копеек"
End If
NumToText = Application.WorksheetFunction.Proper(Temp)
End Function
Function ConvertLessThanThousand(ByVal Number As Long, Units(), Teens(), Tens(), Hundreds(), _
UnitName As String, UnitName2 As String, UnitName5 As String) As String
Dim Result As String
If Number = 0 Then Exit Function
' Сотни
If Number >= 100 Then
Result = Hundreds(Number \ 100) & " "
Number = Number Mod 100
End If
' Десятки и единицы
If Number >= 20 Then
Result = Result & Tens(Number \ 10) & " "
Number = Number Mod 10
ElseIf Number >= 10 Then
Result = Result & Teens(Number - 9) & " "
Number = 0
End If
' Единицы
If Number > 0 Then
Result = Result & Units(Number) & " "
End If
' Склонение
Number = CLng(Left(Result, 1))
If Number = 1 Then
Result = Result & UnitName
ElseIf Number > 1 And Number < 5 Then
Result = Result & UnitName2
Else
Result = Result & UnitName5
End If
ConvertLessThanThousand = Result
End Function
После добавления кода в модуль функция =NumToText(A1) станет доступна в Excel. Она автоматически обрабатывает:
- 💰 Числа с копейками (например, «123,45» → «сто двадцать три рубля 45 копеек»)
- 🔢 Склонение существительных («рубль», «рубля», «рублей»)
- 📏 Числа до 999 999 999
Способ 3: Надстройка «ЧислоПрописью» для Excel
Если вы не хотите писать код самостоятельно, можно установить готовую надстройку. Одна из самых популярных — «ЧислоПрописью» от Plumsail. Она добавляет в Excel новую функцию =СуммаПрописью(), которая поддерживает:
- 🌍 Многовалютность (рубли, доллары, евро, гривны и др.)
- 📑 Склонение по падежам (именительный, родительный)
- 🔄 Автоматическое обновление при изменении исходных данных
Установка надстройки:
- Скачайте файл
.xlamс официального сайта Plumsail. - Откройте Excel, перейдите в
Файл → Параметры → Надстройки. - Нажмите «Перейти» внизу окна, затем «Обзор» и выберите скачанный файл.
- Активируйте надстройку и подтвердите установку.
Преимущество надстройки — простота использования и регулярные обновления. Однако в корпоративных сетях установка сторонних расширений может быть заблокирована политиками безопасности. В этом случае остаются формулы или VBA.
Способ 4: Power Query для массовой обработки
Power Query (доступен в Excel 2016+) позволяет преобразовывать числа в текст прописью для больших массивов данных. Этот метод полезен, если нужно обработать тысячи строк из внешних источников (например, выгрузки из 1С или банковских систем).
Алгоритм действий:
- Импортируйте данные в Power Query (
Данные → Получить данные → Из таблицы/диапазона). - Добавьте пользовательский столбец с формулой на языке M:
(Number) =>
let
Units = {"ноль", "один", "два", ..., "девять"},
Teens = {"десять", "одиннадцать", ..., "девятнадцать"},
Tens = {"", "десять", "двадцать", ..., "девяносто"},
Hundreds = {"", "сто", "двести", ..., "девятьсот"},
// Логика преобразования (упрощённо)
Result = if Number = 0 then "ноль" else
(if Number >= 100 then Hundreds{Number / 100} & " " else "") &
(if Number mod 100 >= 20 then
Tens{Number mod 100 / 10} & " " & Units{Number mod 10}
else if Number mod 100 >= 10 then
Teens{Number mod 100 - 10}
else
Units{Number mod 10}
)
in
Result
После применения преобразования данные можно загрузить обратно в Excel. Минус метода — M-код сложнее отлаживать, чем VBA, и он не поддерживает склонение валют.
Как ускорить Power Query?
Для ускорения обработки отключите автоматическое определение типов данных при импорте (Файл → Параметры → Загрузка данных → Не обнаруживать типы столбцов). Это сократит время загрузки на 20–30%.
Ошибки и их решение
При преобразовании чисел в текст прописью пользователи часто сталкиваются с типичными проблемами. Вот самые распространённые и способы их устранения:
| Ошибка | Причина | Решение |
|---|---|---|
| #ИМЯ? в ячейке с формулой | Опечатка в названии функции или неверный синтаксис | Проверьте регистр (например, =СУММАПРОПИСЬЮ вместо =СуммаПрописью) |
| Функция VBA не отображается | Макросы отключены или модуль не сохранён | Сохраните файл как .xlsm и включите макросы в Файл → Параметры → Центр управления безопасностью |
| Неправильное склонение («1 рубль» вместо «1 рубля») | Ошибка в логике функции | Исправьте условие для числа 1 в коде VBA (см. раздел про ConvertLessThanThousand) |
| Медленная работа таблицы | Слишком много вложенных IF в формулах |
Замените формулы на VBA или Power Query |
Ещё одна частая проблема — обработка отрицательных чисел. Чтобы функция корректно работала с минусовыми значениями, добавьте в начало кода VBA проверку:
If Number < 0 Then
NumToText = "минус " & NumToText(Abs(Number))
Exit Function
End If
🔹 Убедитесь, что ячейка имеет числовой формат (не текст!)
🔹 Проверьте региональные настройки (разделитель дробной части — точка или запятая)
🔹 Для VBA включите макросы в параметрах безопасности
🔹 Тестируйте функцию на числах с копейками (например, 123,45)
-->
Советы по оптимизации
Чтобы ускорить работу с числами прописью в больших таблицах, следуйте этим рекомендациям:
- 📊 Для статических данных используйте
Копировать → Специальная вставка → Значения, чтобы заменить формулы на текст. - ⚡ Отключите автоматический пересчёт формул (
Формулы → Параметры вычислений → Вручную) во время редактирования. - 🔄 Если используете VBA, объявите переменные с явным типом (
Dim i As LongвместоDim i). - 🗃️ Для часто используемых слов (например, «тысяча», «миллион») создайте отдельные массивы в коде.
Критическая ошибка: при работе с финансовыми документами никогда не rounds числа перед преобразованием в текст — это может исказить сумму копеек. Например, =ОКРУГЛ(123,456; 2) даст 123,46, а в тексте будет «46 копеек» вместо «45,6 копеек» (если функция не учитывает округление).
FAQ: Частые вопросы
Можно ли преобразовать числа в текст прописью в Google Таблицах?
Да, но только с помощью Google Apps Script. Вставьте этот код в редактор скриптов (Расширения → Apps Script):
function NumToTextGS(number) {
const units = ["", "один", "два", ...];
const teens = ["десять", "одиннадцать", ...];
// Логика аналогична VBA
return result;
}
Затем используйте функцию =NumToTextGS(A1) в таблице.
Почему моя функция VBA выдаёт ошибку «Тип не совпадает»?
Ошибка возникает, если функция пытается обработать нечисловое значение. Добавьте проверку:
If Not IsNumeric(Number) Then
NumToText = "Ошибка: не число"
Exit Function
End If
Как добавить поддержку украинского или казахского языка?
Замените массивы Units, Teens и Tens в коде VBA на эквиваленты на нужном языке. Например, для украинского:
Units = Array("", "один", "два", "три", "чотири", ...)
Также скорректируйте склонение валют (например, «гривня» вместо «рубль»).
Можно ли преобразовать даты в текст прописью?
Да, но для этого нужна отдельная функция. Пример для VBA:
Function DateToText(ByVal d As Date) As String
Dim Days(), Months()
Days = Array("первое", "второе", "третье", ..., "тридцатое")
Months = Array("января", "февраля", ..., "декабря")
DateToText = Days(Day(d) - 1) & " " & Months(Month(d) - 1) & " " & Year(d) & " года"
End Function
Формат вывода: «первое января две тысячи двадцать третьего года».
Как обработать числа больше миллиарда?
Расширьте функцию ConvertLessThanThousand в VBA, добавив обработку миллиардов:
If Number >= 1000000000 Then
Result = ConvertLessThanThousand(Number \ 1000000000, ...) & " миллиард(а/ов) "
Number = Number Mod 1000000000
End If
Не забудьте склонять слово «миллиард» в зависимости от числа (1 миллиард, 2 миллиарда, 5 миллиардов).