Преобразование чисел в текст прописью в Excel: от простых формул до автоматизации

Почему в 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 новую функцию =СуммаПрописью(), которая поддерживает:

  • 🌍 Многовалютность (рубли, доллары, евро, гривны и др.)
  • 📑 Склонение по падежам (именительный, родительный)
  • 🔄 Автоматическое обновление при изменении исходных данных

Установка надстройки:

  1. Скачайте файл .xlam с официального сайта Plumsail.
  2. Откройте Excel, перейдите в Файл → Параметры → Надстройки.
  3. Нажмите «Перейти» внизу окна, затем «Обзор» и выберите скачанный файл.
  4. Активируйте надстройку и подтвердите установку.
📊 Какой способ преобразования чисел в текст вы используете чаще?
Формулы Excel
Макросы VBA
Надстройки
Ручной ввод

Преимущество надстройки — простота использования и регулярные обновления. Однако в корпоративных сетях установка сторонних расширений может быть заблокирована политиками безопасности. В этом случае остаются формулы или VBA.

Способ 4: Power Query для массовой обработки

Power Query (доступен в Excel 2016+) позволяет преобразовывать числа в текст прописью для больших массивов данных. Этот метод полезен, если нужно обработать тысячи строк из внешних источников (например, выгрузки из 1С или банковских систем).

Алгоритм действий:

  1. Импортируйте данные в Power Query (Данные → Получить данные → Из таблицы/диапазона).
  2. Добавьте пользовательский столбец с формулой на языке 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 миллиардов).