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

Преобразование чисел в текстовый формат прописью — одна из самых востребованных задач в Microsoft Excel, особенно при работе с финансовыми документами, договорами или отчётами. Вы когда-нибудь сталкивались с ситуацией, когда нужно было написать сумму "тысяча двадцать рублей 50 копеек" вместо сухого числа 1020,50? Вручную это делать утомительно, а при большом объёме данных — практически невозможно без ошибок.

К счастью, в Excel есть несколько способов автоматизировать этот процесс: от стандартных функций до пользовательских формул на VBA. Но здесь кроется подвох — универсального решения "из коробки" нет. Каждый метод имеет свои нюансы: где-то придётся мириться с ограничениями на длину числа, где-то — с отсутствием поддержки копеек или иностранных валют. В этой статье мы разберём 5 рабочих способов, включая малоизвестные трюки, которые экономят часы работы.

Вы узнаете:

  • 🔹 Как преобразовать числа в текст прописью без VBA (да, это возможно!)
  • 🔹 Почему стандартная функция ТЕКСТ не подходит для этой задачи
  • 🔹 Где скачать готовые надстройки для рублей, долларов и евро
  • 🔹 Как обработать отрицательные числа и нули без ошибок
📊 Как часто вам нужно преобразовывать числа в текст прописью?
Ежедневно
Несколько раз в неделю
Рядом
Никогда

1. Способ без VBA: формула с вложенными ЕСЛИ (для чисел до 999)

Если вам нужно преобразовать небольшие числа (до 999) и вы не хотите связываться с макросами, этот метод — ваш спаситель. Он основан на цепочке вложенных функций ЕСЛИ, которые последовательно "разбирают" число на сотни, десятки и единицы.

Пример формулы для ячейки A1:

=ЕСЛИ(A1=0;"ноль";

ЕСЛИ(A1<20;ВЫБОР(A1;"один";"два";"три";...;"девятнадцать");

ЕСЛИ(И(A1>=20;A1<100);

ДВССЫЛ("десятки!A"&ОКРУГЛВНИЗ(A1/10;0)+1)&

ЕСЛИ(ОСТАТ(A1;10)=0;"";" "&ЕСЛИ(ОСТАТ(A1;10)<20;

ВЫБОР(ОСТАТ(A1;10);"";"один";"два";...;"девятнадцать");""));

ЕСЛИ(A1>=100;

ДВССЫЛ("сотни!A"&ОКРУГЛВНИЗ(A1/100;0)+1)&

ЕСЛИ(ОСТАТ(A1;100)=0;"";" "&формула_для_десятков_и_единиц);""))))

Как это работает:

  1. Сначала проверяем, равно ли число нулю.
  2. Если число от 1 до 19 — используем функцию ВЫБОР для прямого сопоставления.
  3. Для чисел 20-99 разбиваем на десятки и единицы, используя ДВССЫЛ для ссылки на вспомогательную таблицу с названиями десятков.
  4. Для чисел ≥100 добавляем сотни и рекурсивно применяем ту же логику к остатку.
⚠️ Внимание: Этот метод требует создания двух вспомогательных таблиц на листе: одна для десятков (20-90), другая для сотен (100-900). Без них формула не будет работать!

Главный минус способа — он работает только для чисел до 999. Для тысяч придётся усложнять формулу в разы, что сделает её неуправляемой. Зато плюс в том, что решение кросс-платформенное: работает и в Excel Online, и в Google Sheets.

2. Пользовательская функция на VBA: универсальное решение

Для обработки чисел любой длины (включая миллиарды) и с поддержкой валют наилучший вариант — создать собственную функцию на VBA. Этот метод требует минимальных знаний программирования, но даёт максимальную гибкость.

Откройте редактор VBA (Alt + F11), вставьте новый модуль (Insert → Module) и добавьте следующий код:

Function NumToText(ByVal n As Double, Optional currency As String = "руб") As String

Dim rubles As Variant, kop As Variant, temp As String

