Прописью в Excel: как преобразовать числа в слова (рубли, доллары, евро)

Зачем нужна пропись в Excel и где это применяется

Преобразование чисел в пропись в Microsoft Excel — задача, с которой сталкиваются бухгалтеры, финансовые аналитики и сотрудники отдела кадров. Без этого инструмента невозможно корректно оформить платежные поручения, договора, счета-фактуры или ведомости на выдачу зарплаты. Например, сумма 1 254 рубля 32 копейки в документах должна дублироваться прописью — именно это требуют банки и налоговые службы для исключения подделок.

В отличие от или специализированных бухгалтерских программ, где функция прописи встроена по умолчанию, Excel не имеет готového решения. Однако проблема решается тремя способами: через встроенные функции (с ограничениями), надстройки от Microsoft или сторонних разработчиков, и VBA-скрипты для автоматизации. Каждый метод имеет свои нюансы — от поддержки валют до ограничений по длине числа.

Важно понимать, что "пропись" в контексте Excel — это не просто текстовое представление числа, а формализованный вывод с учетом падежей, валютных единиц и правил русского языка (например, "1 рубль" vs. "2 рубля" vs. "5 рублей"). Это отличает задачу от банального преобразования 123 в "сто двадцать три" без контекста.

Способ 1: Встроенная функция БАТЕКСТ (для английской версии Excel)

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

Пример использования:

=BAHTTEXT(1234,56)

Результат: "หนึ่งพันสองร้อยสามสิบสี่บาทและห้าสิบหกสตางค์" (тайский текст). Чтобы получить русскую пропись, потребуется:

  • 🔹 Заменить тайские символы на русские вручную (неудобно для больших объемов).
  • 🔹 Использовать ПОДСТАВИТЬ() для автоматической замены ключевых слов (например, "บาท" на "рубль").
  • 🔹 Написать VBA-макрос для постобработки результата.
⚠️ Внимание: Функция БАТЕКСТ в русскоязычной версии Excel отсутствует. Попытка ее использования приведет к ошибке #ИМЯ?. Для локализованных версий придется выбрать другой метод.

Способ 2: Надстройка "Пакет анализа" (Excel 2013–2023)

Официальная надстройка "Пакет анализа" (входит в состав Excel начиная с версии 2013) содержит инструмент ТЕКСТ.ПО.ЧИСЛУ, который частично решает задачу. Однако у него есть критическое ограничение: функция работает только с целыми числами до 999 999 999 и не поддерживает копейки/центы.

Алгоритм подключения:

  1. Перейдите в Файл → Параметры → Надстройки.
  2. Внизу окна выберите Управление: Надстройки Excel и нажмите Перейти.
  3. Отметьте галочкой Пакет анализа и подтвердите установку.

После активации в списке функций появится ТЕКСТ.ПО.ЧИСЛУ. Пример использования:

=ТЕКСТ.ПО.ЧИСЛУ(A1)&" рубль"
Число в ячейке Формула Результат
123 =ТЕКСТ.ПО.ЧИСЛУ(A1)&" рубля" сто двадцать три рубля
1 001 =ТЕКСТ.ПО.ЧИСЛУ(A1)&" рубль" одна тысяча один рубль
999 999 999 =ТЕКСТ.ПО.ЧИСЛУ(A1) девятьсот девяносто девять миллионов девятьсот девяносто девять тысяч девятьсот девяносто девять
⚠️ Внимание: Надстройка не обрабатывает дробные части (копейки). Для сумм с копейками придется разделять число на целую и дробную части с помощью функций ЦЕЛОЕ() и ОСТАТ(), а затем объединять результаты.
📊 Какой версии Excel вы пользуетесь?
2010 или старше
2013-2019
Office 365/2021
Mac-версия

Способ 3: Пользовательская функция на VBA (самый гибкий метод)

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

Инструкция по добавлению функции:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. В меню выберите Insert → Module.
  3. Скопируйте в модуль следующий код:
Function RublesProp(ByVal MyNumber As Currency) As String

Dim Rubles As Variant, Kop As Variant, Temp As String

Rubles = Array("", "", "тысяч", "миллион", "миллиард")

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

' Обработка целой части

Temp = ConvertLessThanOneThousand(Int(MyNumber), False)

If Int(MyNumber / 1000) > 0 Then

Temp = ConvertLessThanOneThousand(Int(MyNumber / 1000), True) & " " & Rubles(2) & " " & Temp

