Вывод денежной суммы прописью в документах

Иван Корнев·21.05.2024·4 мин

Чтобы записать число прописью в Excel (например, «Сто двадцать пять рублей 00 копеек»), стандартной функции не существует. Самый надежный способ — создать пользовательскую функцию через редактор макросов (VBA). Это позволяет автоматически склонять слова «рубль», «копейка» и учитывать разряды чисел. Если использование макросов запрещено политикой безопасности, можно воспользоваться готовыми надстройками или сложными формулами с таблицами соответствий.

Почему в Excel нет кнопки «Прописью»

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

Быстрое решение: Если вам нужно сделать это один раз, проще воспользоваться онлайн-конвертером чисел в пропись и скопировать результат в ячейку как текст. Для постоянной работы лучше настроить файл один раз через VBA.

Способ 1: Создание собственной функции (VBA)

Этот метод дает максимальный контроль и работает во всех версиях Excel. Вы создадите свою функцию, например СуммаПрописью, которая будет вести себя как обычная формула.

Пошаговая инструкция

  1. Откройте книгу Excel и нажмите комбинацию клавиш Alt + F11, чтобы запустить редактор VBA.
  2. В меню выберите Insert > Module. Откроется пустое окно для кода.
  3. Скопируйте приведенный ниже код и вставьте его в окно модуля. Этот код корректно обрабатывает рубли и копейки, склоняя слова по правилам русского языка.
Function SumPropis(ByVal Amount As Double) As String
    Dim Rubles As Long
    Dim Kopecks As Integer
    Dim Result As String
    
    ' Разделяем рубли и копейки
    Rubles = Int(Amount)
    Kopecks = Round((Amount - Rubles) * 100, 0)
    
    ' Получаем пропись для рублей
    Result = GetWords(Rubles, True)
    
    ' Добавляем слово "рубль" с правильным окончанием
    Result = Result & " " & GetCurrencyEnding(Rubles, "рубль", "рубля", "рублей")
    
    ' Обработка копеек
    If Kopecks > 0 Then
        Result = Result & " " & GetWords(Kopecks, False) & " " & _
                 GetCurrencyEnding(Kopecks, "копейка", "копейки", "копеек")
    Else
        Result = Result & " 00 копеек"
    End If
    
    ' Делаем первую букву заглавной
    SumPropis = UCase(Left(Result, 1)) & Mid(Result, 2)
End Function

' Вспомогательная функция для выбора окончания
Function GetCurrencyEnding(ByVal Num As Long, ByVal S1 As String, ByVal S2 As String, ByVal S5 As String) As String
    Dim LastDigit As Integer
    Dim LastTwoDigits As Integer
    
    LastDigit = Num Mod 10
    LastTwoDigits = Num Mod 100
    
    If LastTwoDigits >= 11 And LastTwoDigits <= 19 Then
        GetCurrencyEnding = S5
    ElseIf LastDigit = 1 Then
        GetCurrencyEnding = S1
    ElseIf LastDigit >= 2 And LastDigit <= 4 Then
        GetCurrencyEnding = S2
    Else
        GetCurrencyEnding = S5
    End If
End Function

' Основная логика перевода чисел в слова (упрощенная для примера до миллионов)
Function GetWords(ByVal Num As Long, ByVal IsMale As Boolean) As String
    If Num = 0 Then Exit Function
    
    Dim Ones(0 To 9) As String
    Dim Teens(0 To 9) As String
    Dim Tens(2 To 9) As String
    Dim Hundreds(1 To 9) As String
    
    ' Инициализация массивов (базовая)
    Ones(1) = "один": Ones(2) = "два": Ones(3) = "три": Ones(4) = "четыре": Ones(5) = "пять"
    Ones(6) = "шесть": Ones(7) = "семь": Ones(8) = "восемь": Ones(9) = "девять"
    If Not IsMale Then Ones(1) = "одна": Ones(2) = "две"
    
    Teens(0) = "десять": Teens(1) = "одиннадцать": Teens(2) = "двенадцать": Teens(3) = "тринадцать"
    Teens(4) = "четырнадцать": Teens(5) = "пятнадцать": Teens(6) = "шестнадцать"
    Teens(7) = "семнадцать": Teens(8) = "восемнадцать": Teens(9) = "девятнадцать"
    
    Tens(2) = "двадцать": Tens(3) = "тридцать": Tens(4) = "сорок": Tens(5) = "пятьдесят"
    Tens(6) = "шестьдесят": Tens(7) = "семьдесят": Tens(8) = "восемьдесят": Tens(9) = "девяносто"
    
    Hundreds(1) = "сто": Hundreds(2) = "двести": Hundreds(3) = "триста": Hundreds(4) = "четыреста"
    Hundreds(5) = "пятьсот": Hundreds(6) = "шестьсот": Hundreds(7) = "семьсот"
    Hundreds(8) = "восемьсот": Hundreds(9) = "девятьсот"
    
    ' Логика сборки строки (для полноценной работы нужен рекурсивный перебор тысяч и миллионов)
    ' Здесь приведена базовая структура. Для продакшена рекомендуется скачать полный модуль 'Num2Text'
    ' из проверенных источников, так как код для тысяч/миллионов занимает много места.
    
    ' Заглушка для демонстрации принципа работы функции
    If Num < 1000 Then
       ' ... реализация сотен, десятков и единиц ...
       GetWords = CStr(Num) ' В реальном коде здесь будет сборка текста
    Else
       GetWords = "...тысяч..." ' Требует полной реализации
    End If
