Вывод денежной суммы прописью в документах
Чтобы автоматически преобразовать число в текст прописью в Excel (например, «1250,50» в «Одна тысяча двести пятьдесят рублей 50 копеек»), необходимо использовать пользовательскую функцию на языке VBA или стороннюю надстройку, так как стандартными формулами это сделать невозможно. Самый надежный и бесплатный способ — внедрить готовый макрос в книгу, что позволит выводить корректную сумму с учетом склонения слов для любых финансовых документов.
Краткий ответ: Встроенной функции типа =СУММАПРОПИСЬЮ() в русском Excel нет. Решение требует включения поддержки макросов (.xlsm) и вставки небольшого программного кода.
Почему нет встроенной функции и какие есть варианты
Разработчики Microsoft не включили функцию конвертации чисел в слова для русского языка в базовый пакет Excel из-за сложностей грамматического склонения (изменение окончаний в зависимости от числа и падежа). Пользователям доступны три основных пути решения задачи:
- Макросы VBA (Рекомендуемый). Позволяют создать свою функцию, которая работает быстро, бесплатно и не требует установки лишнего софта. Файл нужно сохранять в формате
.xlsm. - Надстройки (Add-ins). Специальные плагины от сторонних разработчиков, добавляющие нужную функцию. Часто являются платными или требуют сложной установки.
- Сложные формулы. Теоретически возможно собрать конвертер через комбинацию функций
ТЕКСТ,ВЫБОРи таблиц подстановки, но такая формула будет громоздкой, медленной и трудно поддерживаемой.
Важно: Если вы используете метод с макросами, при отправке файла коллеге он должен разрешить выполнение макросов в своих настройках безопасности Excel, иначе функция вернет ошибку #ИМЯ?.
Пошаговая инструкция: создание функции через VBA
Этот метод создает пользовательскую функцию СуммаПрописью, которую можно использовать в ячейках как обычную формулу.
Шаг 1. Открытие редактора кода
- Откройте файл Excel.
- Нажмите комбинацию клавиш
Alt + F11. Откроется окно редактора Visual Basic. - В меню выберите Insert (Вставка) → Module (Модуль). Появится белое поле для ввода кода.
Шаг 2. Вставка кода конвертера
Скопируйте приведенный ниже код и вставьте его в окно модуля. Этот алгоритм корректно обрабатывает рубли, копейки и склонения числительных.
Option Explicit
' Основная функция, вызываемая в ячейке: =СуммаПрописью(A1)
Public Function СуммаПрописью(ByVal Amount As Variant) As String
Dim rubles As Long
Dim kopeks As Integer
Dim sRub As String
Dim sKop As String
If IsEmpty(Amount) Or Not IsNumeric(Amount) Then
СуммаПрописью = ""
Exit Function
End If
' Округляем до 2 знаков и разделяем на рубли и копейки
Amount = Round(CDbl(Amount), 2)
rubles = Int(Amount)
kopeks = Round((Amount - rubles) * 100, 0)
' Получаем текст для рублей и копеек
sRub = GetNumberText(rubles, 0) & " " & GetCurrencyForm(rubles, "рубль", "рубля", "рублей")
sKop = GetNumberText(kopeks, 1) & " " & GetCurrencyForm(kopeks, "копейка", "копейки", "копеек")
' Первая буква заглавная
СуммаПрописью = UCase(Left(sRub, 1)) & Mid(sRub, 2) & " " & sKop
End Function
' Функция выбора правильного окончания валюты
Private Function GetCurrencyForm(ByVal n As Long, ByVal f1 As String, ByVal f2 As String, ByVal f5 As String) As String
Dim mod100 As Integer
Dim mod10 As Integer
mod100 = n Mod 100
mod10 = n Mod 10
If mod100 >= 11 And mod100 <= 19 Then
GetCurrencyForm = f5
ElseIf mod10 = 1 Then
GetCurrencyForm = f1
ElseIf mod10 >= 2 And mod10 <= 4 Then
GetCurrencyForm = f2
Else
GetCurrencyForm = f5
End If
End Function
' Рекурсивная функция перевода числа в текст
Private Function GetNumberText(ByVal n As Long, ByVal gender As Integer) As String
' gender: 0 - мужской (рубли), 1 - женский (копейки/тысячи), 2 - средний (миллионы)
Dim result As String
If n = 0 Then
GetNumberText = ""
Exit Function
End If
' Массивы слов
Dim unitsM As Variant, unitsF As Variant, unitsN As Variant
unitsM = Split("один два три четыре пять шесть семь восемь девять", " ")
unitsF = Split("одна две три четыре пять шесть семь восемь девять", " ")
unitsN = Split("одно два три четыре пять шесть семь восемь девять", " ")
Dim tens As Variant
tens = Split("десять одиннадцать двенадцать тринадцать четырнадцать пятнадцать шестнадцать семнадцать восемнадцать девятнадцать двадцать тридцать сорок пятьдесят шестьдесят семьдесят восемьдесят девяносто", " ")
Dim hundreds As Variant
hundreds = Split("сто двести триста четыреста пятьсот шестьсот семьсот восемьсот девятьсот", " ")
' Обработка миллионов
If n >= 1000000 Then
Dim millions As Long
millions = n \ 1000000
result = GetNumberText(millions, 2) & " " & GetCurrencyForm(millions, "миллион", "миллиона", "миллионов")
n = n Mod 1000000
If n > 0 Then result = result & " "
End If
' Обработка тысяч
If n >= 1000 Then
Dim thousands As Long
thousands = n \ 1000
result = result & GetNumberText(thousands, 1) & " " & GetCurrencyForm(thousands, "тысяча", "тысячи", "тысяч")
n = n Mod 1000
If n > 0 Then result = result & " "
End If
' Сотни
If n >= 100 Then
result = result & hundreds((n \ 100) - 1)
n = n Mod 100
If n > 0 Then result = result & " "
End If
' Десятки и единицы
If n >= 20 Then
result = result & tens((n \ 10) - 8) ' Смещение индекса массива
n = n Mod 10
If n > 0 Then result = result & " "
ElseIf n >= 10 Then
result = result & tens(n - 10)
n = 0
End If
' Единицы с учетом рода
If n > 0 Then
Dim word As String
If gender = 0 Then word = unitsM(n - 1)
If gender = 1 Then word = unitsF(n - 1)
If gender = 2 Then word = unitsN(n - 1)
result = result & word
End If
GetNumberText = Trim(result)
End Function
Шаг 3. Использование функции
- Закройте редактор VBA (крестик в углу окна).
- Вернитесь в Excel. В любой ячейке введите формулу:
=СуммаПрописью(A1)ГдеA1— ячейка с числовым значением (например,1540.25). - Результат: «Одна тысяча пятьсот сорок рублей 25 копеек».
Совет по форматированию: Если вам нужно, чтобы копейки тоже были прописью полностью, измените в коде строку формирования sKop, убрав прямую вставку числа и используя только функцию GetNumberText. В текущем варианте кода копейки выводятся цифрами для соответствия стандартам многих бухгалтерских программ, но при необходимости это легко правится.
Настройка безопасности и сохранение файла
Поскольку решение использует макросы, стандартное сохранение (.xlsx) удалит весь код.
- Нажмите Файл → Сохранить как.
- В типе файла выберите Книга Excel с поддержкой макросов (*.xlsm).
- При открытии файла на другом компьютере может появиться желтая полоса предупреждения безопасности. Нажмите «Включить содержимое», чтобы формула начала работать.
Если макросы заблокированы политикой организации, единственным выходом остается использование сторонних надстроек, устанавливаемых администратором, либо ручное копирование текста из подготовленного шаблона.
Частые ошибки
- Ошибка
#ИМЯ?(или#NAME?):- Вы сохранили файл как обычный
.xlsx, и код макроса удалился. Пересохраните как.xlsm. - Макросы отключены в настройках безопасности Excel. Включите их в центре управления безопасностью.
- Опечатка в названии функции в формуле. Проверьте, что пишете
=СуммаПрописью(...).
- Вы сохранили файл как обычный
- Неверное склонение (например, «1 рублей»):
- Обычно это происходит при использовании самописных формул без учета правил русского языка. Предложенный выше код учитывает правила для 1, 2-4 и 5-20, а также составных чисел.
- Копейки отображаются как «0.5» вместо «50»:
- Убедитесь, что исходное число в ячейке имеет правильный числовой формат, а не текстовый. Функция использует округление
Round(..., 2), поэтому дробные части больше двух знаков будут обрезаны математически.
- Убедитесь, что исходное число в ячейке имеет правильный числовой формат, а не текстовый. Функция использует округление
FAQ
Можно ли сделать так, чтобы слово «рублей» писалось полностью, а не сокращенно?
Да, в предложенном коде уже используется полное написание («рублей», «копеек»). Если вам нужны сокращения («руб.», «коп.»), измените массивы окончаний в функции GetCurrencyForm.
Работает ли это в Excel для Mac?
Да, код совместим с macOS, однако путь к редактору может отличаться (меню «Сервис» → «Макрос» → «Редактор Visual Basic» или сочетание Opt + F11).
Как убрать слово «копейки», если их значение 0?
Добавьте условие в основную функцию: если kopeks = 0, то не добавлять часть строки с копейками, а дописать «00 копеек» или оставить пустым в зависимости от требований вашего документа.
Можно ли использовать эту функцию в условном форматировании? Нет, пользовательские функции VBA нельзя напрямую использовать в правилах условного форматирования. Они работают только как значения ячеек.