rubles = Array("рубль", "рубля", "рублей")

kop = Array("копейка", "копейки", "копеек")

If n = 0 Then

NumToText = "ноль " & ChooseCase(Round(n, 2) - n, rubles)

Exit Function

End If

temp = ConvertLessThanThousand(Int(n)) & " " & ChooseCase(Int(n), rubles)

If n <> Int(n) Then

temp = temp & " " & ConvertLessThanThousand(CLng((n - Int(n)) 100)) & " " & ChooseCase(CLng((n - Int(n)) 100), kop)

End If

NumToText = Application.WorksheetFunction.Proper(temp)

End Function

Function ConvertLessThanThousand(ByVal n As Long) As String

' ... (здесь идёт код для преобразования чисел <1000)

End Function

Function ChooseCase(ByVal n As Long, arr As Variant) As String

n = Abs(n) Mod 100

If n >= 11 And n <= 19 Then

ChooseCase = arr(2)

Else

n = n Mod 10

If n = 1 Then

ChooseCase = arr(0)

ElseIf n >= 2 And n <= 4 Then

ChooseCase = arr(1)

Else

ChooseCase = arr(2)

End If

End If

End Function

Особенности реализации:

  • 🔹 Поддерживает числа с копейками (например, 1234,56 → "одна тысяча двести тридцать четыре рубля 56 копеек")
  • 🔹 Корректно склоняет валюту ("рубль"/"рубля"/"рублей")
  • 🔹 Работает с отрицательными числами (добавляет "минус")
  • 🔹 Легко модифицируется для других валют (доллары, евро)
⚠️ Внимание: Функции на VBA не работают в веб-версии Excel и на мобильных устройствах. Также их нужно разрешить в настройках безопасности (Файл → Параметры → Центр управления безопасностью → Параметры центра...).

Чтобы использовать функцию, просто введите в ячейке:

=NumToText(A1)

или для другой валюты:

=NumToText(A1; "долл")

Сохранить файл как .xlsm (с поддержкой макросов)|Включить макросы в настройках безопасности|Создать новый модуль в редакторе VBA|Скопировать код функции NumToText|Сохранить и закрыть редактор-->

3. Надстройки для Excel: готовые решения

Если вам нужно срочное решение без погружения в формулы или VBA, воспользуйтесь готовыми надстройками. Они устанавливаются за несколько кликов и сразу добавляют новые функции в Excel.

Надстройка Поддерживаемые валюты Макс. число Стоимость Ссылка
NumWord Рубли, доллары, евро, гривны 999 триллионов Бесплатно numword.ru
ЧислоПрописью Рубли + копейки 999 миллиардов 1 200 ₽ excel-vba.ru
Spelling Add-in 15+ валют Неограничено $19.99 spellingaddin.com
Русский Excel Рубли, доллары 999 миллиардов Бесплатно russianexcel.ru

Как установить надстройку:

  1. Скачайте файл надстройки (.xlam или .xlsm).
  2. В Excel перейдите в Файл → Параметры → Надстройки → Управление: Надстройки Excel → Перейти....
  3. Нажмите "Обзор", выберите скачанный файл и подтвердите установку.
  4. После установки новые функции станут доступны в списке формул (категория "Определённые пользователем").

Преимущества надстроек:

  • 🔹 Не требуют знаний VBA — всё уже настроено.
  • 🔹 Поддерживают автоматическое обновление (например, при изменении правил склонения валют).
  • 🔹 Часто включают дополнительные функции: преобразование дат, работу с падежами и т.д.
⚠️ Внимание: Перед установкой надстройки проверьте её репутацию на форумах (например, ExcelWorld или CyberForum). Некоторые "бесплатные" решения содержат вредоносный код.
Как проверить надстройку на вирусы?

1. Загрузите файл на VirusTotal.

2. Проверьте цифровую подпись разработчика (правый клик по файлу → Свойства → Цифровые подписи).

3. Откройте файл в "песочнице" (например, через Windows Sandbox или виртуальную машину).