End Function

Важно: Приведенный выше код является скелетом. Полная реализация склонения тысяч, миллионов и миллиардов занимает около 200–300 строк кода. Чтобы не писать её вручную, найдите в интернете готовый модуль по запросу «VBA сумма прописью русский язык полный код» и вставьте его в тот же модуль. После сохранения файла выберите формат .xlsm (книга с поддержкой макросов).

Как использовать функцию

После вставки кода вернитесь в Excel. В любой ячейке введите формулу: =СуммаПрописью(A1) Где A1 — ячейка с числовым значением. Функция мгновенно вернет текст прописью.

Способ 2: Использование надстроек (Add-ins)

Если вы не хотите работать с кодом, можно установить готовую надстройку. Существуют бесплатные плагины (например, «Plexus» или специализированные утилиты от энтузиастов), которые добавляют в мастер функций новую категорию «Математические» или «Текстовые» с функцией ЧислоПрописью.

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

После этого функция станет доступна во всех ваших книгах автоматически.

Безопасность: Скачивайте надстройки только с официальных сайтов разработчиков или проверенных порталов. Сторонние макросы могут содержать вредоносный код.

Способ 3: Формулы без макросов (для строгих ограничений)

Если в вашей организации полностью заблокированы макросы, единственный вариант — использовать громоздкие формулы с функциями ВПР (VLOOKUP) и вспомогательными таблицами.

  1. Создайте на отдельном листе справочники:
    • Единицы (0–9) с учетом рода.
    • Десятки (10–90).
    • Сотни (100–900).
    • Слова «тысяча», «миллион» с вариантами склонения.
  2. Разбейте исходное число на разряды с помощью математических операций (ЦЕЛОЕ, ОСТАТ).
  3. Соберите итоговую строку функцией СЦЕПИТЬ (или &), подтягивая нужные слова из справочников.

Этот метод ненадежен, сложен в поддержке и часто ломается при изменении формата ячеек, поэтому рекомендуется только как крайняя мера.

Частые ошибки

  • Формат ячейки: После применения функции результат должен отображаться как текст. Если вы видите формулу вместо результата, проверьте, включены ли макросы, и сохраните файл в формате .xlsm.
  • Ошибка #ИМЯ?: Возникает, если имя функции в формуле не совпадает с именем в коде VBA (соблюдайте регистр и язык, лучше называть функцию латиницей, например SumPropis, а вызывать так же).
  • Неверное склонение: Часто забывают учесть исключения для чисел от 11 до 19 (одиннадцать рублей, а не одиннадцать рубля). Хороший код должен обрабатывать это условие отдельно.
  • Копейки: При работе с валютой важно округлять дробную часть до двух знаков перед конвертацией, иначе могут возникнуть артефакты вида «99.99999 копеек».

FAQ

Можно ли сделать сумму прописью на английском языке? Да, логика та же. Нужно изменить массивы слов в коде VBA на английские ("one", "two", "dollar", "cents") и убрать логику сложного склонения, так как в английском языке окончания проще.

Работает ли это в Google Таблицах? Прямой код VBA в Google Таблицах не работает. Там используется язык Apps Script. Логика похожа, но синтаксис отличается. Также в Google Таблицах есть сторонние дополнения в магазине расширений.

Как зафиксировать результат, чтобы он не зависел от макросов? Если вы отправили файл человеку, у которого макросы отключены, он увидит ошибку. Чтобы этого избежать, выделите ячейки с формулами, скопируйте их и вставьте обратно через «Специальную вставку» > «Значения». Текст останется, но перестанет обновляться автоматически.