Число прописью в Excel: все способы преобразования с примерами

Почему стандартных функций 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

Чтобы использовать этот код:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. В меню выберите Insert → Module.
  3. Вставьте приведённый код в окно модуля.
  4. Закройте редактор VBA.
  5. Теперь в любой ячейке можно использовать формулу =NumToText(A1) или =NumToText(A1; "доллар") для другой валюты.

Включён ли режим разработчика в Excel (Файл → Параметры → Настройка ленты → галочка "Разработчик")|

Разрешено ли выполнение макросов (Файл → Параметры → Центр управления безопасностью → Параметры центра → Включить все макросы)|

Правильно ли скопирован код без лишних пробелов|

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

⚠️ Внимание: При передаче файла с VBA-кодом другим пользователям они должны разрешить выполнение макросов, иначе функция не будет работать. В корпоративных сетях это может быть заблокировано политикой безопасности.

Способ 3: Надстройка "ЧислоПрописью"

Для тех, кто не хочет возиться с VBA, есть готовые надстройки. Одна из самых популярных — "ЧислоПрописью" от Andrey Tretyakov. Она поддерживает:

  • 💰 Разные валюты (рубли, доллары, евро, гривны и др.)
  • 📊 Падежи (именительный, родительный, творительный)
  • 🔢 Дробные числа (с копейками/центами)
  • 🌍 Многовалютные документы

Установка надстройки:

  1. Скачайте файл ЧислоПрописью.xlam с официального сайта.
  2. В Excel перейдите в Файл → Параметры → Надстройки → Управление надстройками Excel → Перейти.
  3. Нажмите "Обзор", выберите скачанный файл и подтвердите установку.
  4. После установки появится новая функция =ЧислоПрописью().

Пример использования:

=ЧислоПрописью(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 и требует создания вспомогательных таблиц.

Алгоритм:

  1. Создайте на листе таблицу соответствий чисел и их прописных эквивалентов (единицы, десятки, сотни).
  2. Используйте функции LEFT, MID, RIGHT для разбиения числа на разряды.
  3. Применяйте VLOOKUP или INDEX/MATCH для поиска прописных эквивалентов.
  4. Объединяйте результаты с помощью 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 и новее. С его помощью можно создать пользовательскую функцию для преобразования чисел в текст.

Инструкция:

  1. Перейдите на вкладку Данные и выберите Получить данные → Из других источников → Пустой запрос.
  2. В редакторе 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:

  1. Получите API-ключ на сайте сервиса.
  2. В 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 и надстроек, поэтому остаются только два варианта:

  1. Использовать Power Query (доступен в веб-версии с 2020 года).
  2. Подключиться к внешнему 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 возникает по трём причинам:

  1. Файл не сохранён в формате .xlsm (с поддержкой макросов). Сохраните файл заново, выбрав тип "Книга Excel с поддержкой макросов".
  2. Макросы отключены в настройках безопасности. Перейдите в Файл → Параметры → Центр управления безопасностью → Параметры центра → Включить все макросы.
  3. Опечатка в имени функции. Проверьте регистр: =NumToText и =numtotext — разные функции.
Как преобразовать число прописью в Word из Excel?

Есть два способа:

  1. Связывание данных:
    1. В Excel создайте столбец с прописными значениями (любым из описанных методов).
    2. Скопируйте данные и вставьте в Word с сохранением связи (Специальная вставка → Связать → Текст).
  2. Поля Word:
    1. В Word перейдите в Вставка → Экспресс-блоки → Поле.
    2. Выберите тип поля NumToText (требуется установленная надстройка для Word).

Для автоматического обновления используйте связывание данных.

Можно ли сделать так, чтобы сумма прописью автоматически обновлялась при изменении числа?

Да, все описанные методы (кроме ручного ввода) поддерживают автоматическое обновление:

  • VBA-функции пересчитываются при изменении исходных данных (если включен автоматический пересчёт: Формулы → Вычисления → Автоматически).
  • Надстройки обновляются вместе с данными.
  • Формулы пересчитываются мгновенно.
  • Power Query требует ручного обновления (Данные → Обновить все), но можно настроить автоматическое обновление при открытии файла.

Если обновление не происходит, проверьте настройки вычислений в Формулы → Вычисления.