Как сделать, чтобы Excel автоматически писал сумму прописью: пошаговое руководство

Вы устали вручную переписывать цифры в договорах, чеках или финансовых отчётах? 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. Она обработает любые числа, поддерживает несколько валют и корректно склоняет числительные. Ниже приведён код для рублей, долларов и евро с учётом копеек/центов.

Как установить:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. В меню выберите Insert → Module.
  3. Вставьте следующий код:
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 валют (рубли, доллары, евро, гривны и др.)
  • 📊 Округление до копеек/центов или отображение полной дробной части
  • 🔄 Автоматическое склонение числительных
  • 📑 Работа с диапазонами ячеек (массовое преобразование)

Установка:

  1. Перейдите в Вставка → Надстройки.
  2. В поисковой строке введите "ЧислоПрописью".
  3. Нажмите Добавить и следуйте инструкциям.

Пример использования:

=ЧИСЛОПРОПИСЬЮ(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;"";" " & [формула для десятков и единиц]);

"число слишком большое"

)

)

)

Для полноценной работы потребуется:

  1. Создать вспомогательную таблицу с названиями чисел (единицы, десятки, сотни).
  2. Написать цепочку вложенных ЕСЛИ для обработки каждого разряда.
  3. Добавить функции для склонения валют (ВЫБОР или ИНДЕКС).
Пример вспомогательной таблицы для чисел

| Ячейка | Значение |

|--------|----------------|

| 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. Массовое преобразование: как применить ко всему столбцу

Если нужно преобразовать сотни или тысячи ячеек, используйте один из этих методов:

  1. Копирование формулы:
    • 📋 Введите формулу в первую ячейку (например, =NumToText(A1)).
    • 📋 Дважды кликните по маркеру автозаполнения (маленький квадрат в правом нижнем углу ячейки).
  2. Специальная вставка:
    • 📋 Выделите ячейки с формулами, скопируйте (Ctrl+C).
    • 📋 Выберите Главная → Вставить → Значения (или Ctrl+Alt+V → З).
  • Power Query (Excel 2016+):
    • 📋 Выделите данные, нажмите Данные → Из таблицы/диапазона.
    • 📋 Добавьте пользовательский столбец с формулой преобразования.

    Важно: при массовой обработке отключите автоматический пересчёт формул (Формулы → Параметры вычислений → Вручную), чтобы ускорить процесс.

    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)