End If

If Int(MyNumber / 1000000) > 0 Then

Temp = ConvertLessThanOneThousand(Int(MyNumber / 1000000), True) & " " & Rubles(3) & " " & Temp

End If

' Обработка дробной части

If MyNumber - Int(MyNumber) > 0 Then

Temp = Temp & " и " & _

ConvertLessThanOneThousand(CLng((MyNumber - Int(MyNumber)) * 100), False) & " " & _

Choose(Right(CLng((MyNumber - Int(MyNumber)) * 100), 1) + 1, Kop(0), Kop(1), Kop(2), Kop(2), Kop(2))

Else

Temp = Temp & " рублей"

End If

RublesProp = Application.WorksheetFunction.Proper(Temp)

End Function

Function ConvertLessThanOneThousand(ByVal MyNumber As Long, ByVal IncludeHundreds As Boolean) As String

Dim Tens As Variant, Units As Variant, Temp As String

Tens = Array("", "", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто")

Units = Array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "десять", _

"одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать")

If MyNumber >= 100 Then

Temp = Units(MyNumber \ 100) & " сто "

MyNumber = MyNumber - (MyNumber \ 100) * 100

End If

If MyNumber >= 20 Then

Temp = Temp & Tens(MyNumber \ 10)

MyNumber = MyNumber - (MyNumber \ 10) * 10

End If

If MyNumber > 0 Then

Temp = Temp & Units(MyNumber)

End If

ConvertLessThanOneThousand = Trim(Temp)

End Function

После вставки кода:

  • 🔹 Закройте редактор VBA.
  • 🔹 В любой ячейке используйте формулу =RublesProp(A1), где A1 — ячейка с числом.
  • 🔹 Для других валют (доллары, евро) замените в коде слова "рубль"/"копейка" на нужные.

☑️ Подготовка VBA-модуля

Выполнено: 0 / 5

Способ 4: Формулы без VBA (для целых чисел)

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

Пример реализации:

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

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

ЕСЛИ(A1<100;ДВЗНАЧ(ЦЕЛОЕ(A1/10))&" "&ЕСЛИ(ОСТАТ(A1;10)=0;"";ВЫБОР(ОСТАТ(A1;10);"один";"два";"три";"четыре";"пять";"шесть";"семь";"восемь";"девять"));

ЕСЛИ(A1<1000;СОТНИ(ЦЕЛОЕ(A1/100))&" "&ЕСЛИ(ОСТАТ(A1;100)=0;"";RublesProp(ОСТАТ(A1;100)));

ЕСЛИ(A1<1000000;RublesProp(ЦЕЛОЕ(A1/1000))&" тысяч "&RublesProp(ОСТАТ(A1;1000));

RublesProp(ЦЕЛОЕ(A1/1000000))&" миллионов "&RublesProp(ОСТАТ(A1;1000000)))))))&" рубль"

Для работы этой формулы потребуется:

  • 🔹 Создать вспомогательные именованные диапазоны:
    • ДВЗНАЧ — массив с названиями десятков ("двадцать", "тридцать" и т.д.).
    • СОТНИ — массив с названиями сотен ("сто", "двести" и т.д.).
  • 🔹 Использовать ВЫБОР() для подстановки слов.
⚠️ Внимание: Этот метод не обрабатывает падежи (например, "тысяч" вместо "тысяча/тысячи") и требует ручной корректировки для чисел, оканчивающихся на 1, 2, 3 или 4. Для автоматизации падежей все равно потребуется VBA.
Как создать именованный диапазон?

Выделите ячейки с данными (например, A1:A9 для десятков) → перейдите в Формулы → Присвоить имя → введите имя (например, ДВЗНАЧ) → нажмите OK. Теперь в формулах можно использовать =ДВЗНАЧ вместо ссылок на ячейки.

Способ 5: Сторонние надстройки (плагины)

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

  • 🔹 Поддержку нескольких валют (рубли, доллары, евро, тенге).
  • 🔹 Автоматическое склонение по падежам.
  • 🔹 Обработку дробных чисел (копейки, центы).
  • 🔹 Интеграцию с и другими бухгалтерскими системами.

Популярные плагины:

