Зачем нужна пропись в Excel и где это применяется
Преобразование чисел в пропись в Microsoft Excel — задача, с которой сталкиваются бухгалтеры, финансовые аналитики и сотрудники отдела кадров. Без этого инструмента невозможно корректно оформить платежные поручения, договора, счета-фактуры или ведомости на выдачу зарплаты. Например, сумма 1 254 рубля 32 копейки в документах должна дублироваться прописью — именно это требуют банки и налоговые службы для исключения подделок.
В отличие от 1С или специализированных бухгалтерских программ, где функция прописи встроена по умолчанию, 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 и не поддерживает копейки/центы.
Алгоритм подключения:
- Перейдите в
Файл → Параметры → Надстройки. - Внизу окна выберите
Управление: Надстройки Excelи нажмитеПерейти. - Отметьте галочкой
Пакет анализаи подтвердите установку.
После активации в списке функций появится ТЕКСТ.ПО.ЧИСЛУ. Пример использования:
=ТЕКСТ.ПО.ЧИСЛУ(A1)&" рубль"
| Число в ячейке | Формула | Результат |
|---|---|---|
| 123 | =ТЕКСТ.ПО.ЧИСЛУ(A1)&" рубля" |
сто двадцать три рубля |
| 1 001 | =ТЕКСТ.ПО.ЧИСЛУ(A1)&" рубль" |
одна тысяча один рубль |
| 999 999 999 | =ТЕКСТ.ПО.ЧИСЛУ(A1) |
девятьсот девяносто девять миллионов девятьсот девяносто девять тысяч девятьсот девяносто девять |
⚠️ Внимание: Надстройка не обрабатывает дробные части (копейки). Для сумм с копейками придется разделять число на целую и дробную части с помощью функцийЦЕЛОЕ()иОСТАТ(), а затем объединять результаты.
Способ 3: Пользовательская функция на VBA (самый гибкий метод)
Для полноценной работы с прописью (включая валюты, падежи и дробные части) рекомендуется создать пользовательскую функцию на VBA. Этот метод работает во всех версиях Excel и позволяет настраивать формат вывода под конкретные задачи.
Инструкция по добавлению функции:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - В меню выберите
Insert → Module. - Скопируйте в модуль следующий код:
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-модуля
Способ 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: Сторонние надстройки (плагины)
Если самостоятельная настройка кажется сложной, можно воспользоваться готовыми надстройками от сторонних разработчиков. Они предлагают расширенную функциональность, включая:
- 🔹 Поддержку нескольких валют (рубли, доллары, евро, тенге).
- 🔹 Автоматическое склонение по падежам.
- 🔹 Обработку дробных чисел (копейки, центы).
- 🔹 Интеграцию с
1Си другими бухгалтерскими системами.
Популярные плагины:
| Название | Стоимость | Особенности | Сайт |
|---|---|---|---|
| NumWords | Бесплатно | Поддерживает 15 валют, работает в Excel 2007–2023 | numwords.com |
| РубльТекст | от 500 ₽ | Русскоязычный интерфейс, склонение по падежам, поддержка НДС | rubltext.ru |
| Excel Number to Words | $19.99 | Мультиязычная поддержка, интеграция с Word | ablebits.com |
Установка плагинов стандартна:
- Скачайте файл надстройки (
.xlamили.xlsm). - В Excel перейдите в
Файл → Параметры → Надстройки → Управление надстройками Excel. - Нажмите
Обзор, выберите скачанный файл и подтвердите установку.
Типичные ошибки и как их избежать
При работе с прописью в 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 не учитывают грамматические правила. Решения:
- Используйте VBA-скрипт с корректной обработкой падежей (приведенный выше код уже учитывает это).
- Установите специализированную надстройку (например, РубльТекст).
- Правьте результат вручную (актуально для небольших объемов данных).
Можно ли автоматически обновлять пропись при изменении числа?
Да, если вы используете:
- 🔹 Формулы — пропись обновляется автоматически при изменении исходного числа.
- 🔹 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 содержит дату.