Как в Excel преобразовать число в текст сумма прописью с копейками: 5 проверенных способов

Преобразование числовых значений в текстовый формат «сумма прописью» — стандартная задача для бухгалтеров, финансовых аналитиков и сотрудников, работающих с первичными документами. В Microsoft Excel нет встроенной функции для автоматического перевода чисел в слова, но эту проблему легко решить с помощью формул, макросов или сторонних надстроек. Особенно актуально правильное оформление сумм с копейками — например, «1 254 рубля 30 копеек» вместо просто «1254.3».

В этой статье мы разберём 5 рабочих методов, включая:

  • 🔹 Готовые формулы без VBA (подходит для всех версий Excel)
  • 🔹 Пользовательские функции на языке VBA (для автоматизации)
  • 🔹 Надстройки от сторонних разработчиков (для удобства)
  • 🔹 Обработку копеек с учётом правил русского языка
  • 🔹 Распространённые ошибки и их исправление

Каждый способ проиллюстрирован примерами и скриншотами, а в конце статьи вы найдёте FAQ с ответами на частые вопросы. Если вы работаете с большими массивами данных, обратите внимание на раздел про оптимизацию производительности.

📊 Как часто вам нужно преобразовывать суммы в текст прописью?
Ежедневно
Несколько раз в неделю
Редко
Никогда

1. Преобразование числа в текст прописью без VBA: формула для рублей

Если вы не хотите использовать макросы, можно обойтись комбинацией функций ТЕКСТ, ПОИСКПОЗ и ВЫБОР. Этот метод требует предварительной настройки, но работает во всех версиях Excel, включая Excel Online.

Сначала создайте вспомогательную таблицу с числами от 0 до 999 и их текстовыми эквивалентами (например, «один», «два», «сто двадцать три» и т.д.). Затем используйте формулу для разбивки числа на разряды (единицы, тысячи, миллионы) и подстановки текста из таблицы.

=ЕСЛИ(A1=0;"ноль";

ТЕКСТ(ЦЕЛОЕ(A1/1000000);"[DBNUM1]0")&" "&ВЫБОР(ОСТАТ(ЦЕЛОЕ(A1/1000000);10);"миллион";"миллиона";"миллионов")&" "

&ТЕКСТ(ОСТАТ(ЦЕЛОЕ(A1/1000);1000);"[DBNUM1]0")&" "&ВЫБОР(ОСТАТ(ОСТАТ(ЦЕЛОЕ(A1/1000);1000);100);10;19;"тысяч";"тысяча";"тысячи";"тысяч")&" "

&ТЕКСТ(ОСТАТ(A1;1000);"[DBNUM1]0")&" "&ВЫБОР(ОСТАТ(A1;100);10;19;"рублей";"рубль";"рубля";"рублей"))

Эта формула работает для чисел до 999 999 999 рублей. Для обработки копеек добавьте отдельную ячейку с функцией =ОСТАТ(A1;1)*100 и аналогичную формулу для слова «копейка/копейки/копеек».

⚠️ Внимание: Формат [DBNUM1] преобразует числа в текст на русском языке, но требует русифицированной версии Excel. В англоязычных версиях используйте альтернативные методы.

2. Пользовательская функция на VBA для суммы прописью с копейками

Самый надёжный способ — создать собственную функцию на VBA. Она будет автоматически учитывать склонение рублей и копеек, а также обрабатывать дробные числа. Откройте редактор VBA (Alt + F11) и вставьте следующий код в модуль:

Function SumProp(ByVal MyNumber As Currency) As String

Dim Rub As String, Kop As String, Temp As String

Dim DecimalPlace As Integer, Cnt As Integer

' Округляем до 2 знаков после запятой

MyNumber = Round(MyNumber, 2)

' Разделяем рубли и копейки

Rub = Int(MyNumber)

Kop = Format((MyNumber - Rub) * 100, "00")

' Преобразуем рубли

If Rub = 0 Then