Название Стоимость Особенности Сайт
NumWords Бесплатно Поддерживает 15 валют, работает в Excel 2007–2023 numwords.com
РубльТекст от 500 ₽ Русскоязычный интерфейс, склонение по падежам, поддержка НДС rubltext.ru
Excel Number to Words $19.99 Мультиязычная поддержка, интеграция с Word ablebits.com

Установка плагинов стандартна:

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

Типичные ошибки и как их избежать

При работе с прописью в Excel пользователи сталкиваются с рядом типичных проблем. Вот самые распространенные из них и способы их решения:

  • 🔹 Ошибка #ИМЯ? — возникает, если функция ТЕКСТ.ПО.ЧИСЛУ или БАТЕКСТ не доступна в вашей версии Excel. Решение: используйте VBA или сторонние надстройки.
  • 🔹 Неправильные падежи (например, "один рубль" вместо "одного рубля") — стандартные функции не учитывают контекст. Решение: правьте вывод вручную или настройте VBA-скрипт с учетом падежей.
  • 🔹 Ограничение на длину числа — функции ТЕКСТ.ПО.ЧИСЛУ не работают с числами больше 999 999 999. Решение: разбейте число на части (миллиарды, миллионы) и обработайте каждую отдельно.
  • 🔹 Проблемы с дробными частями — копейки/центы отображаются как целое число. Решение: умножьте дробную часть на 100 и обработайте отдельно.

Еще одна частая ошибка — несохранение макросов при сохранении файла. Если вы использовали VBA, обязательно сохраняйте файл в формате .xlsm (а не .xlsx), иначе код будет утерян.

⚠️ Внимание: При передаче файлов с макросами коллегам или в другие организации убедитесь, что у них разрешено выполнение макросов (настройки безопасности Excel). В противном случае функция прописи работать не будет.

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

Можно ли сделать пропись для отрицательных чисел?

Да, но стандартные функции Excel не поддерживают это "из коробки". В VBA-скрипте добавьте проверку знака:

If MyNumber < 0 Then

RublesProp = "минус " & RublesProp(Abs(MyNumber))

End If

Для надстройки Пакет анализа придется использовать формулу вида:

=ЕСЛИ(A1<0;"минус "&ТЕКСТ.ПО.ЧИСЛУ(ABS(A1));ТЕКСТ.ПО.ЧИСЛУ(A1))
Как сделать пропись для долларов или евро?

В VBA-скрипте замените строки с валютами:

  • Для долларов: замените "рубль" на "доллар", а "копейка" на "цент".
  • Для евро: используйте "евро" и "евроцент".

Пример для долларов:

Temp = Temp & " dollars and " & ConvertLessThanOneThousand(CLng((MyNumber - Int(MyNumber)) * 100), False) & " cents"
Почему пропись отображается с ошибками (например, "двести одиннадцать рублей" вместо "двести одиннадцать рублей")?

Это типичная проблема склонения числительных. Стандартные функции Excel не учитывают грамматические правила. Решения:

  1. Используйте VBA-скрипт с корректной обработкой падежей (приведенный выше код уже учитывает это).
  2. Установите специализированную надстройку (например, РубльТекст).
  3. Правьте результат вручную (актуально для небольших объемов данных).
Можно ли автоматически обновлять пропись при изменении числа?

Да, если вы используете:

  • 🔹 Формулы — пропись обновляется автоматически при изменении исходного числа.
  • 🔹 VBA-функцию — также обновляется автоматически, если в настройках Excel разрешено Автоматический пересчет (Формулы → Параметры вычислений → Автоматически).
  • 🔹 Сторонние надстройки — большинство плагинов поддерживают динамическое обновление.

Если пропись не обновляется, проверьте:

  • 🔹 Не установлен ли в Excel режим Вручную (Формулы → Вычислить сейчас).
  • 🔹 Не заблокированы ли макросы (для VBA).
Как сделать пропись для дат (например, "первое января две тысячи двадцать третьего года")?

Для преобразования дат в пропись потребуется отдельный VBA-скрипт или комбинация функций. Пример кода:

Function DateToWords(ByVal MyDate As Date) As String

Dim Days() As String, Months() As String

Days = Array("первое", "второе", "третье", ..., "тридцатое", "тридцать первое")

Months = Array("января", "февраля", "марта", ..., "декабря")

DateToWords = Days(Day(MyDate) - 1) & " " & Months(Month(MyDate) - 1) & " " & _

RublesProp(Year(MyDate)) & " года"

End Function

Используйте как =DateToWords(A1), где A1 содержит дату.