Почему стандартных функций Excel недостаточно?
На первый взгляд, задача преобразования числа в текст прописью (например, "123" → "сто двадцать три") кажется тривиальной. Однако в Microsoft Excel нет встроенной функции для такого преобразования — в отличие от TEXT для форматирования дат или VALUE для обратного преобразования. Это удивляет многих пользователей, особенно бухгалтеров и финансовых аналитиков, которые регулярно формируют отчёты с прописными суммами.
Причина отсутствия стандартной функции кроется в языковой специфике: правила написания чисел прописью сильно отличаются не только в разных языках (русский vs английский), но и в локальных вариантах одного языка. Например, в России "миллиард" пишется слитно, а в Украине — раздельно ("один мільярд"). Excel как международный продукт не может учесть все нюансы, поэтому делегирует эту задачу пользователям.
К счастью, есть несколько обходных путей: от использования надстроек до написания собственных формул. Далее разберём все актуальные методы с учётом их плюсов и минусов.
Способ 1: Функция БАС (для английского языка)
Если вам нужно преобразовать число в текст на английском, в Excel есть встроенная функция BAHTTEXT (для тайского бата) или DOLLAR (в некоторых локализациях). Но для русского языка она не подходит. Однако есть лайфхак: можно использовать BAHTTEXT для английских чисел, а затем заменить валюту вручную.
Пример формулы:
=SUBSTITUTE(BAHTTEXT(A1),"baht","рублей")
Этот метод работает только для целых чисел до 999 999 999. Для дробных значений потребуется дополнительная обработка. Важно: функция вернёт текст на английском, например, "one hundred twenty-three rubles", что не подходит для официальных документов на русском.
⚠️ Внимание: Функция BAHTTEXT доступна только в английской версии Excel. В русской локализации её нет — придётся менять языковые настройки или использовать другие способы.
Способ 2: Пользовательская функция на VBA
Наиболее гибкий и мощный метод — создание собственной функции на VBA (Visual Basic for Applications). Этот способ позволяет учитывать все нюансы русского языка, включая падежи, род чисел и валюту.
Вот готовый код для функции NumToText, которая преобразует число в текст прописью с копейками:
Function NumToText(ByVal n As Currency, Optional valuta As String = "рубль") As String
Dim rub As String, kop As String, temp As String
Dim RublText(1 To 3) As String, KopText(1 To 3) As String
RublText(1) = "рубль": RublText(2) = "рубля": RublText(3) = "рублей"
KopText(1) = "копейка": KopText(2) = "копейки": KopText(3) = "копеек"
rub = NumberToText(Int(n), True, True)
kop = NumberToText(Round((n - Int(n)) * 100, 0), False, True)
If Len(kop) = 0 Then kop = "00"
Select Case Right(kop, 1)
Case 1: valutaKop = KopText(1)
Case 2, 3, 4: valutaKop = KopText(2)
Case Else: valutaKop = KopText(3)
End Select
Select Case Right(rub, 1)
Case 1: valutaRub = RublText(1)
Case 2, 3, 4: valutaRub = RublText(2)
Case Else: valutaRub = RublText(3)
End Select
NumToText = rub & " " & valutaRub & " " & kop & " " & valutaKop
End Function
Function NumberToText(ByVal n As Currency, ByVal Male As Boolean, ByVal WithKopecks As Boolean) As String
Dim strTrln As String, strBln As String, strMln As String, strThs As String
Dim strTemp As String, strRub As String, strKop As String
Dim nThs As Integer, nMln As Integer, nBln As Integer, nTrln As Integer
If n = 0 Then NumberToText = "ноль": Exit Function
nTrln = Int(n / 1000000000000)
nBln = Int((n - nTrln * 1000000000000) / 1000000000)
nMln = Int((n - nTrln 1000000000000 - nBln 1000000000) / 1000000)
nThs = Int((n - nTrln 1000000000000 - nBln 1000000000 - nMln * 1000000) / 1000)
n = Int(n - nTrln 1000000000000 - nBln 1000000000 - nMln 1000000 - nThs 1000)
If nTrln > 0 Then strTrln = ConvertLessThanThousand(nTrln, Male) + " триллион" + ChooseCase(nTrln, "ов", "", "а")
If nBln > 0 Then strBln = ConvertLessThanThousand(nBln, Male) + " миллиард" + ChooseCase(nBln, "ов", "", "а")
If nMln > 0 Then strMln = ConvertLessThanThousand(nMln, Male) + " миллион" + ChooseCase(nMln, "ов", "", "а")
If nThs > 0 Then strThs = ConvertLessThanThousand(nThs, Male) + " тысяч" + ChooseCase(nThs, "а", "", "и")
If n > 0 Then strTemp = ConvertLessThanThousand(n, Male)
NumberToText = strTrln & " " & strBln & " " & strMln & " " & strThs & " " & strTemp
NumberToText = Application.WorksheetFunction.Trim(NumberToText)
End Function
Function ConvertLessThanThousand(ByVal n As Integer, ByVal Male As Boolean) As String
Dim strHundreds As String, strTens As String, strOnes As String
Dim strTemp As String
If n = 0 Then Exit Function
strHundreds = Choose(n \ 100 + 1, "", "сто", "двести", "триста", "четыреста", _
"пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот")
n = n Mod 100
Select Case n
Case 10 To 19
strTens = Array("", "", "двадцать", "тридцать", "сорок", _
"пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто")(n \ 10)
strOnes = Array("десять", "одиннадцать", "двенадцать", "тринадцать", _
"четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", _
"восемнадцать", "девятнадцать")(n Mod 10)
Case Else
strTens = Array("", "", "двадцать", "тридцать", "сорок", _
"пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто")(n \ 10)
strOnes = Array("", "один", "два", "три", "четыре", "пять", _
"шесть", "семь", "восемь", "девять")(n Mod 10)
End Select
If Male And n Mod 100 >= 11 And n Mod 100 <= 19 Then
strOnes = Replace(strOnes, "один", "одна")
strOnes = Replace(strOnes, "два", "две")
ElseIf Male And n Mod 10 = 1 And n \ 10 <> 1 Then
strOnes = Replace(strOnes, "один", "одна")
ElseIf Male And n Mod 10 = 2 And n \ 10 <> 1 Then
strOnes = Replace(strOnes, "два", "две")
End If
ConvertLessThanThousand = strHundreds & " " & strTens & " " & strOnes
ConvertLessThanThousand = Application.WorksheetFunction.Trim(ConvertLessThanThousand)
End Function
Function ChooseCase(ByVal n As Integer, ByVal str1 As String, ByVal str2 As String, ByVal str3 As String) As String
Select Case n Mod 100
Case 11 To 19: ChooseCase = str1
Case Else
Select Case n Mod 10
Case 1: ChooseCase = str2
Case 2 To 4: ChooseCase = str3
Case Else: ChooseCase = str1
End Select
End Select
End Function
Чтобы использовать этот код:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - В меню выберите
Insert → Module. - Вставьте приведённый код в окно модуля.
- Закройте редактор VBA.
- Теперь в любой ячейке можно использовать формулу
=NumToText(A1)или=NumToText(A1; "доллар")для другой валюты.
Включён ли режим разработчика в Excel (Файл → Параметры → Настройка ленты → галочка "Разработчик")|
Разрешено ли выполнение макросов (Файл → Параметры → Центр управления безопасностью → Параметры центра → Включить все макросы)|
Правильно ли скопирован код без лишних пробелов|
Сохранён ли файл в формате .xlsm (с поддержкой макросов)-->
⚠️ Внимание: При передаче файла с VBA-кодом другим пользователям они должны разрешить выполнение макросов, иначе функция не будет работать. В корпоративных сетях это может быть заблокировано политикой безопасности.
Способ 3: Надстройка "ЧислоПрописью"
Для тех, кто не хочет возиться с VBA, есть готовые надстройки. Одна из самых популярных — "ЧислоПрописью" от Andrey Tretyakov. Она поддерживает:
- 💰 Разные валюты (рубли, доллары, евро, гривны и др.)
- 📊 Падежи (именительный, родительный, творительный)
- 🔢 Дробные числа (с копейками/центами)
- 🌍 Многовалютные документы
Установка надстройки:
- Скачайте файл
ЧислоПрописью.xlamс официального сайта. - В Excel перейдите в
Файл → Параметры → Надстройки → Управление надстройками Excel → Перейти. - Нажмите "Обзор", выберите скачанный файл и подтвердите установку.
- После установки появится новая функция
=ЧислоПрописью().
Пример использования:
=ЧислоПрописью(A1; "RUR"; 1)
Где:
A1— ячейка с числом"RUR"— код валюты (рубли)1— падеж (1 — именительный, 2 — родительный)
| Код валюты | Название | Пример вывода |
|---|---|---|
RUR |
Рубли | "сто двадцать три рубля 50 копеек" |
USD |
Доллары | "one hundred twenty-three dollars 50 cents" |
EUR |
Евро | "einhundertdreiundzwanzig Euro fünfzig Cent" |
UAH |
Гривны | "сто двадцять три гривні 50 копійок" |
ЧислоПрописью от Andrey Tretyakov|
Собственный VBA-код|
Другую надстройку|
Не использую, обхожусь стандартными средствами|
Не знал о таких возможностях-->
Способ 4: Формулы без VBA (для чисел до 999 999)
Если VBA недоступен (например, в корпоративных версиях Excel с ограничениями), можно использовать комбинацию стандартных функций. Этот метод подходит для чисел до 999 999 и требует создания вспомогательных таблиц.
Алгоритм:
- Создайте на листе таблицу соответствий чисел и их прописных эквивалентов (единицы, десятки, сотни).
- Используйте функции
LEFT,MID,RIGHTдля разбиения числа на разряды. - Применяйте
VLOOKUPилиINDEX/MATCHдля поиска прописных эквивалентов. - Объединяйте результаты с помощью
CONCATENATEили&.
Пример реализации для чисел до 999:
=IF(A1=0,"ноль",
IF(LEFT(A1,1)<>0,VLOOKUP(LEFT(A1,1),$E$2:$F$10,2,FALSE)&" сотен ","") &
IF(MID(A1,2,1)<>0,VLOOKUP(MID(A1,2,1)*10,$E$12:$F$20,2,FALSE)&" ","") &
IF(RIGHT(A1,1)<>0,VLOOKUP(RIGHT(A1,1),$E$22:$F$30,2,FALSE),"") &
IF(AND(MID(A1,2,1)=1,RIGHT(A1,1)<>0),VLOOKUP(RIGHT(A1,1),$E$32:$F$40,2,FALSE),"")
)
Где диапазон E2:F40 содержит таблицу соответствий:
| Число | Пропись |
|---|---|
| 1 | сто |
| 2 | двести |
| ... | ... |
| 10 | десять |
| 20 | двадцать |
⚠️ Внимание: Этот метод требует ручного создания и поддержки таблицы соответствий. При изменении правил написания чисел (например, реформы языка) придётся обновлять таблицу вручную.
Как автоматизировать создание таблицы соответствий?
Можно написать отдельный VBA-скрипт, который заполнит диапазон E2:F40 прописными эквивалентами чисел. Например:
Sub FillNumberTable()
Dim i As Integer, rng As Range
Set rng = Range("E2")
For i = 1 To 9
rng.Cells(i, 1).Value = i
rng.Cells(i, 2).Value = Choose(i, "сто", "двести", "триста", "четыреста", _
"пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот")
Next i
' Аналогично заполняем десятки и единицы
End Sub
Этот скрипт сэкономит время при первоначальной настройке.
Способ 5: Power Query (для Excel 2016+)
Power Query — мощный инструмент для преобразования данных, доступный в Excel 2016 и новее. С его помощью можно создать пользовательскую функцию для преобразования чисел в текст.
Инструкция:
- Перейдите на вкладку
Данныеи выберитеПолучить данные → Из других источников → Пустой запрос. - В редакторе Power Query введите в строку формул:
= (number as number) as text =>
let
units = {"","один","два","три","четыре","пять","шесть","семь","восемь","девять"},
teens = {"десять","одиннадцать","двенадцать","тринадцать","четырнадцать",
"пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать"},
tens = {"","десять","двадцать","тридцать","сорок","пятьдесят",
"шестьдесят","семьдесят","восемьдесят","девяносто"},
hundreds = {"","сто","двести","триста","четыреста","пятьсот",
"шестьсот","семьсот","восемьсот","девятьсот"},
convertLessThanThousand = (n) =>
if n = 0 then "" else
let
hundredPart = hundreds{Number.IntegerDivide(n, 100)},
remainder = Number.Mod(n, 100),
tenPart = if remainder >= 20 then
tens{Number.IntegerDivide(remainder, 10)} &
(if Number.Mod(remainder, 10) <> 0 then " " & units{Number.Mod(remainder, 10)} else "")
else if remainder >= 10 then
teens{Number.Mod(remainder, 10)}
else
units{remainder}
in
if hundredPart <> "" then hundredPart & (if tenPart <> "" then " " & tenPart else "") else tenPart,
result = convertLessThanThousand(Number.IntegerDivide(number, 1000)) &
(if Number.IntegerDivide(number, 1000) <> 0 then
" тысяч" &
(if Number.Mod(Number.IntegerDivide(number, 1000), 100) = 1 then "а"
else if Number.Mod(Number.IntegerDivide(number, 1000), 100) >= 2 and
Number.Mod(Number.IntegerDivide(number, 1000), 100) <= 4 then "и" else "") &
(if Number.Mod(number, 1000) <> 0 then " " else "") else "") &
convertLessThanThousand(Number.Mod(number, 1000))
in
result
Этот код создаёт функцию, которую можно вызвать из Excel после загрузки запроса. Главный плюс метода — кроссплатформенность (работает и в Power BI), но минус в том, что для больших чисел потребуется дорабатывать логику.
Способ 6: Онлайн-конвертеры и API
Если вам нужно одноразовое преобразование или работаете с Excel Online, можно использовать внешние сервисы:
- 🌐 num2word.ru — бесплатный онлайн-конвертер с API
- 🔗 RapidAPI — платформы с API для преобразования чисел (например, "Number to Words")
- 📊 Google Sheets — имеет встроенную функцию
=SPARKLINE(ARRAYFORMULA(IFERROR(1/0))) & TEXT(A1,"[DBnum1]0")для китайских иероглифов, но не для русского
Пример интеграции с API num2word.ru:
- Получите API-ключ на сайте сервиса.
- В Excel используйте функцию
WEBSERVICE(доступна в Excel 365):
=WEBSERVICE("https://api.num2word.ru/convert?number=" & A1 & "&key=ВАШ_КЛЮЧ")
Или через Power Query:
let
Source = Json.Document(Web.Contents("https://api.num2word.ru/convert",
[Query=[number=Text.From([Число]), key="ВАШ_КЛЮЧ"]])),
result = Source[result]
in
result
⚠️ Внимание: При использовании внешних API учитывайте:
- Задержки при запросах (Excel может "подвисать")
- Ограничения на количество запросов (обычно 1000-5000 в месяц)
- Конфиденциальность данных (числа уходят на сторонний сервер)
Сравнение методов: какой выбрать?
Выбор способа зависит от ваших задач и ограничений:
| Метод | Макс. число | Поддержка копеек | Требует VBA | Сложность | Лучше для |
|---|---|---|---|---|---|
| VBA-функция | Неограничено | Да | Да | Средняя | Регулярного использования |
| Надстройка | Неограничено | Да | Нет | Низкая | Новичков |
| Формулы | 999 999 | Нет | Нет | Высокая | Одноразовых задач |
| Power Query | Миллиарды | Да (с доработкой) | Нет | Средняя | Power BI пользователей |
| API | Неограничено | Да | Нет | Низкая | Облачных решений |
FAQ: Частые вопросы
Можно ли преобразовать число прописью в Excel Online?
В Excel Online нет поддержки VBA и надстроек, поэтому остаются только два варианта:
- Использовать
Power Query(доступен в веб-версии с 2020 года). - Подключиться к внешнему API через
WEBSERVICE(требуется Excel 365).
Для одноразовых задач проще скопировать данные в настольную версию Excel, выполнить преобразование и вернуть результат обратно.
Как сделать, чтобы "1 рубль" писалось правильно, а не "1 рублей"?
Проблема с согласованием валют решается только через VBA или специализированные надстройки. В стандартных формулах Excel нет инструментов для анализа окончаний. Пример кода для VBA:
Function RubText(n As Long) As String
Dim lastDigit As Integer
lastDigit = n Mod 10
If lastDigit = 1 And n Mod 100 <> 11 Then
RubText = "рубль"
ElseIf lastDigit >= 2 And lastDigit <= 4 And (n Mod 100 < 10 Or n Mod 100 >= 20) Then
RubText = "рубля"
Else
RubText = "рублей"
End If
End Function
Используйте её вместе с основной функцией преобразования.
Почему моя VBA-функция выдаёт ошибку #NAME?
Ошибка #NAME в пользовательских функциях VBA возникает по трём причинам:
- Файл не сохранён в формате .xlsm (с поддержкой макросов). Сохраните файл заново, выбрав тип "Книга Excel с поддержкой макросов".
- Макросы отключены в настройках безопасности. Перейдите в
Файл → Параметры → Центр управления безопасностью → Параметры центра → Включить все макросы. - Опечатка в имени функции. Проверьте регистр:
=NumToTextи=numtotext— разные функции.
Как преобразовать число прописью в Word из Excel?
Есть два способа:
- Связывание данных:
- В Excel создайте столбец с прописными значениями (любым из описанных методов).
- Скопируйте данные и вставьте в Word с сохранением связи (
Специальная вставка → Связать → Текст).
- Поля Word:
- В Word перейдите в
Вставка → Экспресс-блоки → Поле. - Выберите тип поля
NumToText(требуется установленная надстройка для Word).
- В Word перейдите в
Для автоматического обновления используйте связывание данных.
Можно ли сделать так, чтобы сумма прописью автоматически обновлялась при изменении числа?
Да, все описанные методы (кроме ручного ввода) поддерживают автоматическое обновление:
- VBA-функции пересчитываются при изменении исходных данных (если включен автоматический пересчёт:
Формулы → Вычисления → Автоматически). - Надстройки обновляются вместе с данными.
- Формулы пересчитываются мгновенно.
- Power Query требует ручного обновления (
Данные → Обновить все), но можно настроить автоматическое обновление при открытии файла.
Если обновление не происходит, проверьте настройки вычислений в Формулы → Вычисления.