Преобразование числовых значений в текстовый формат прописью — одна из самых востребованных задач в бухгалтерии, финансовом учете и документообороте. Когда вы формируете счета, акты или договоры в Microsoft Excel, суммы в цифрах часто требуется дублировать словами. Например, вместо 1 256,78 ₽ нужно получить "Одна тысяча двести пятьдесят шесть рублей 78 копеек".
В этой статье мы разберем 5 рабочих способов реализовать эту функцию: от встроенных инструментов Excel до пользовательских формул и макросов на VBA. Вы узнаете, какой метод подходит для вашей версии программы (включая Excel 365, 2019, 2016 и более ранние), как адаптировать вывод под российский рубль или иностранную валюту, а также избежать типичных ошибок при работе с большими числами или дробными значениями.
Особое внимание уделим нюансам оформления: склонению числительных, обработке нулевых значений и интеграции функции в динамические таблицы. Если вы никогда не работали с VBA — не переживайте: мы предоставим готовые скрипты с подробными комментариями, которые можно просто скопировать и вставить.
Для удобства все методы проранжированы по сложности — от самых простых (подходящих новичкам) до продвинутых (для автоматизации массовых документов). Также в конце статьи вы найдете FAQ с ответами на частые вопросы и таблицу сравнения способов по скорости выполнения и универсальности.
1. Стандартная функция БАТЕКСТ (только для английской версии Excel)
Если у вас установлена англоязычная версия Excel, вы можете воспользоваться встроенной функцией =BAHTTEXT(). Она преобразует числа в текст прописью, но с двумя существенными ограничениями:
- 🌍 Вывод осуществляется на английском языке (например,
100→ "One hundred baht"). - 💰 Валюта по умолчанию — бат (таиландская валюта), что не подходит для российских документов.
Тем не менее, функцию можно адаптировать для рублевых сумм с помощью вложенных формул. Пример для числа в ячейке A1:
=SUBSTITUTE(SUBSTITUTE(BAHTTEXT(A1), "Baht", "рубль"), "Satang", "копейка")
⚠️ Внимание: В русской версии Excel функцияБАТЕКСТ()отсутствует. Попытка её использования приведёт к ошибке#ИМЯ?.
Для пользователей Excel 365 с подпиской Microsoft 365 доступна экспериментальная функция =TEXTAFTER() в комбинации с BAHTTEXT, но её применение требует глубокой настройки локализации.
2. Пользовательская функция на VBA для русского языка
Самый универсальный и точный способ — создать пользовательскую функцию (UDF) на языке VBA. Она будет корректно склонять числительные для рублей и копеек, обрабатывать дробные значения и поддерживать числа до 999 триллионов.
Чтобы добавить функцию:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - В меню выберите
Insert → Module. - Скопируйте и вставьте следующий код:
Function SumProp(ByVal MyNumber As Currency) As StringDim Rub As String, Kop As String, Temp As String
Dim DecimalPlace As Integer, Cnt As Integer
Dim Place(9) As String
Place(2) = " тысячи "
Place(3) = " миллиона "
Place(4) = " миллиарда "
Place(5) = " триллиона "
MyNumber = Round(MyNumber, 2)
Rub = Int(MyNumber)
Kop = Format(CStr((MyNumber - Rub) * 100), "00")
If Rub = 0 Then Rub = ""
If Kop = 0 Then Kop = "" Else Kop = " " & Kop & " копейки"
If Rub <> "" Then
Temp = ""
DecimalPlace = 1
Do While Rub > 0
Cnt = Rub Mod 1000
If Cnt <> 0 Then
Temp = ConvertLessThanOneThousand(Cnt, DecimalPlace) & Place(DecimalPlace) & Temp
End If
Rub = Rub \ 1000
DecimalPlace = DecimalPlace + 1
Loop
Rub = Application.WorksheetFunction.Trim(Temp)
End If
Select Case Kop
Case " 01 копейки": Kop = " 01 копейка"
Case " 02 копейки", " 03 копейки", " 04 копейки": Kop = Left(Kop, 7) & "а"
Case Else: Kop = Kop
End Select
Select Case Rub
Case "один рубль": Rub = "один рубль"
Case "два рубля", "три рубля", "четыре рубля": Rub = Left(Rub, Len(Rub) - 5) & "а"
Case Else: Rub = Rub & " рублей"
End Select
SumProp = Rub & Kop
End Function
Function ConvertLessThanOneThousand(ByVal MyNumber, DecimalPlace As Integer)
Dim Txt As String, Ones As String, Tens As String
Dim Hundreds As String
Ones = Array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять")
Tens = Array("", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто")
Hundreds = Array("", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот")
If Val(MyNumber) = 0 Then Exit Function
If MyNumber >= 100 Then
Txt = Hundreds(Int(MyNumber / 100)) & " "
MyNumber = MyNumber - Int(MyNumber / 100) * 100
End If
If MyNumber >= 20 Then
Txt = Txt & Tens(Int(MyNumber / 10))
MyNumber = MyNumber - Int(MyNumber / 10) * 10
If MyNumber > 0 Then Txt = Txt & " "
End If
If MyNumber >= 10 Then
Select Case MyNumber
Case 10: Txt = Txt & "десять"
Case 11: Txt = Txt & "одиннадцать"
Case 12: Txt = Txt & "двенадцать"
Case 13: Txt = Txt & "тринадцать"
Case 14: Txt = Txt & "четырнадцать"
Case 15: Txt & "пятнадцать"
Case 16: Txt & "шестнадцать"
Case 17: Txt & "семнадцать"
Case 18: Txt & "восемнадцать"
Case 19: Txt & "девятнадцать"
End Select
MyNumber = 0
Else
Txt = Txt & Ones(MyNumber)
End If
ConvertLessThanOneThousand = Txt
End Function
После вставки кода закройте редактор VBA и используйте функцию в таблице как
=SumProp(A1), гдеA1— ячейка с числом. Функция автоматически склоняет рубли и копейки по правилам русского языка.Убедитесь, что макросы разрешены в
Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов|Проверьте регистр в названии функции (например,SumProp, а неsumprop)|Тестируйте функцию на числах с разным количеством разрядов (123, 1000, 1234567,89)|Сохраните файл как.xlsm(с поддержкой макросов)-->
3. Использование надстройки "ЧислоПрописью"
Если вам не хочется работать с VBA, можно установить бесплатную надстройку "ЧислоПрописью" от Microsoft или сторонних разработчиков. Она добавляет в Excel новую функцию, которую можно использовать как стандартную.
Где скачать и как установить:
- 🔗 Официальный репозиторий надстроек: перейдите в
Вставка → Надстройки → Просмотреть другие надстройкии найдите "ЧислоПрописью". - 📥 Альтернативные источники: сайты PlanetaExcel или ExcelWorld (проверяйте файлы на вирусы!).
После установки в списке функций появится
=ЧИСЛОПРОПИСЬЮ(). Пример использования:=ЧИСЛОПРОПИСЬЮ(A1; "рубль"; "рубля"; "рублей"; "копейка"; "копейки"; "копеек")Преимущества надстройки:
- ✅ Не требует знаний VBA.
- ✅ Поддерживает многовалютность (можно указать доллары, евро и т.д.).
- ✅ Автоматически обновляется при изменении исходных данных.
- 🔗 Официальный репозиторий надстроек: перейдите в
⚠️ Внимание: Некоторые надстройки конфликтуют с защищёнными книгами или файлами, открытыми в режиме совместимости. Перед установкой сохраните резервную копию документа.
4. Формулы без VBA: комбинация TEXT и ПОДСТАВИТЬ
Для пользователей, у которых отключены макросы или нет возможности устанавливать надстройки, подойдёт комбинация стандартных функций. Этот метод менее гибкий, но работает в любой версии Excel.
Пример формулы для числа в ячейке A1 (до 999 999 рублей):
=ЕСЛИ(A1=0; "ноль рублей";
ТЕКСТ(ЦЕЛОЕ(A1);"[$-419]0") & " " &
ВЫБРАТЬ(ОСТАТ(ЦЕЛОЕ(A1);100);
"рубль";"рубля";"рубля";"рубля";"рублей";"рублей";"рублей";"рублей";"рублей";"рублей") &
ЕСЛИ(ОСТАТ(A1;1)*100>0;
" " & ТЕКСТ(ОКРУГЛ(ОСТАТ(A1;1)*100;0);"00") & " копеек";""))
Ограничения метода:
- 🔢 Работает только с числами до 1 миллиона.
- 📉 Не корректно склоняет все числительные (например, "один рубль" будет выведен как "1 рубль").
- 🔄 Требует ручной настройки для каждого диапазона (тысячи, миллионы и т.д.).
- Выделите исходную таблицу и нажмите
Данные → Из таблицы/диапазона(в Excel 2016+). - В редакторе Power Query добавьте пользовательский столбец с формулой на языке M:
(Number) =>let
Rubles = Number.IntegerDivide(Number, 1),
Kop = Number.Mod(Number, 1) * 100,
TextRub = if Rubles = 0 then "ноль" else
List.FirstN(
{
"", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять",
"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать",
"шестнадцать", "семнадцать", "восемнадцать", "девятнадцать", "двадцать"
},
if Rubles < 21 then Rubles + 1 else 1
) & " рублей",
TextKop = if Kop = 0 then "" else
Number.ToText(Kop, "00") & " копеек"
in
TextRub & TextKop
- Замените
Number.ToText(Kop, "00")на полноценную функцию преобразования, если нужна пропись для копеек. - Нажмите
Закрыть и загрузить, чтобы вернуть данные в Excel.
Для улучшения результата можно создать вспомогательную таблицу со словами ("один", "два", ..., "девятьсот") и использовать
Создайте на отдельном листе таблицу с двумя столбцами: в первом — числа (1, 2, ..., 999), во втором — их текстовые эквиваленты ("один", "два", ..., "девятьсот девяносто девять"). Затем используйте формулу:ПОИСКПОЗ() + ИНДЕКС() для подстановки.
Пример вспомогательной таблицы для числительных
=ИНДЕКС(Лист2!$B$1:$B$999; ПОИСКПОЗ(ЦЕЛОЕ(A1); Лист2!$A$1:$A$999; 0)) & " рублей"
5. Power Query: преобразование для больших массивов данных
Если вам нужно преобразовать тысячи строк (например, в выгрузке банковских платежей), удобнее использовать Power Query. Этот инструмент позволяет создать один раз шаблон преобразования и применять его к новым данным автоматически.
Алгоритм действий:
Преимущества Power Query:
- 🔄 Обрабатывает миллионы строк без замедления.
- 🔗 Легко обновляется при изменении исходных данных (
Данные → Обновить все). - 📊 Поддерживает сложные преобразования (например, добавление валюты или форматирование).
⚠️ Внимание: В бесплатной версии Excel 2016 и старше Power Query называется Power Query для Excel и требует отдельной установки с сайта Microsoft.
Сравнение методов: какой выбрать?
Чтобы помочь вам определиться, мы составили таблицу с плюсами и минусами каждого способа:
| Метод | Сложность | Макс. число | Склонение | Требует макросов | Подходит для |
|---|---|---|---|---|---|
BAHTTEXT |
⭐ | 999 трлн | ❌ (английский) | ❌ | Англоязычные документы |
VBA (SumProp) |
⭐⭐ | 999 трлн | ✅ (руб./коп.) | ✅ | Бухгалтерия, акты, счета |
| Надстройка | ⭐ | 999 трлн | ✅ | ❌ | Пользователи без навыков VBA |
Формулы TEXT+ПОДСТАВИТЬ |
⭐⭐⭐ | 1 млн | ⚠️ (частично) | ❌ | Простые задачи, небольшие таблицы |
| Power Query | ⭐⭐⭐ | 999 трлн | ⚠️ (требует доработки) | ❌ | Большие массивы данных |
Для 90% задач оптимальным решением будет пользовательская функция на VBA (SumProp). Она сочетает гибкость, точность склонений и поддержку больших чисел. Если макросы отключены по политике безопасности компании, используйте надстройку или Power Query.
Типичные ошибки и как их избежать
При работе с преобразованием чисел в текст прописью пользователи часто сталкиваются с следующими проблемами:
- 💥 Ошибка #ИМЯ? — возникает, если название функции написано с ошибкой или не подключена надстройка. Проверьте регистр и наличие макросов в файле (
.xlsm). - 🔄 Неправильное склонение — например, "1 рублей" вместо "1 рубль". Это исправляется доработкой функции VBA (см. блок
Select Caseв коде). - 📉 Округление копеек — если в ячейке
123,456, а нужно123,46, используйте=ОКРУГЛ(A1; 2)перед преобразованием. - 🌍 Неправильная валюта — при использовании
BAHTTEXTне забывайте заменять "baht" на "рубль" с помощьюПОДСТАВИТЬ.
Чтобы проверить корректность работы функции, протестируйте её на крайних значениях:
0 → "ноль рублей"
1 → "один рубль"
2 → "два рубля"
5 → "пять рублей"
11 → "одиннадцать рублей"
100 → "сто рублей"
101 → "сто один рубль"
1000,99 → "одна тысяча рублей 99 копеек"
FAQ: Ответы на частые вопросы
Можно ли сделать сумму прописью без VBA и надстроек?
Да, но с ограничениями. Используйте комбинацию функций ТЕКСТ, ПОДСТАВИТЬ и ВЫБРАТЬ, как показано в разделе 4. Однако этот метод не обрабатывает числа больше 1 миллиона и может неправильно склонять некоторые числительные.
Почему функция возвращает "ноль рублей" для пустой ячейки?
Это стандартное поведение. Чтобы избежать этого, модифицируйте функцию VBA, добавив проверку:
If IsEmpty(MyNumber) Or MyNumber = 0 Then
SumProp = ""
Exit Function
End If
или используйте в формуле =ЕСЛИ(A1=""; ""; SumProp(A1)).
Как адаптировать функцию для долларов или евро?
В функции SumProp замените блоки Select Case для рублей и копеек на аналогичные для другой валюты. Например, для долларов:
Select Case Rub
Case "one dollar": Rub = "one dollar"
Case Else: Rub = Rub & " dollars"
End Select
и добавьте обработку центов (cents).
Можно ли использовать эту функцию в Google Таблицах?
В Google Sheets нет встроенной функции для суммы прописью, но вы можете:
- Использовать надстройки из маркетплейса (например, "Number to Words").
- Написать собственную функцию на Google Apps Script (аналог VBA).
- Экспортировать данные в Excel, обработать их и импортировать обратно.
Как сделать, чтобы сумма прописью обновлялась автоматически?
Все предложенные методы (кроме статичных формул) обновляются автоматически:
- Функция VBA пересчитывается при изменении исходных данных.
- Надстройка обновляется вместе с таблицей.
- В Power Query нажмите
Данные → Обновить все.
Если автоматическое обновление не работает, проверьте настройки вычислений: Формулы → Параметры вычислений → Автоматически.