Преобразование числовых значений в текстовый формат «сумма прописью» — стандартная задача для бухгалтеров, финансовых аналитиков и сотрудников, работающих с первичными документами. В 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 минуты:
- Скачайте файл с расширением
.xlamили.xla. - Откройте Excel и перейдите в
Файл → Параметры → Надстройки. - Нажмите «Перейти» внизу окна и выберите скачанный файл.
- Активируйте надстройку и используйте новую функцию (например,
=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)