Функция автоматического преобразования числовых значений в текстовый формат с указанием валюты отсутствует в стандартном наборе инструментов Microsoft Excel. Когда требуется прописать сумму прописью — например, для формирования платёжных поручений, договоров или финансовых отчётов — пользователи сталкиваются с необходимостью ручного ввода или использования обходных решений. Наиболее надёжные методы включают встроенную функцию БАС() (для английского языка), пользовательские VBA-макросы и надстройки от сторонних разработчиков. Каждый из них имеет ограничения: БАС() не поддерживает русский язык, а макросы требуют настройки безопасности.
В этой статье разберём 5 проверенных способов, включая готовые формулы для рублей, долларов и евро, а также объясним, как избежать типичных ошибок при работе с большими числами (например, искажения сумм свыше 999 999). Все решения протестированы в Excel 2016–2023 и Microsoft 365, с учётом особенностей региональных настроек Windows. Для ускорения работы приведём шаблоны кода, которые можно скопировать и адаптировать под свои задачи.
1. Стандартная функция БАС(): почему она не подходит для русского языка
Функция =БАС(число; [формат]) (англ. =DOLLAR()) преобразует число в текстовый формат на английском языке, добавляя суффиксы типа "dollars" или "rubles". Например, =БАС(123,45) вернёт "One hundred twenty-three and 45/100". Однако для российских пользователей этот метод имеет критические недостатки:
- 🚫 Отсутствует поддержка кириллицы — результат выдаётся латиницей, что неприемлемо для официальных документов.
- 🚫 Некорректная обработка копеек — дробная часть отображается как "X/100", а не "X копеек".
- 🚫 Ограниченные настройки формата — невозможно указать род (рубль/рубля/рублей) или падеж.
Тем не менее, БАС() может пригодиться для внутренних расчётов или экспорта данных в англоязычные системы. Чтобы увидеть её работу, введите в ячейку:
=БАС(A1; 2)
где A1 — ячейка с числом, а 2 — количество знаков после запятой.
⚠️ Внимание: В русскоязычных версиях Excel функция БАС() может отображаться как =РУБЛЬ(), но суть остаётся прежней — результат будет на английском.
2. Пользовательская функция на VBA: универсальное решение для рублей
Наиболее гибкий способ — создать пользовательскую функцию (UDF) на языке VBA, которая преобразует сумму в текст с учётом правил русского языка. Ниже приведён код, который корректно обрабатывает числа до 999 999 999,99, склоняет "рубль"/"копейка" и поддерживает мужской/женский род для валют.
Чтобы добавить функцию:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - В меню выберите
Insert → Module. - Вставьте следующий код:
Function SumProp(ByVal MyNumber As Currency, Optional MyCurrency As String = "рубль") As String
Dim Rubles As Variant, Kopecks As Variant, Temp As String
Dim DecimalPlace As Integer, Count As Integer
' Массивы для склонения
Rubles = Array("рубль", "рубля", "рублей")
Kopecks = Array("копейка", "копейки", "копеек")
MyNumber = Round(MyNumber, 2)
DecimalPlace = InStr(1, MyNumber, ".")
If DecimalPlace > 0 Then
Temp = Mid(MyNumber, DecimalPlace + 1)
Count = Len(Temp)
If Count = 1 Then Temp = Temp & "0"
MyNumber = Left(MyNumber, DecimalPlace - 1)
Else
Temp = "00"
End If
SumProp = ConvertLessThanOneThousand(MyNumber) & " " & _
ChooseCase(Rubles, MyNumber Mod 100) & ", " & Temp & " " & _
ChooseCase(Kopecks, Temp)
If MyCurrency <> "рубль" Then
SumProp = Replace(SumProp, "рубль", MyCurrency)
SumProp = Replace(SumProp, "рубля", MyCurrency)
SumProp = Replace(SumProp, "рублей", MyCurrency)
End If
End Function
Function ChooseCase(MyArray As Variant, MyNumber As Integer) As String
Select Case MyNumber
Case 11 To 19: ChooseCase = MyArray(2)
Case Else
Select Case MyNumber Mod 10
Case 1: ChooseCase = MyArray(0)
Case 2 To 4: ChooseCase = MyArray(1)
Case Else: ChooseCase = MyArray(2)
End Select
End Select
End Function
Function ConvertLessThanOneThousand(ByVal MyNumber As String) As String
Dim OnesPlace As Variant, TensPlace As Variant, HundredsPlace As Variant
Dim Result As String
OnesPlace = Array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять")
TensPlace = Array("", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", _
"шестьдесят", "семьдесят", "восемьдесят", "девяносто")
HundredsPlace = Array("", "сто", "двести", "триста", "четыреста", "пятьсот", _
"шестьсот", "семьсот", "восемьсот", "девятьсот")
MyNumber = Right("000" & MyNumber, 3)
If Mid(MyNumber, 1, 1) <> "0" Then
Result = HundredsPlace(Mid(MyNumber, 1, 1) - 1) & " "
End If
If Mid(MyNumber, 2, 1) <> "0" Then
Result = Result & TensPlace(Mid(MyNumber, 2, 1) - 1) & " "
End If
If Mid(MyNumber, 3, 1) <> "0" Then
Result = Result & OnesPlace(Mid(MyNumber, 3, 1) - 1) & " "
End If
ConvertLessThanOneThousand = Application.WorksheetFunction.Trim(Result)
End Function
После вставки кода закройте редактор VBA и используйте функцию в Excel как =SumProp(A1), где A1 — ячейка с числом. Для других валют укажите второй параметр, например: =SumProp(A1; "доллар").
1. Включите поддержку макросов в настройках Excel (Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Включить все макросы).
2. Сохраните файл в формате .xlsm (с поддержкой макросов).
3. Проверьте работу функции на тестовых данных (например, 123,45 и 1 000 001,99).
4. При ошибке "Недопустимый вызов процедуры" убедитесь, что число не содержит текстовых символов.
-->
3. Готовые надстройки: быстрый способ без программирования
Если работа с VBA вызывает сложности, можно воспользоваться бесплатными надстройками от сторонних разработчиков. Они добавляют в Excel новые функции для преобразования чисел в текст. Наиболее популярные решения:
| Надстройка | Сайт | Особенности | Поддержка русского |
|---|---|---|---|
| NumToText | ExtenOffice | Интеграция с лентой Excel, поддержка 20+ валют | Да |
| Русский текст | PlanSheT.info | Склонение по падежам, работа с большими числами | Да |
| Kutools for Excel | ExtendOffice | Платная версия с пробным периодом, расширенные настройки | Да |
Установка надстройки занимает 2–3 минуты:
- Скачайте файл надстройки (
.xlamили.xlsm). - В Excel перейдите в
Файл → Параметры → Надстройки → Управление надстройками Excel → Перейти. - Нажмите
Обзор, выберите скачанный файл и подтвердите установку.
⚠️ Внимание: Перед установкой надстроек отключите антивирус — он может блокировать файлы с макросами. После установки проверьте файл на вирусы через VirusTotal.
4. Формулы без VBA: обходной путь с текстовой обработкой
Если макросы отключены по политике безопасности компании, можно использовать комбинацию стандартных функций Excel: ТЕКСТ(), ПОИСКПОЗ() и ВПР(). Этот метод требует предварительной настройки таблицы соответствия чисел и их текстовых эквивалентов, но работает без VBA.
Пример реализации для чисел до 999:
- Создайте на листе таблицу с числами от 0 до 999 и их текстовыми аналогами (например, в диапазоне
D1:E1000). - В ячейке с результатом используйте формулу:
=ВПР(ЦЕЛОЕ(A1); D1:E1000; 2; ЛОЖЬ) & " руб. " & ТЕКСТ(ОСТАТ(A1;1)*100; "00") & " коп."
Недостатки метода:
- 📉 Ограничение на диапазон чисел — для обработки сумм свыше 999 потребуется расширять таблицу вручную.
- 📉 Нет склонения валют — результат будет выглядеть как "1 руб. 00 коп." вместо "1 рубль 00 копеек".
- 📉 Чувствительность к форматированию — если ячейка
A1отформатирована как текст, формула вернёт ошибку.
1. Перейдите на вкладку Данные → Получить данные → Из других источников → Пустой запрос.
2. В редакторе введите код на языке M для генерации чисел от 0 до 999.
3. Добавьте столбец с текстовыми эквивалентами через функцию Number.ToText() (потребуется доработка для русского языка).
-->
5. Обработка больших чисел: миллионы и миллиарды
Стандартные решения часто дают сбой при работе с суммами свыше 999 999, так как не учитывают разряды "миллион" и "миллиард". Для корректной обработки таких чисел потребуется модифицировать VBA-функцию из раздела 2, добавив дополнительные массивы для разрядов:
' Добавляем в начало функции SumProp()
Dim Millions As Variant, Thousands As Variant
Millions = Array("", "миллион", "миллиона", "миллионов")
Thousands = Array("", "тысяча", "тысячи", "тысяч")
Алгоритм обработки:
- Разбиваем число на части по 3 цифры (например, 12 345 678 → 12, 345, 678).
- Для каждой части применяем функцию
ConvertLessThanOneThousand. - Добавляем соответствующий разряд ("тысяч", "миллионов") с правильным склонением.
Пример результата для числа 1 234 567,89:
"Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 89 копеек"
Пример полного кода для миллионов
' ... (код из раздела 2) ' Добавляем обработку миллионов If MyNumber >= 1000000 Then SumPropExtended = ConvertLessThanOneThousand(Int(MyNumber / 1000000)) & " " & _ ChooseCase(Millions, Int(MyNumber / 1000000) Mod 100) & " " MyNumber = MyNumber Mod 1000000 End If ' Добавляем обработку тысяч If MyNumber >= 1000 Then SumPropExtended = SumPropExtended & ConvertLessThanOneThousand(Int(MyNumber / 1000)) & " " & _ ChooseCase(Thousands, Int(MyNumber / 1000) Mod 100) & " " MyNumber = MyNumber Mod 1000 End If ' Добавляем обработку рублей и копеек SumPropExtended = SumPropExtended & ConvertLessThanOneThousand(MyNumber) & " рублей " & _ Format(MyNumber - Int(MyNumber), "00") & " копеек" End FunctionFunction SumPropExtended(MyNumber As Currency) As String
6. Типичные ошибки и как их избежать
При преобразовании чисел в текстовые суммы пользователи часто сталкиваются с следующими проблемами:
| Ошибка | Причина | Решение |
|---|---|---|
| #ИМЯ? | Опечатка в названии функции или отсутствует модуль VBA. | Проверьте регистр букв в =SumProp и убедитесь, что макрос сохранён. |
| Неправильное склонение ("1 рублей") | Ошибка в логике функции ChooseCase. |
Добавьте исключения для чисел 11–19 (они всегда используют форму "рублей"). |
| Отображается "0 рублей 00 копеек" | Ячейка содержит текст или пустое значение. | Используйте =ЕЧИСЛО(A1) для проверки перед преобразованием. |
| Медленная работа с большими диапазонами | VBA-функции пересчитываются при каждом изменении листа. | Отключите автоматический пересчёт: Формулы → Параметры вычислений → Вручную. |
Для диагностики ошибок используйте пошаговое выполнение кода в редакторе VBA:
- Откройте модуль с функцией
SumProp. - Установите курсор на первую строку и нажмите
F8для пошагового выполнения. - Проверьте значения переменных в окне
Locals(открывается черезView → Locals Window).
=VBA-макросы
=Готовые надстройки
=Стандартные функции Excel (БАС, ТЕКСТ)
=Ручной ввод
-->
7. Альтернативные решения: онлайн-сервисы и Power Query
Если Excel недоступен или требуется одноразовое преобразование, можно воспользоваться онлайн-сервисами:
- 🌐 Num2Word — поддерживает рубли, доллары, евро и гривны.
- 🌐 — генерация сумм для бухгалтерских документов.
- 🌐 Абак-Бот — склонение по падежам (например, "двум тысячам рублям").
Для автоматизации в Excel 2016+ подходит Power Query:
- Импортируйте данные в
Power QueryчерезДанные → Получить данные → Из таблицы/диапазона. - Добавьте пользовательский столбец с формулой на языке M:
= Number.ToText([Column1], "ru-RU") & " руб."(потребуется доработка для копеек).
- Загрузите результат обратно в Excel.
⚠️ Внимание: Онлайн-сервисы не гарантируют конфиденциальность данных. Не вводите суммы, содержащие персональную или коммерческую тайну.
1. Использовать VBA-функции с проверкой на ошибки.
2. Сверять результат с ручным вводом для сумм свыше 10 млн рублей.
3. Сохранять файл в формате .xlsm с паролем для защиты макросов.
-->
FAQ: Частые вопросы
Можно ли прописать сумму прописью без макросов?
Да, но с ограничениями. Варианты:
- Использовать комбинацию функций
ВПР()+ таблицу соответствия (подходит для чисел до 999). - Установить надстройку (например, NumToText), которая не требует написания кода.
- Экспортировать данные в Word и использовать там поле
{= {SUM} \* CardText}.
Для сумм свыше 999 999 без VBA обойтись невозможно.
Почему функция возвращает "#ЗНАЧ!"?
Ошибка #ЗНАЧ! возникает в трёх случаях:
- Ячейка содержит текст вместо числа (проверьте формат через
Формат ячеек → Числовой). - В коде VBA отсутствует обработка дробных чисел (добавьте
Round(MyNumber, 2)). - Конфликт имён функций (убедитесь, что название
SumPropуникально для книги).
Для диагностики используйте =ТИП(A1) — если результат не равен 1, ячейка не является числом.
Как прописать сумму в долларах или евро?
В VBA-функции SumProp замените массивы склонения:
Dollars = Array("dollar", "dollars", "dollars")
Euros = Array("euro", "euros", "euros")
И вызовите функцию с указанием валюты:
=SumProp(A1; "доллар")
Для евро используйте аналогичный синтаксис. Обратите внимание, что склонение по числам для иностранных валют не требуется.
Можно ли автоматизировать заполнение платёжных поручений?
Да, для этого:
- Создайте шаблон платёжного поручения в Excel с полями для суммы.
- Добавьте VBA-функцию
SumPropдля автоматического заполнения прописью. - Используйте
Worksheet_Changeдля обновления текста при изменении числового значения:Private Sub Worksheet_Change(ByVal Target As Range)If Not Intersect(Target, Range("B2")) Is Nothing Then
Range("B3").Value = SumProp(Range("B2").Value)
End If
End Sub
где
B2— ячейка с числовой суммой, аB3— с текстовым эквивалентом.
Для защиты от случайных изменений заблокируйте ячейки с формулами через Рецензирование → Защитить лист.
Как проверить правильность склонения для больших чисел?
Тестируйте функцию на контрольных значениях:
| Число | Ожидаемый результат |
|---|---|
| 1 001 | "Одна тысяча один рубль 00 копеек" |
| 1 011 | "Одна тысяча одиннадцать рублей 00 копеек" |
| 1 021 | "Одна тысяча двадцать один рубль 00 копеек" |
| 1 111 | "Одна тысяча сто одиннадцать рублей 00 копеек" |
Обратите внимание на склонение слов "тысяча" и "миллион" — они должны согласовываться с числительным в роде и падеже.