Temp = "ноль рублей"

Else

Temp = ConvertDigits(Rub)

Temp = ApplyCurrency(Rub, Temp, "рубль", "рубля", "рублей")

End If

' Добавляем копейки

If Kop <> "00" Then

Temp = Temp & " " & ConvertDigits(Kop)

Temp = Temp & " " & ApplyCurrency(Kop, "", "копейка", "копейки", "копеек")

End If

SumProp = Temp

End Function

' Вспомогательная функция для склонения валют

Private Function ApplyCurrency(Number As Long, _

ByVal Digits As String, _

ByVal One As String, _

ByVal TwoFour As String, _

ByVal FiveZero As String) As String

Dim Mod10 As Integer, Mod100 As Integer

If Number = 0 Then Exit Function

Mod10 = Number Mod 10

Mod100 = Number Mod 100

If Mod100 >= 11 And Mod100 <= 19 Then

ApplyCurrency = FiveZero

Else

Select Case Mod10

Case 1: ApplyCurrency = One

Case 2, 3, 4: ApplyCurrency = TwoFour

Case Else: ApplyCurrency = FiveZero

End Select

End If

End Function

' Вспомогательная функция для преобразования чисел в текст

Private Function ConvertDigits(ByVal MyNumber As Variant) As String

Dim Ones(1 To 9) As String, Teens(10 To 19) As String

Dim Tens(2 To 9) As String, Hundreds(1 To 9) As String

Dim Temp As String, Cnt As Integer, DigitGroup(1 To 3) As String

' Заполняем массивы слов

Ones(1) = "один": Ones(2) = "два": Ones(3) = "три": Ones(4) = "четыре"

Ones(5) = "пять": Ones(6) = "шесть": Ones(7) = "семь"

Ones(8) = "восемь": Ones(9) = "девять"

Teens(10) = "десять": Teens(11) = "одиннадцать": Teens(12) = "двенадцать"

Teens(13) = "тринадцать": Teens(14) = "четырнадцать": Teens(15) = "пятнадцать"

Teens(16) = "шестнадцать": Teens(17) = "семнадцать": Teens(18) = "восемнадцать"

Teens(19) = "девятнадцать"

Tens(2) = "двадцать": Tens(3) = "тридцать": Tens(4) = "сорок"

Tens(5) = "пятьдесят": Tens(6) = "шестьдесят": Tens(7) = "семьдесят"

Tens(8) = "восемьдесят": Tens(9) = "девяносто"

Hundreds(1) = "сто": Hundreds(2) = "двести": Hundreds(3) = "триста"

Hundreds(4) = "четыреста": Hundreds(5) = "пятьсот": Hundreds(6) = "шестьсот"

Hundreds(7) = "семьсот": Hundreds(8) = "восемьсот": Hundreds(9) = "девятьсот"

' Преобразуем число в текст

If MyNumber = 0 Then

ConvertDigits = "ноль"

Exit Function

End If

' Обрабатываем миллионы, тысячи, единицы

For Cnt = 1 To 3

Select Case Cnt

Case 1: DigitGroup(Cnt) = Int(MyNumber / 1000000) Mod 1000

Case 2: DigitGroup(Cnt) = Int(MyNumber / 1000) Mod 1000

Case 3: DigitGroup(Cnt) = MyNumber Mod 1000

End Select

If DigitGroup(Cnt) <> 0 Then

Temp = ConvertLessThanOneThousand(DigitGroup(Cnt), Ones, Teens, Tens, Hundreds)

Select Case Cnt

Case 1: Temp = Temp & " миллион" & Choose(DigitGroup(Cnt) Mod 100, "ов", "", "а")

Case 2: Temp = Temp & " тысяч" & Choose(DigitGroup(Cnt) Mod 10, "а", "", "и", "и", "и", " ", " ", " ", " ", " ")

Case 3: Temp = Temp

End Select

ConvertDigits = ConvertDigits & Temp

End If

Next Cnt

