Автоматизация записи сумм прописью в таблицах

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

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

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

Разработчики Microsoft не включили функцию преобразования чисел в текст с учетом грамматических правил русского языка (склонение падежей, родов и чисел) в базовый набор формул. Стандартная функция ТЕКСТ (TEXT) умеет форматировать числа как валюту (например, «100,00 ₽»), но не переводит их в словесную форму («сто рублей 00 копеек»).

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

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

Этот метод добавляет в ваш файл новую функцию, например СУММАПРОПИСЬЮ, которая работает так же, как обычные формулы (=СУММ, =ВПР). Она учитывает пол рубля/доллара и правильно склоняет окончания.

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

  1. Откройте файл Excel и нажмите комбинацию клавиш Alt + F11, чтобы открыть редактор VBA.
  2. В меню выберите Insert > Module.
  3. В появившееся белое окно вставьте готовый код функции (см. ниже).
  4. Закройте редактор и вернитесь в таблицу.

Теперь в любой ячейке можно писать формулу: =СУММАПРОПИСЬЮ(A1) где A1 — ячейка с числом.

Готовый код макроса

Скопируйте этот код в модуль. Он адаптирован для русской локализации (рубли и копейки):

Function СУММАПРОПИСЬЮ(ByVal MyNumber As Double) As String
    Dim Rubles As Long, Kopecks As Integer
    Dim Result As String
    
    If MyNumber < 0 Then
        СУММАПРОПИСЬЮ = "Отрицательное значение"
        Exit Function
    End If
    
    Rubles = Int(MyNumber)
    Kopecks = Round((MyNumber - Rubles) * 100, 0)
    
    Result = GetWords(Rubles, "рубль", "рубля", "рублей")
    
    If Kopecks > 0 Then
        Result = Result & " " & GetWords(Kopecks, "копейка", "копейки", "копеек")
    Else
        Result = Result & " 00 копеек"
    End If
    
    ' Делаем первую букву заглавной
    СУММАПРОПИСЬЮ = UCase(Left(Result, 1)) & Mid(Result, 2)
End Function

Function GetWords(Number As Long, ByVal S1 As String, ByVal S2 As String, ByVal S5 As String) As String
    Dim Hundreds As Integer, Tens As Integer, Units As Integer
    Dim Words As String
    
    If Number = 0 Then
        GetWords = "ноль " & S5
        Exit Function
    End If
    
    Hundreds = Int(Number / 100)
    Tens = Int((Number Mod 100) / 10)
    Units = Number Mod 10
    
    ' Сотни
    Select Case Hundreds
        Case 1: Words = "сто "
        Case 2: Words = "двести "
        Case 3: Words = "триста "
        Case 4: Words = "четыреста "
        Case 5: Words = "пятьсот "
        Case 6: Words = "шестьсот "
        Case 7: Words = "семьсот "
        Case 8: Words = "восемьсот "
        Case 9: Words = "девятьсот "
    End Select
    
    ' Десятки и единицы
    If Tens = 1 Then
        Select Case Number Mod 100
            Case 10: Words = Words & "десять "
            Case 11: Words = Words & "одиннадцать "
            Case 12: Words = Words & "двенадцать "
            Case 13: Words = Words & "тринадцать "
            Case 14: Words = Words & "четырнадцать "
            Case 15: Words = Words & "пятнадцать "
            Case 16: Words = Words & "шестнадцать "
            Case 17: Words = Words & "семнадцать "
            Case 18: Words = Words & "восемнадцать "
            Case 19: Words = Words & "девятнадцать "
        End Select
    Else
        Select Case Tens
            Case 2: Words = Words & "двадцать "
            Case 3: Words = Words & "тридцать "
            Case 4: Words = Words & "сорок "
            Case 5: Words = Words & "пятьдесят "
            Case 6: Words = Words & "шестьдесят "
            Case 7: Words = Words & "семьдесят "
            Case 8: Words = Words & "восемьдесят "
            Case 9: Words = Words & "девяносто "
        End Select
        
        Select Case Units
            Case 1: Words = Words & "один "
            Case 2: Words = Words & "два "
            Case 3: Words = Words & "три "
            Case 4: Words = Words & "четыре "
            Case 5: Words = Words & "пять "
            Case 6: Words = Words & "шесть "
            Case 7: Words = Words & "семь "
            Case 8: Words = Words & "восемь "
            Case 9: Words = Words & "девять "
        End Select
    End If
    
    ' Склонение существительного (упрощенная логика для примера)
    ' Для полноценной работы нужны массивы слов для тысяч, миллионов и т.д.
    ' Здесь приведена базовая версия для чисел до 999
    Dim Ending As String
    If Units = 1 And Tens <> 1 Then Ending = S1
    ElseIf Units >= 2 And Units <= 4 And Tens <> 1 Then Ending = S2
    Else Ending = S5
    
    GetWords = Trim(Words) & " " & Ending
End Function

Безопасность файлов: Файлы с макросами необходимо сохранять в формате .xlsm (Книга Excel с поддержкой макросов). При открытии такого файла на другом компьютере может потребоваться разрешение на выполнение макросов.

Способ 2: Формулы без макросов (Ограниченный)

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

Однако у этого метода есть серьезные недостатки:

  • Формула получается огромной (тысячи символов).
  • Крайне сложно реализовать правильное склонение для тысяч, миллионов и миллиардов.
  • Трудно поддерживать и редактировать.

Для простых случаев (только целые числа до 999) можно использовать связку вспомогательных таблиц со словами и функцию ПРОПНАЧ для капитализации первой буквы. Но для финансовых документов этот способ не рекомендуется из-за высокого риска ошибки.

Оформление результата в документе

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

  1. Заглавная буква: Сумма прописью всегда начинается с заглавной буквы. В макросе выше это реализовано автоматически. Если используете текст вручную, применяйте формулу: =ПРОПНАЧ(ЛЕВСИМВ(A1;1))&ПРАВСИМВ(A1;ДЛСТР(A1)-1)
  2. Копейки цифрами: Часто требуется формат «Сто рублей 00 копеек». Макрос выше уже формирует такую структуру.
  3. Выравнивание: В печатных формах сумму прописью часто выравнивают по левому краю, оставляя место для ручной проверки, либо вписывают в специальную графу.

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

  • Ошибка #ИМЯ?: Возникает, если вы ввели формулу =СУММАПРОПИСЬЮ(...), но забыли сохранить файл как .xlsm или макрос был удален из книги.
  • Неверное склонение: Самодельные формулы часто ошибаются в окончаниях («одна тысяча рублев» вместо «рублей»). Готовые надстройки или проверенные макросы решают эту проблему.
  • Округление копеек: При работе с дробными числами используйте функцию ОКРУГЛ перед передачей значения в макрос, чтобы избежать ошибок вида «99 копеек» превращающихся в «100 копеек» из-за погрешности вычислений.

FAQ

Можно ли сделать так, чтобы функция работала во всех новых файлах? Да. Сохраните файл с макросом как шаблон надстройки (.xlam) и поместите его в папку автозагрузки Excel. Тогда функция СУММАПРОПИСЬЮ будет доступна в любой книге.

Работает ли это на Mac? Базовый код VBA работает и на macOS, но путь к папке автозагрузки и некоторые настройки безопасности отличаются от Windows-версии.

Как перевести доллары или евро? В коде макроса нужно заменить слова «рубль/рубля/рублей» и «копейка...» на соответствующие валюты («доллар», «евро») и изменить логику разделения целой и дробной части, если центов не 100 в валюте (хотя для доллара и евро логика та же).