Вы устали вручную переписывать цифры в договорах, чеках или финансовых отчётах? Excel может автоматически преобразовывать числовые значения в текст прописью — например, превращать 1 256,78 в "Одна тысяча двести пятьдесят шесть рублей 78 копеек". Эта функция экономит часы рабочего времени и исключает ошибки при оформлении документов.
В этой статье вы найдёте 5 проверенных способов реализации такой задачи — от простых формул для начинающих до продвинутых VBA-скриптов для автоматизации массовых операций. Мы разберём нюансы работы с разными валютами, рассмотрим ограничения стандартных инструментов Excel и покажем, как обойти их с помощью пользовательских функций. Особое внимание уделим корректному склонению числительных (например, "1 рубль" vs "2 рубля") и обработке дробных частей.
1. Стандартные функции Excel: ограниченные возможности
Базовый Excel не содержит встроенной функции для преобразования чисел в текст прописью. Однако в некоторых локализованных версиях (например, русскоязычной) доступна функция РУБЛЬ.ДЕНЬГИ() — но она работает только с рублями и имеет жёсткие ограничения:
- 📌 Преобразует числа до 999 999 999,99 (миллиард без одной копейки)
- 📌 Поддерживает только рубли/копейки (доллары или евро не обработает)
- 📌 Не склоняет слова "рубль/рубля/рублей" автоматически
- 📌 В английской версии Excel отсутствует полностью
Пример использования:
=РУБЛЬ.ДЕНЬГИ(A1;2)
Где A1 — ячейка с числом, а 2 — количество знаков после запятой. Результат для 1234,56 будет: "1234,56 р. (Одна тысяча двести тридцать четыре рубля пятьдесят шесть копеек)".
2. Пользовательская функция на VBA: универсальное решение
Для полной автоматизации рекомендуем создать пользовательскую функцию VBA. Она обработает любые числа, поддерживает несколько валют и корректно склоняет числительные. Ниже приведён код для рублей, долларов и евро с учётом копеек/центов.
Как установить:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - В меню выберите
Insert → Module. - Вставьте следующий код:
Function NumToText(ByVal n As Double, Optional currency As String = "RUB") As String
Dim rubles(3) As String, pennies(3) As String, result As String
Dim intPart As Long, fracPart As Long, temp As String
' Массивы для склонения валют
If currency = "RUB" Then
rubles = Array("рубль", "рубля", "рублей")
pennies = Array("копейка", "копейки", "копеек")
ElseIf currency = "USD" Then
rubles = Array("доллар", "доллара", "долларов")
pennies = Array("цент", "цента", "центов")
ElseIf currency = "EUR" Then
rubles = Array("евро", "евро", "евро")
pennies = Array("цент", "цента", "центов")
End If
' Разделение на целую и дробную части
intPart = Fix(n)
fracPart = Round((n - intPart) * 100)
' Преобразование целой части
If intPart > 0 Then
result = ConvertLessThanThousand(intPart, rubles) & " "
End If
' Преобразование дробной части
If fracPart > 0 Then
result = result & fracPart & " " & Choose(fracPart Mod 100 + 1, pennies(2), pennies(0), pennies(1), pennies(1), pennies(1), pennies(2), pennies(2), pennies(2), pennies(2), pennies(2))
Else
result = Trim(result) & " " & Choose(intPart Mod 100 + 1, rubles(2), rubles(0), rubles(1), rubles(1), rubles(1), rubles(2), rubles(2), rubles(2), rubles(2), rubles(2))
End If
NumToText = Application.WorksheetFunction.Proper(result)
End Function
Function ConvertLessThanThousand(ByVal n As Long, currency() As String) As String
Dim units As Variant, tens As Variant, hundreds As Variant
Dim result As String, temp As String
units = Array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", _
"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", _
"шестнадцать", "семнадцать", "восемнадцать", "девятнадцать")
tens = Array("", "", "двадцать", "тридцать", "сорок", "пятьдесят", _
"шестьдесят", "семьдесят", "восемьдесят", "девяносто")
hundreds = Array("", "сто", "двести", "триста", "четыреста", "пятьсот", _
"шестьсот", "семьсот", "восемьсот", "девятьсот")
If n = 0 Then Exit Function
' Сотни
If n >= 100 Then
result = hundreds(Int(n / 100)) & " "
n = n Mod 100
End If
' Десятки и единицы
If n >= 20 Then
result = result & tens(Int(n / 10)) & " "
n = n Mod 10
End If
If n > 0 Then
result = result & units(n) & " "
End If
ConvertLessThanThousand = Trim(result) & " " & Choose(n Mod 100 + 1, currency(2), currency(0), currency(1), currency(1), currency(1), currency(2), currency(2), currency(2), currency(2), currency(2))
End Function
Теперь в любой ячейке можно использовать функцию:
=NumToText(A1; "RUB") ' Для рублей
=NumToText(A1; "USD") ' Для долларов
=NumToText(A1; "EUR") ' Для евро
Сохраните файл как .xlsm (с поддержкой макросов)|Разрешите выполнение макросов в Файл → Параметры → Центр управления безопасностью → Параметры центра → Включить все макросы|Проверьте регистр валютных кодов (только заглавные буквы)|Тестируйте функцию на небольших числах (например, 1.01, 2.02, 5.55)-->
3. Надстройка "ЧислоПрописью": готовое решение без программирования
Если VBA кажется сложным, воспользуйтесь бесплатной надстройкой "ЧислоПрописью" от Microsoft AppSource. Она добавляет в Excel специальную функцию =ЧИСЛОПРОПИСЬЮ() с гибкими настройками:
- 🌍 Поддержка 12 валют (рубли, доллары, евро, гривны и др.)
- 📊 Округление до копеек/центов или отображение полной дробной части
- 🔄 Автоматическое склонение числительных
- 📑 Работа с диапазонами ячеек (массовое преобразование)
Установка:
- Перейдите в
Вставка → Надстройки. - В поисковой строке введите "ЧислоПрописью".
- Нажмите
Добавитьи следуйте инструкциям.
Пример использования:
=ЧИСЛОПРОПИСЬЮ(A1; "RUB"; 2; ИСТИНА)
Где:
A1— ячейка с числом"RUB"— код валюты2— количество знаков после запятойИСТИНА— включить склонение
Вручную переписываю|Использую VBA|Пользуюсь надстройками|Другие формулы Excel|Не знаю, как это делать-->
4. Формулы без VBA: сложный, но рабочий обходной путь
Если макросы отключены или запрещены политикой безопасности, можно обойтись комбинацией стандартных функций. Этот метод громоздкий, но работает в любых версиях Excel. Пример для чисел до 999 999:
=ЕСЛИ(A1=0;"ноль";
ЕСЛИ(A1<20;ВЫБОР(A1;"один";"два";"три";"четыре";"пять";"шесть";"семь";"восемь";"девять";"десять";"одиннадцать";"двенадцать";"тринадцать";"четырнадцать";"пятнадцать";"шестнадцать";"семнадцать";"восемнадцать";"девятнадцать");
ЕСЛИ(A1<100;
ВЫБОР(ЦЕЛОЕ(A1/10)-1;"";"десять";"двадцать";"тридцать";"сорок";"пятьдесят";"шестьдесят";"семьдесят";"восемьдесят";"девяносто") &
ЕСЛИ(ОСТАТ(A1;10)=0;"";" " & ВЫБОР(ОСТАТ(A1;10);"один";"два";"три";"четыре";"пять";"шесть";"семь";"восемь";"девять"));
ЕСЛИ(A1<1000;
ВЫБОР(ЦЕЛОЕ(A1/100)-1;"";"сто";"двести";"триста";"четыреста";"пятьсот";"шестьсот";"семьсот";"восемьсот";"девятьсот") &
ЕСЛИ(ОСТАТ(A1;100)=0;"";" " & [формула для десятков и единиц]);
"число слишком большое"
)
)
)
Для полноценной работы потребуется:
- Создать вспомогательную таблицу с названиями чисел (единицы, десятки, сотни).
- Написать цепочку вложенных ЕСЛИ для обработки каждого разряда.
- Добавить функции для склонения валют (
ВЫБОРилиИНДЕКС).
Пример вспомогательной таблицы для чисел
| Ячейка | Значение |
|--------|----------------|
| B2:B19 | один, два,... |
| C2:C9 | десять, двадцать,... |
| D2:D9 | сто, двести,... |
Минусы метода:
- ⚠️ Формула становится крайне длинной (до 8 000 символов).
- ⚠️ Медленная пересчёт при изменении данных.
- ⚠️ Ошибки при копировании формулы (нужно фиксировать ссылки
$A$1).
5. Обработка дробных частей и склонение валют
Самая сложная часть — корректное отображение копеек/центов и склонение слов. Например:
- 1 рубль 00 копеек (не "1 рубль 0 копеек")
- 2 доллара 01 цент (не "2 доллара 1 цент")
- 5 евро 11 центов (не "5 евро 11 цент")
Для этого используйте вспомогательные функции склонения:
Function Sklonenie(ByVal number As Long, ByVal word1 As String, ByVal word2 As String, ByVal word5 As String) As String
Dim mod100 As Long
mod100 = number Mod 100
If mod100 >= 11 And mod100 <= 19 Then
Sklonenie = word5
Else
Select Case number Mod 10
Case 1: Sklonenie = word1
Case 2, 3, 4: Sklonenie = word2
Case Else: Sklonenie = word5
End Select
End If
End Function
Пример использования в основной функции:
result = result & " " & Sklonenie(intPart, "рубль", "рубля", "рублей")
| Число | Некорректный вариант | Корректный вариант |
|---|---|---|
| 1.00 | 1 рубль 0 копеек | 1 рубль 00 копеек |
| 2.01 | 2 рубля 1 копейка | 2 рубля 01 копейка |
| 5.11 | 5 рублей 11 копейки | 5 рублей 11 копеек |
| 10.05 | 10 рублей 5 копеек | 10 рублей 05 копеек |
6. Массовое преобразование: как применить ко всему столбцу
Если нужно преобразовать сотни или тысячи ячеек, используйте один из этих методов:
- Копирование формулы:
- 📋 Введите формулу в первую ячейку (например,
=NumToText(A1)). - 📋 Дважды кликните по маркеру автозаполнения (маленький квадрат в правом нижнем углу ячейки).
- 📋 Введите формулу в первую ячейку (например,
- Специальная вставка:
- 📋 Выделите ячейки с формулами, скопируйте (
Ctrl+C). - 📋 Выберите
Главная → Вставить → Значения(илиCtrl+Alt+V → З).
- 📋 Выделите ячейки с формулами, скопируйте (
- 📋 Выделите данные, нажмите
Данные → Из таблицы/диапазона. - 📋 Добавьте пользовательский столбец с формулой преобразования.
Важно: при массовой обработке отключите автоматический пересчёт формул (Формулы → Параметры вычислений → Вручную), чтобы ускорить процесс.
7. Частые ошибки и как их избежать
Даже опытные пользователи сталкиваются с проблемами при преобразовании чисел в текст. Вот TOP-5 ошибок и их решения:
⚠️ Внимание: Если после вставки VBA-кода Excel выдаёт ошибку"Компиляция: Пользовательский тип не определён", проверьте, не конфликтует ли ваш код с другими макросами. Переименуйте функцию (например, сNumToTextнаMyNumToText).
| Ошибка | Причина | Решение |
|---|---|---|
Функция возвращает #ИМЯ? |
Не сохранён файл как .xlsm или отключены макросы |
Сохраните файл с поддержкой макросов и разрешите их выполнение |
| Неправильное склонение ("2 рубля 1 копейка") | Ошибка в логике функции Sklonenie |
Проверьте условия для чисел 11-19 (они всегда используют форму "копеек") |
| Медленный пересчёт | Слишком много вложенных ЕСЛИ в формулах |
Замените на VBA или разбейте на вспомогательные столбцы |
| Округление дробной части | Функция Round используется вместо Fix |
Для финансовых документов используйте Fix(n * 100) / 100 |
| Не работает с отрицательными числами | Функция не обрабатывает знак "-" | Добавьте проверку: If n < 0 Then result = "минус " & NumToText(Abs(n)) |
⚠️ Внимание: При работе с бухгалтерскими документами избегайте функций округления (ОКРУГЛ,Round), так как они могут искажать дробную часть. ИспользуйтеЦЕЛОЕилиFixдля точного разделения числа.
FAQ: Ответы на частые вопросы
Можно ли преобразовать сумму прописью в Excel Online?
Нет, Excel Online не поддерживает VBA и надстройки. В этом случае используйте:
- 📌 Power Automate (Microsoft Flow) для создания облачного потока.
- 📌 Google Таблицы с функцией
=СУММПРОПИСЬЮ()(требует русифицированной версии). - 📌 Оффлайн-обработку: скачайте файл, выполните преобразование в десктопной версии Excel, затем загрузите обратно.
Как сделать, чтобы сумма прописью отображалась в верхнем регистре?
Используйте функцию ПРОПИСН():
=ПРОПИСН(NumToText(A1))
Или модифицируйте VBA-функцию, добавив строку:
NumToText = UCase(NumToText)
Поддерживаются ли другие валюты, кроме рублей/долларов/евро?
Да, в пользовательскую функцию NumToText можно добавить любую валюту. Пример для тенге:
ElseIf currency = "KZT" Then
rubles = Array("тенге", "тенге", "тенге")
pennies = Array("тиын", "тиына", "тиын")
Для гривен:
ElseIf currency = "UAH" Then
rubles = Array("гривна", "гривны", "гривен")
pennies = Array("копейка", "копейки", "копеек")
Как преобразовать дату в текст прописью (например, "первое января")?
Для дат используйте отдельную функцию:
Function DateToText(ByVal d As Date) As String
Dim days() As String, months() As String
days = Array("первое", "второе", "третье", "четвёртое", "пятое", "шестое", "седьмое", "восьмое", "девятое", "десятое", _
"одиннадцатое", "двенадцатое", "тринадцатое", "четырнадцатое", "пятнадцатое", "шестнадцатое", _
"семнадцатое", "восемнадцатое", "девятнадцатое", "двадцатое", "двадцать первое", "двадцать второе", _
"двадцать третье", "двадцать четвёртое", "двадцать пятое", "двадцать шестое", "двадцать седьмое", _
"двадцать восьмое", "двадцать девятое", "тридцатое", "тридцать первое")
months = Array("января", "февраля", "марта", "апреля", "мая", "июня", _
"июля", "августа", "сентября", "октября", "ноября", "декабря")
DateToText = days(Day(d) - 1) & " " & months(Month(d) - 1) & " " & Year(d) & " года"
End Function
Пример использования: =DateToText(A1), где A1 содержит дату.
Почему в некоторых случаях появляются лишние пробелы в результате?
Это происходит из-за:
- 📌 Конкатенации строк без обрезки пробелов (используйте
Trim). - 📌 Ошибок в массивах (например, лишние элементы в
unitsилиtens). - 📌 Неправильной обработки нулей (добавьте проверку
If n = 0 Then Exit Function).
Исправление: добавьте Trim ко всем результатам:
result = Trim(result)