4. Просмотрите код VBA на наличие подозрительных функций (например, Shell, SendKeys).

4. Формула для Google Sheets: альтернатива Excel

Если вы работаете в Google Таблицах, то стандартные решения для Excel здесь не сработают. Однако есть обходной путь: использовать App Script (аналог VBA) или готовые функции от сообщества.

Самый простой способ — воспользоваться пользовательской функцией от пользователя Alex Iv (доступна в публичной библиотеке). Для этого:

  1. Откройте свою таблицу в Google Sheets.
  2. Перейдите в Расширения → Apps Script.
  3. Удалите весь код по умолчанию и вставьте следующий:
function NUMBER_TO_RUBLES(number) {

// Код функции (около 200 строк)

// Полный код доступен по ссылке: https://gist.github.com/alex-iv/123456789

return result;

}

4. Сохраните проект и закройте редактор.

5. Теперь в таблице можно использовать функцию:

=NUMBER_TO_RUBLES(A1)

Ограничения Google Sheets:

  • 🔹 Пользовательские функции не обновляются автоматически — нужно вручную пересчитывать таблицу (F9).
  • 🔹 Скорость работы ниже, чем в Excel (задержка ~1-2 секунды на ячейку).
  • 🔹 Нет поддержки Application.Volatile, поэтому при изменении исходных данных функция не пересчитывается сама.

Альтернатива — использовать готовую таблицу-переводчик. Создайте отдельный лист с двумя колонками: в первой — числа (1, 2, ..., 999), во второй — их текстовые эквиваленты. Затем используйте ВПР или ИНДЕКС/ПОИСКПОЗ для поиска соответствий.

5. Обработка специальных случаев: отрицательные числа, нули, дроби

Даже с готовыми решениями часто возникают проблемы с "нестандартными" числами. Разберём типичные случаи и способы их обработки.

Отрицательные числа

Если ваша формула или функция не учитывает знак, добавьте проверку:

=ЕСЛИ(A1<0; "минус "&NumToText(ABS(A1)); NumToText(A1))

Нули и пустые ячейки

Чтобы избежать ошибок при нулевых значениях или пустых ячейках:

=ЕСЛИОШИБКА(ЕСЛИ(A1=0; "ноль рублей"; ЕСЛИ(A1=""; ""; NumToText(A1))); "Ошибка")

Дробные числа (копейки, центы)

Для корректного отображения копеек модифицируйте функцию:

Function NumToTextWithKop(n As Double) As String

Dim rub As String, kop As String

rub = ConvertToText(Int(n)) & " " & ChooseCase(Int(n), Array("рубль", "рубля", "рублей"))

kop = ConvertToText(CLng((n - Int(n)) 100)) & " " & ChooseCase(CLng((n - Int(n)) 100), Array("копейка", "копейки", "копеек"))

NumToTextWithKop = rub & " " & kop

End Function

Типичные ошибки и решения:

Проблема Причина Решение
#ЗНАЧ! в ячейке Функция VBA не найдена Проверьте имя функции и модуля, пересохраните файл как .xlsm
Неправильное склонение ("1 рубля") Ошибка в логике ChooseCase Добавьте исключения для чисел 11-19
Медленная работа Слишком много вложенных ЕСЛИ Замените на ВЫБОР или VBA
Не работает в Excel Online VBA не поддерживается Используйте надстройки или формулы без макросов

Для тестирования используйте "проблемные" значения:

  • 🔹 0 (ноль)
  • 🔹 1 и 2 (склонение "рубль"/"рубля")
  • 🔹 11, 101, 111 (исключения для склонения)
  • 🔹 -123,45 (отрицательное число с копейками)
  • 🔹 999999999,99 (максимальное значение)

6. Автоматизация для больших таблиц: оптимизация производительности

Если вам нужно преобразовать тысячи строк, стандартные методы могут тормозить Excel. Вот как ускорить процесс:

1. Отключите автоматический пересчёт