End Function

' Функция для чисел < 1000

Private Function ConvertLessThanOneThousand(ByVal MyNumber As Integer, _

Ones() As String, Teens() As String, Tens() As String, Hundreds() As String) As String

Dim Temp As String

If MyNumber = 0 Then Exit Function

If MyNumber >= 100 Then

Temp = Hundreds(MyNumber \ 100) & " "

MyNumber = MyNumber Mod 100

End If

If MyNumber >= 20 Then

Temp = Temp & Tens(MyNumber \ 10)

If (MyNumber Mod 10) <> 0 Then Temp = Temp & " " & Ones(MyNumber Mod 10)

ElseIf MyNumber >= 10 Then

Temp = Temp & Teens(MyNumber)

ElseIf MyNumber > 0 Then

Temp = Temp & Ones(MyNumber)

End If

ConvertLessThanOneThousand = Temp

End Function

После вставки кода закройте редактор и используйте функцию =SumProp(A1), где A1 — ячейка с числом. Например, для значения 1254.30 функция вернёт: «одна тысяча двести пятьдесят четыре рубля тридцать копеек».

1. Убедитесь, что макросы разрешены в Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов

2. Сохраните файл как .xlsm (с поддержкой макросов)

3. Проверьте работу на тестовых данных: 0, 1, 1001, 1254.30, 999999.99

4. Убедитесь, что склонение рублей и копеек корректно («1 рубль», «2 рубля», «5 рублей»)

-->

3. Готовые надстройки для Excel: быстрый способ

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

НадстройкаСсылкаОсобенностиПоддержка копеек
NumToTextСкачатьПростая установка, поддерживает несколько языковДа
Русский текст для чиселСкачатьАдаптирована для бухгалтерских документовДа
Excel Number to WordsСкачатьПлатная версия с расширенными настройкамиДа
Атлас-ПроСкачатьВключает шаблоны для первичных документовДа

Установка надстройки занимает 2-3 минуты:

  1. Скачайте файл с расширением .xlam или .xla.
  2. Откройте Excel и перейдите в Файл → Параметры → Надстройки.
  3. Нажмите «Перейти» внизу окна и выберите скачанный файл.
  4. Активируйте надстройку и используйте новую функцию (например, =RUB(A1)).

Преимущества надстроек:

  • 🔹 Не требуют знания VBA
  • 🔹 Автоматически обновляются
  • 🔹 Поддерживают плюрализацию («рубль/рубля/рублей»)
⚠️ Внимание: Перед установкой надстройки проверьте её на вирусы и совместимость с вашей версией Excel. Некоторые плагины могут конфликтовать с другими расширениями.

4. Обработка копеек: нюансы и ошибки

При преобразовании сумм с копейками часто возникают типичные ошибки:

  • 🔸 Неправильное округление: например, 1254.305 должно стать 1254.31, а не 1254.30.
  • 🔸 Отсутствие нулей: 1254.00 должно выводиться как «ноль копеек», а не пустая строка.
  • 🔸 Некорректное склонение: «1 копейка», но «2 копейки» и «5 копеек».

Чтобы избежать проблем, используйте функцию округления перед преобразованием:

=ОКРУГЛ(A1; 2)

И проверяйте логику склонения в VBA-коде (см. раздел 2). Для тестирования используйте крайние случаи:

  • 🔹 0.01 → «ноль рублей одна копейка»
  • 🔹 1.00 → «один рубль ноль копеек»
  • 🔹 100500.99 → «сто тысяч пятьсот рублей девяносто девять копеек»
Пример кода для проверки склонения копеек

Вставьте этот фрагмент в функцию SumProp для отладки:

Debug.Print "Тест копеек: " & Kop & " → " & ApplyCurrency(Kop, "", "копейка", "копейки", "копеек")

Это выведет в окно Immediate (Ctrl + G в редакторе VBA) результат склонения для каждой суммы.

5. Оптимизация производительности при работе с большими данными

