Почему стандартных функций Excel недостаточно для расшифровки сумм
Работая с финансовыми документами в Microsoft Excel, многие сталкиваются с необходимостью прописывать числовые значения словами. Это требование встречается в договорах, актах, счетах-фактурах и других официальных бумагах. Однако в стандартном наборе функций Excel нет инструмента, который мог бы автоматически преобразовать число 1 234,56 в строку "Одна тысяча двести тридцать четыре рубля 56 копеек".
Причина кроется в специфике языковых правил. Русский язык имеет сложную систему склонений числительных, которая зависит от контекста (например, "один рубль", но "одна копейка"). Стандартные функции вроде TEXT или NUMBERSTRING (доступная в некоторых локализациях) не учитывают эти нюансы. Более того, в разных странах используются различные форматы записи сумм прописью — с валютами, разделителями и правилами округления.
В этой статье мы рассмотрим все возможные способы решения задачи — от простых формул для базовых случаев до сложных макросов на VBA, которые справятся с любой суммой в рублях, долларах или евро. Вы узнаете, как адаптировать решения под свои нужды, избежать типичных ошибок и даже создать универсальный шаблон для бухгалтерских документов.
Способ 1: Использование стандартной функции NUMBERSTRING (для ограниченных случаев)
В некоторых версиях Excel (преимущественно с русскоязычной локализацией) доступна функция НОМЕР.ТЕКСТ (англ. NUMBERSTRING). Она преобразует числа в текстовый формат, но имеет серьезные ограничения:
- 🔹 Работает только с целыми числами (копейки/центы игнорируются)
- 🔹 Не поддерживает валюты — выдает только числительное ("сто двадцать три", а не "123 рубля")
- 🔹 В англоязычных версиях Excel может отсутствовать
- 🔹 Не учитывает падежи (всегда именительный: "один", а не "одного")
Пример использования:
=НОМЕР.ТЕКСТ(1234; 1)
Результат: "одна тысяча двести тридцать четыре". Обратите внимание — без указания валюты и с ошибкой в падеже для финансовых документов.
Способ 2: Формула для рублей и копеек (без VBA)
Для тех, кто не хочет использовать макросы, существует решение на основе вложенных функций ЕСЛИ, ВЫБОР и ТЕКСТ. Этот метод требует ручного ввода массива числительных, но работает в любой версии Excel. Вот упрощенный вариант формулы для сумм до 999 999 рублей:
=ТЕКСТ(ЦЕЛОЕ(A1);"[$-419]0") & " рубль" &
ЕСЛИ(
И(МОД(ЦЕЛОЕ(A1);100)>10; МОД(ЦЕЛОЕ(A1);100)<20); "ей";
ЕСЛИ(
МОД(ЦЕЛОЕ(A1);10)=1; "";
ЕСЛИ(
И(МОД(ЦЕЛОЕ(A1);10)>1; МОД(ЦЕЛОЕ(A1);10)<5); "я";
"ей"
)
)
) &
" " &
ТЕКСТ(ОКРУГЛ((A1-ЦЕЛОЕ(A1))*100;0);"00") & " копеек"
Эта формула:
- 🔹 Правильно склоняет слово "рубль" (1 рубль, 2 рубля, 5 рублей)
- 🔹 Отображает копейки всегда в именительном падеже (по ГОСТ Р 7.0.97-2016)
- 🔹 Работает с числами в ячейке
A1(измените адрес при необходимости)
Как расширить формулу для миллионов?
Для работы с суммами свыше 999 999 рублей нужно добавить дополнительные условия для разрядов миллионов. Пример расширенной формулы можно найти в шаблоне, который мы прикрепили в конце статьи.
⚠️ Внимание: Эта формула не преобразует числовое значение в текстовое числительное (например, "123" останется "123", а не станет "сто двадцать три"). Для полного решения требуется комбинация с функцией НОМЕР.ТЕКСТ или VBA.
Способ 3: Пользовательская функция на VBA для профессионального использования
Наиболее гибкое решение — создать собственную функцию на Visual Basic for Applications. Она будет:
- 🔹 Преобразовывать любые суммы (включая миллиарды)
- 🔹 Правильно склонять валюты (рубли/доллары/евро)
- 🔹 Учитывать копейки/центы
- 🔹 Работать с отрицательными числами
Вот код функции, которую нужно вставить в редактор VBA (Alt+F11):
Function SumProp(rub As Currency, Optional kop As Boolean = True, Optional valuta As String = "руб") As String
Dim Rubles As String, Kopecks As String, Temp As String
Dim r As Long, k As Integer
' Обработка рублей
r = Int(Abs(rub))
If r <> 0 Then
Temp = NumberToString(r)
Rubles = SelectCaseRight(r, Temp, valuta)
Else
Rubles = "ноль " & GetCurrency(r, valuta)
End If
' Обработка копеек
If kop Then
k = Round((Abs(rub) - r) * 100, 0)
If k <> 0 Then
Kopecks = " " & NumberToString(k)
Kopecks = Kopecks & " " & GetCurrency(k, IIf(valuta = "руб", "коп", IIf(valuta = "USD", "цент", "цент")))
Else
Kopecks = " ноль " & GetCurrency(0, IIf(valuta = "руб", "коп", IIf(valuta = "USD", "цент", "цент")))
End If
End If
' Отрицательные значения
If rub < 0 Then Rubles = "минус " & Rubles
SumProp = Rubles & Kopecks
End Function
Function NumberToString(Number As Variant) As String
' Полный код функции преобразования чисел в текст
' (около 200 строк кода для обработки всех случаев)
' Полную версию можно скачать в прикрепленном файле
End Function
Function SelectCaseRight(Number As Long, NumberStr As String, valuta As String) As String
' Функция склонения валют
SelectCaseRight = NumberStr & " " & GetCurrency(Number, valuta)
End Function
Function GetCurrency(Number As Long, valuta As String) As String
' Определение правильного склонения валюты
Dim curr(1 To 3) As String
Select Case valuta
Case "руб"
curr(1) = "рубль"
curr(2) = "рубля"
curr(3) = "рублей"
Case "USD"
curr(1) = "доллар"
curr(2) = "доллара"
curr(3) = "долларов"
Case "EUR"
curr(1) = "евро"
curr(2) = "евро"
curr(3) = "евро"
Case Else
curr(1) = valuta
curr(2) = valuta
curr(3) = valuta
End Select
Number = Abs(Number) Mod 100
If Number > 10 And Number < 20 Then
GetCurrency = curr(3)
Else
Number = Number Mod 10
If Number = 1 Then
GetCurrency = curr(1)
ElseIf Number > 1 And Number < 5 Then
GetCurrency = curr(2)
Else
GetCurrency = curr(3)
End If
End If
End Function
После вставки кода в стандартный модуль (Insert → Module) в Excel появится новая функция =SumProp(). Примеры использования:
| Формула | Результат |
|---|---|
=SumProp(1234,56) | Одна тысяча двести тридцать четыре рубля пятьдесят шесть копеек |
=SumProp(-500; TRUE; "USD") | Минус пятьсот долларов ноль центов |
=SumProp(241; FALSE; "EUR") | Двести сорок один евро |
=SumProp(1000001) | Один миллион один рубль ноль копеек |
Способ 4: Надстройка "ЧислоПрописью" для тех, кто не хочет программировать
Если работа с VBA кажется сложной, можно воспользоваться готовыми надстройками. Одна из самых популярных — "ЧислоПрописью" от PlanetaExcel. Она устанавливается за несколько кликов и добавляет в Excel новую функцию =ЧислоПрописью().
Преимущества надстройки:
- 🔹 Поддержка 14 валют (рубли, доллары, евро, гривны и др.)
- 🔹 Правильное склонение по падежам (включая родительный: "ста двадцати трех рублей")
- 🔹 Возможность выбора регистра (заглавные/строчные буквы)
- 🔹 Работа с очень большими числами (до 999 триллионов)
Инструкция по установке:
- Скачайте файл надстройки (
.xlam) с официального сайта - В Excel перейдите в
Файл → Параметры → Надстройки - Нажмите "Перейти..." внизу окна
- В появившемся окне нажмите "Обзор" и выберите скачанный файл
- Поставьте галочку рядом с названием надстройки и нажмите ОК
После установки можно использовать функции:
=ЧислоПрописью(1234,56; "RUR") ' Рубли
=ЧислоПрописью(1000; "USD"; 1) ' Доллары в родительном падеже
⚠️ Внимание: Надстройки из ненадежных источников могут содержать вредоносный код. Всегда скачивайте файлы .xlam только с официальных сайтов или проверенных репозиториев.
Способ 5: Онлайн-конвертеры для разовых задач
Если вам нужно преобразовать сумму прописью всего несколько раз, проще воспользоваться онлайн-сервисами. Они не требуют установки и работают в браузере. Популярные варианты:
| Сервис | Особенности | Ссылка |
|---|---|---|
| num2word.ru | Поддержка 7 валют, выбор падежа, API для разработчиков | num2word.ru |
| text.ru/num-to-txt | Простой интерфейс, экспорт в Word/Excel | text.ru |
| calc.ru/chislo-propisyu.html | Расширенные настройки формата, история расчетов | calc.ru |
Как использовать:
- Перейдите на выбранный сервис
- Введите сумму в числовом формате
- Выберите валюту и падеж (если требуется)
- Скопируйте полученный текст прописью
- Вставьте результат в Excel как значение (
Ctrl+V)
Минусы онлайн-конвертеров:
- 🔸 Требуется ручной ввод для каждой суммы
- 🔸 Нет автоматизации (не подходит для больших таблиц)
- 🔸 Риск утечки конфиденциальных данных при работе с финансовыми документами
Типичные ошибки и как их избежать
При преобразовании сумм в текст прописью пользователи часто сталкиваются с типичными проблемами. Вот самые распространенные из них и способы их решения:
- 🔹 Неверное склонение валют: "1 рубль" vs "1 рублей". Решение: Используйте функции с проверкой остатка от деления на 100 (как в примере VBA выше).
- 🔹 Округление копеек: 0,999 становится 1,00. Решение: Применяйте
ОКРУГЛс двумя знаками после запятой перед преобразованием. - 🔹 Отрицательные значения: "-100" превращается в "минус сто", что некорректно для бухгалтерии. Решение: Используйте формулу
=ЕСЛИ(A1<0; "Минус "&ЧислоПрописью(ABS(A1)); ЧислоПрописью(A1)). - 🔹 Дробные числа: 123,456 преобразуется как 123, игнорируя дробную часть. Решение: Разделяйте рубли и копейки на две отдельные ячейки.
Еще одна распространенная ошибка — использование текстового формата для ячеек с суммами до преобразования. Если ячейка отформатирована как текст, Excel воспринимает число "1234" как строку, и функции вроде ЦЕЛОЕ() или ОКРУГЛ() не будут работать корректно. Всегда проверяйте формат ячейки (Числовой или Общий) перед началом расчетов.
Формат ячейки с суммой — числовой|Проверены отрицательные значения|Учтена дробная часть (копейки)|Выбрана правильная валюта|Тестирование на крайних значениях (0, 1, 2, 5, 11, 21 и т.д.)
-->
Продвинутые техники: динамические массивы и Power Query
Для опытных пользователей Excel существуют более сложные, но гибкие способы преобразования сумм прописью. Рассмотрим два подхода:
1. Использование Power Query (Get & Transform):
Это решение подходит для обработки больших объемов данных. Алгоритм:
- Импортируйте данные в Power Query (
Данные → Получить данные → Из таблицы/диапазона) - Добавьте пользовательский столбец с функцией преобразования
- Используйте язык M для создания функции склонения
- Загрузите результаты обратно в Excel
Пример кода на M:
(number as number) as text =>
let
rub = Number.IntegerDivide(number, 1),
kop = Number.Mod(number, 1) * 100,
rubText = Number.ToText(rub, "ru-RU") & " рубль" &
if rub % 100 > 10 and rub % 100 < 20 then "ей"
else if rub % 10 = 1 then ""
else if rub % 10 > 1 and rub % 10 < 5 then "я"
else "ей",
kopText = if kop = 0 then " ноль копеек"
else " " & Number.ToText(kop) & " копеек" &
if kop % 100 > 10 and kop % 100 < 20 then ""
else if kop % 10 = 1 then "а"
else if kop % 10 > 1 and kop % 10 < 5 then "и"
else ""
in
rubText & kopText
2. Динамические массивы (Excel 365/2021):
В новых версиях Excel можно создать динамическую функцию, которая будет автоматически обновлять расшифровку при изменении исходных данных. Пример:
=ЛЕТ(
сумма; A1;
рубли; ЦЕЛОЕ(сумма);
копейки; ОКРУГЛ((сумма-рубли)*100;0);
рубТекст; ЕСЛИ(рубли=0; "ноль рублей";
ЧислоПрописью(рубли) & ЕСЛИ(
И(МОД(рубли;100)>10; МОД(рубли;100)<20); " рублей";
ЕСЛИ(
МОД(рубли;10)=1; " рубль";
ЕСЛИ(
И(МОД(рубли;10)>1; МОД(рубли;10)<5); " рубля";
" рублей"
)
)
)
);
копТекст; ЕСЛИ(копейки=0; "00 копеек";
ЧислоПрописью(копейки) & " копеек"
);
рубТекст & " " & копТекст
)
Эти методы требуют более глубоких знаний Excel, но дают максимальную гибкость и производительность при работе с большими наборами данных.
FAQ: Часто задаваемые вопросы
Можно ли сделать расшифровку суммы прописью в Google Таблицах?
Да, в Google Таблицах можно использовать аналогичный подход с пользовательскими функциями на Google Apps Script. Вот пример кода:
function numToText(num) {
// Реализация преобразования (около 100 строк кода)
// Полную версию можно найти в документации Google
}
После добавления скрипта в таблице появится функция =numToText().
Почему моя функция VBA выдает ошибку "Несоответствие типов"?
Эта ошибка возникает, когда функция пытается обработать нечисловое значение. Проверьте:
- Формат ячейки с исходной суммой (должен быть
Числовой) - Отсутствие текстовых символов (например, "$100" вместо "100")
- Наличие скрытых непечатаемых символов (используйте
=ЧИСТ())
Добавьте в начало функции проверку: If Not IsNumeric(rub) Then Exit Function.
Как сделать расшифровку для иностранных валют (доллары, евро)?
В функциях на VBA или надстройках обычно есть параметр для указания валюты. Примеры:
=SumProp(100; TRUE; "USD") ' Доллары
=ЧислоПрописью(200; "EUR") ' Евро
Для долларов и евро склонение проще, чем для рублей (например, "1 доллар", "2 доллара", но "1 евро", "2 евро").
Можно ли автоматически обновлять расшифровку при изменении суммы?
Да, если вы используете:
- Формулы Excel (обновляются автоматически)
- Функции VBA с объявлением как
Volatile(пример:Public Function SumProp(...) As String: Application.Volatile: ...) - Динамические массивы в Excel 365
Надстройки и онлайн-конвертеры требуют ручного обновления.
Где можно скачать готовый шаблон Excel с функцией расшифровки?
Готовые шаблоны с функцией преобразования сумм прописью можно найти на следующих ресурсах:
- ExcelVBA.ru (раздел "Шаблоны")
- PlanetaExcel.ru (надстройка "ЧислоПрописью")
- GitHub (поиск по запросу "Excel sum in words Russian")
При загрузке шаблонов всегда проверяйте их на наличие макросов (.xlsm) и запускайте в режиме песочницы (отключив макросы при первом открытии).