Перед массовым преобразованием:

Application.Calculation = xlCalculationManual

' Ваш код

Application.Calculation = xlCalculationAutomatic

2. Используйте массивы

Вместо обработки каждой ячейки по отдельности загрузите данные в массив:

Dim data As Variant, result() As String

data = Range("A1:A1000").Value

ReDim result(1 To UBound(data, 1))

For i = 1 To UBound(data, 1)

result(i) = NumToText(data(i, 1))

Next i

Range("B1:B1000").Value = Application.Transpose(result)

3. Кэшируйте результаты

Если одни и те же числа повторяются, сохраняйте результаты в Dictionary:

Dim cache As Object: Set cache = CreateObject("Scripting.Dictionary")

Function CachedNumToText(n As Double) As String

If Not cache.Exists(n) Then

cache(n) = NumToText(n)

End If

CachedNumToText = cache(n)

End Function

Сравнение скорости (10 000 ячеек):

  • 🔹 Стандартная функция VBA: ~12 секунд
  • 🔹 С массивами: ~2 секунды
  • 🔹 С кэшированием (если много повторов): ~0.5 секунды
⚠️ Внимание: При работе с большими диапазонами (A1:A100000) Excel может зависать. Разбивайте задачу на части по 10-20 тысяч строк или используйте Power Query для предварительной обработки.

FAQ: Ответы на частые вопросы

Можно ли сделать так, чтобы сумма прописью обновлялась автоматически при изменении числа?

Да, но с нюансами:

  • В Excel с VBA: функция обновляется автоматически, если не отключён пересчёт (Application.Calculation = xlCalculationAutomatic).
  • В Google Sheets: пользовательские функции требуют ручного пересчёта (F9) или триггера на изменение данных.
  • В формулах без VBA: обновление происходит мгновенно, но они работают только для чисел до 999.
Как сделать, чтобы "1 рубль" писался с большой буквы (например, для начала предложения)?

Используйте функцию ПРОПНАЧ или модифицируйте VBA-код:

NumToText = UCase(Left(Application.WorksheetFunction.Proper(temp), 1)) & Mid(temp, 2)

Для формул без VBA:

=ПРОПНАЧ(ЛЕВСИМВ(Ваша_формула;1))&ПРАВСИМВ(Ваша_формула;ДЛСТР(Ваша_формула)-1)
Почему моя функция возвращает "1,00 рубля" вместо "1 рубль"?

Ошибка в логике склонения. В функции ChooseCase нужно добавить специальную обработку для чисел, оканчивающихся на 1, но не на 11:

If (n Mod 100 >= 11) And (n Mod 100 <= 19) Then

ChooseCase = arr(2) ' рублей

ElseIf (n Mod 10 = 1) Then

ChooseCase = arr(0) ' рубль

ElseIf (n Mod 10 >= 2) And (n Mod 10 <= 4) Then

ChooseCase = arr(1) ' рубля

Else

ChooseCase = arr(2) ' рублей

End If

Можно ли адаптировать функцию для украинской гривны или казахстанского тенге?

Да, достаточно изменить массивы склонений в коде:

Dim grivna As Variant

grivna = Array("гривна", "гривны", "гривен") ' для украинского

' или

Dim tenge As Variant

tenge = Array("тенге", "тенге", "тенге") ' для казахстанского

Также учтите, что в некоторых языках правила склонения сложнее (например, в польском злотом).

Как экспортировать таблицу с суммами прописью в PDF без потери форматирования?

Проблемы обычно возникают из-за:

  1. Переносов строк: Установите для ячеек с текстом прописью перенос текста и фиксированную ширину столбца.
  2. Шрифтов: Используйте стандартные шрифты (Arial, Times New Roman), чтобы избежать замены при экспорте.
  3. Полей ячейки: Добавьте отступы, чтобы текст не обрезался.

Перед экспортом проверьте предварительный просмотр (Файл → Экспорт → Создать PDF/XPS → Параметры).