Если вам нужно преобразовать тысячи строк, обычные формулы или VBA могут тормозить. Вот как ускорить процесс:

Для формул:

  • 🔹 Используйте массивные формулы вместо поэлементных вычислений.
  • 🔹 Отключите автоматический пересчёт (Формулы → Параметры вычислений → Вручную).
  • 🔹 Преобразуйте результаты в значения (Копировать → Специальная вставка → Значения).

Для VBA:

  • 🔹 Отключите обновление экрана (Application.ScreenUpdating = False).
  • 🔹 Используйте массивы вместо работы с ячейками по одной.
  • 🔹 Применяйте Calculate только к нужному диапазону.
Sub OptimizedSumProp()

Dim rng As Range, cell As Range

Dim result() As Variant

Dim i As Long, lastRow As Long

Application.ScreenUpdating = False

Application.Calculation = xlCalculationManual

Set rng = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)

ReDim result(1 To rng.Rows.Count, 1 To 1)

For i = 1 To rng.Rows.Count

result(i, 1) = SumProp(rng.Cells(i, 1).Value)

Next i

rng.Offset(0, 1).Resize(UBound(result, 1)).Value = result

Application.Calculation = xlCalculationAutomatic

Application.ScreenUpdating = True

End Sub

1. Загрузите данные в Power Query (Данные → Из таблицы/диапазона).

2. Добавьте пользовательский столбец с функцией преобразования.

3. Загрузите результат обратно в Excel.

Это снизит нагрузку на процессор и ускорит обработку в 5-10 раз.-->

6. Альтернативные решения: Google Sheets и онлайн-сервисы

Если Excel недоступен, воспользуйтесь альтернативными инструментами:

В Google Sheets:

  • 🔹 Установите надстройку Number to Words из Расширения → Надстройки.
  • 🔹 Используйте функцию =RUBLESPROPISY(A1) (требует ручной настройки скрипта).

Онлайн-сервисы:

  • 🔹 Calc.ru — поддерживает рубли и копейки.
  • 🔹 Num-Word.ru — генератор сумм прописью с API для автоматизации.

Преимущества онлайн-сервисов:

  • 🔹 Не требуют установки
  • 🔹 Поддерживают актуальные правила русского языка
  • 🔹 Можно интегрировать через API в корпоративные системы

Недостатки:

  • 🔸 Ограничения на объём данных (обычно до 1000 запросов в день)
  • 🔸 Риски конфиденциальности при работе с финансовыми данными

FAQ: Ответы на частые вопросы

Можно ли преобразовать сумму прописью без VBA?

Да, с помощью комбинации функций ТЕКСТ, ВЫБОР и ПОИСКПОЗ (см. раздел 1). Также подойдут надстройки или Power Query.

Почему функция возвращает ошибку #ИМЯ?

Это означает, что:

  • 🔹 Макросы отключены (разрешите их в Параметры → Центр управления безопасностью).
  • 🔹 Файл не сохранён как .xlsm (с поддержкой макросов).
  • 🔹 Опечатка в названии функции (проверьте регистр: SumProp, а не sumprop).
Как преобразовать сумму в долларах или евро?

Замените в коде VBA слова «рубль/рубля/рублей» на «доллар/доллара/долларов» или «евро» (склонение для евро не требуется). Также можно добавить параметр для выбора валюты:

Function SumProp(ByVal MyNumber As Currency, Optional Currency As String = "RUB") As String
Можно ли использовать эту функцию в Excel Online?

Нет, Excel Online не поддерживает VBA-макросы. Используйте:

  • 🔹 Формульный метод (раздел 1).
  • 🔹 Надстройки (если доступны в вашей версии).
  • 🔹 Power Automate для автоматизации через API.
Как добавить слово «всего» перед суммой?

Измените возвращаемое значение в функции SumProp:

SumProp = "Всего " & Temp

Или добавьте его прямо в ячейку:

= "Всего " & SumProp(A1)