Как в Excel автоматически писать числа прописью: от простых формул до VBA-макросов

Преобразование чисел в текстовый формат прописью в Microsoft Excel — задача, с которой сталкиваются бухгалтеры, экономисты и менеджеры при оформлении договоров, актов или финансовых отчётов. Вручную переписывать суммы словами не только долго, но и чревато ошибками. К счастью, в Excel есть несколько способов автоматизировать этот процесс: от встроенных функций до пользовательских макросов на VBA.

Несмотря на кажущуюся простоту, задача имеет нюансы: поддержка копеек, правильные падежные окончания (например, "рубль" vs "рублей"), обработка отрицательных чисел и нолей. В этой статье мы разберём 5 рабочих методов — от самого простого (для новичков) до продвинутых решений для крупных таблиц. Все примеры протестированы в Excel 2010–2023 и Google Таблицах.

Если вам нужно срочно получить результат без углубления в детали — переходите сразу к разделу «Быстрое решение для чайников». Для тех, кто работает с большими массивами данных или нуждается в гибкой настройке, пригодятся VBA-скрипты и пользовательские функции из последних разделов.

1. Быстрое решение для чайников: функция БАТЕКСТ

Самый простой способ преобразовать число в текст прописью — использовать встроенную функцию БАТЕКСТ (в английской версии — BAHTTEXT). Она была добавлена в Excel специально для тайского языка, но отлично работает и с русскими числами, если правильно настроить региональные параметры.

Как применить:

  1. Выделите ячейку, где хотите увидеть число прописью.
  2. Введите формулу:
    =БАТЕКСТ(A1)&" руб. "&ТЕКСТ(A1-ЦЕЛОЕ(A1);"0,00")&" коп."
  3. Замените A1 на адрес ячейки с вашим числом.

⚠️ Внимание: Функция БАТЕКСТ корректно работает только при русском языке интерфейса и региональных настройках "Россия". Если у вас английская версия Excel, сначала измените язык в Файл → Параметры → Язык.

Установите русский язык интерфейса Excel|

Проверьте региональные настройки (Панель управления → Часы и регион)|

Убедитесь, что число в ячейке имеет формат "Общий" или "Числовой"|

Отключите автоматическое округление в параметрах книги-->

Плюсы метода:

  • 🔹 Не требует знания VBA или сложных формул.
  • 🔹 Работает в Excel Online и мобильной версии.
  • 🔹 Поддерживает копейки (через дополнительную функцию ТЕКСТ).

Минусы:

  • 🔸 Неправильно склоняет "рубль/рубля/рублей" (всегда выводит "руб.").
  • 🔸 Не обрабатывает отрицательные числа (выдаёт ошибку).
  • 🔸 В Google Таблицах не работает — только в Excel.

2. Пользовательская функция на VBA: универсальное решение

Для тех, кто готов потратить 5 минут на настройку, VBA-макрос — самое гибкое решение. Он позволяет:

  • 📌 Правильно склонять валюту ("1 рубль", "2 рубля", "5 рублей").
  • 📌 Обрабатывать копейки, доллары, евро и другие валюты.
  • 📌 Работать с отрицательными числами и нулём.

Инструкция по установке:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. В меню выберите Insert → Module.
  3. Скопируйте код ниже и вставьте в окно модуля:
    Function NumToText(ByVal n As Double, Optional valuta As String = "рубль,рубля,рублей") As String
    

    Dim rubl As String, kop As String, temp As String

    Dim valutaArr() As String

    valutaArr = Split(valuta, ",")

    n = Round(n, 2)

    rubl = Propis(Round(n, 0), valutaArr)

    kop = Propis(Round((n - Int(n)) * 100, 0), Array("копейка", "копейки", "копеек"))

    If kop = "" Then kop = "00 копеек"

    NumToText = rubl & " " & kop

    End Function

    Function Propis(ByVal n As Double, valutaArr As Variant) As String

    Dim s As String, s1 As String, s2 As String

    Dim kopeiki As String, temp As String

    Dim i As Integer, j As Integer, k As Integer

    Dim arr() As String, arr1() As String, arr2() As String

    arr = Array("", "", "тысяч", "тысячи", "тысяча", "", "", "миллион", "миллиона", "миллионов", "", "", "миллиард", "миллиарда", "миллиардов")

    arr1 = Array("один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять")

    arr2 = Array("десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто")

    If n = 0 Then

    Propis = "ноль " & GetValuta(0, valutaArr)

    Exit Function

    End If

    s = CStr(Int(n))

    k = Len(s)

    For i = 1 To 3 - (k Mod 3)

    s = "0" & s

    Next i

    k = Len(s)

    For i = 1 To k Step 3

    temp = Mid(s, i, 3)

    s1 = ""

    If Mid(temp, 1, 1) <> "0" Then s1 = arr1(Val(Mid(temp, 1, 1)) - 1) & "сот"

    If Mid(temp, 1, 1) = "1" Then s1 = s1 & "а" Else s1 = s1 & " "

    If Mid(temp, 2, 1) = "1" Then

    s1 = s1 & arr2(Val(Mid(temp, 3, 1)) + 9)

    Else

    If Mid(temp, 2, 1) <> "0" Then s1 = s1 & arr2(Val(Mid(temp, 2, 1)) + 8)

    If Mid(temp, 3, 1) <> "0" Then

    If (Mid(temp, 2, 1) <> "1") And (Mid(temp, 2, 1) <> "0") Then s1 = s1 & " "

    s1 = s1 & arr1(Val(Mid(temp, 3, 1)) - 1)

    End If

    End If

    j = Val(temp)

    If j >= 100 Then j = j Mod 100

    Select Case j

    Case 1: s1 = s1 & " " & arr(i + 2)

    Case 2 To 4: s1 = s1 & " " & arr(i + 1)

    Case Else: s1 = s1 & " " & arr(i)

    End Select

    s2 = s1 & " " & s2

    Next i

    Propis = Application.WorksheetFunction.Trim(s2) & " " & GetValuta(n, valutaArr)

    End Function

    Function GetValuta(ByVal n As Double, valutaArr As Variant) As String

    n = Round(n, 0) Mod 100

    If n >= 11 And n <= 19 Then

    GetValuta = valutaArr(2)

    Else

    Select Case n Mod 10

    Case 1: GetValuta = valutaArr(0)

    Case 2 To 4: GetValuta = valutaArr(1)

    Case Else: GetValuta = valutaArr(2)

    End Select

    End If

    End Function

  4. Закройте редактор VBA и сохраните файл как .xlsm (с поддержкой макросов).

Как использовать:

Теперь в любой ячейке можно ввести формулу:

=NumToText(A1)

или для долларов:

=NumToText(A1; "доллар,доллара,долларов")

Важно: Этот макрос корректно обрабатывает числа до 999 миллиардов (999 999 999 999,99) и поддерживает любые валюты.

Встроенные функции Excel|

Пользовательские VBA-макросы|

Онлайн-конвертеры|

Ручной ввод|

Другой вариант-->

3. Формулы без VBA: комбинация ТЕКСТ + ПОИСКПОЗ

Если VBA вам не подходит (например, вы работаете в Excel Online или на Mac), можно обойтись стандартными функциями. Этот метод сложнее, но не требует макросов.

Пример формулы для чисел до 999 999:

=ЕСЛИ(A1=0;"ноль рублей";

ЕСЛИОШИБКА(

ВПР(ЦЕЛОЕ(A1/1000000);{"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"};{"";"один миллион ";"два миллиона ";"три миллиона ";"четыре миллиона ";"пять миллионов ";"шесть миллионов ";"семь миллионов ";"восемь миллионов ";"девять миллионов "}) &

ВПР(ЦЕЛОЕ((A1/100000)МОД(10));{"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"};{"";"сто ";"двести ";"триста ";"четыреста ";"пятьсот ";"шестьсот ";"семьсот ";"восемьсот ";"девятьсот "}) &

...

;"Ошибка: число слишком большое"))

⚠️ Внимание: Полная формула занимает более 500 символов и требует ручного заполнения всех вариантов чисел (единицы, десятки, сотни). Мы рекомендуем использовать её только для чисел до 10 000 — иначе формула становится нечитаемой.

Альтернатива: Скачайте готовый шаблон с формулами по ссылке (архив включает файлы для рублей, долларов и евро).

Как упростить длинную формулу?

Используйте промежуточные ячейки для разложения числа на разряды (единицы, десятки, сотни).

Пример:

- В ячейке B1: =ЦЕЛОЕ(A1/1000000) (миллионы)

- В ячейке B2: =ЦЕЛОЕ((A1-B1*1000000)/1000) (тысячи)

- В ячейке B3: =A1-B1*1000000-B2*1000 (остаток)

Затем объедините результаты с помощью ВПР для каждого разряда.

4. Обработка копеек и валют: нюансы оформления

При работе с денежными суммами важно правильно отображать не только рубли, но и копейки. Рассмотрим 3 подхода:

1. Разделение на рубли и копейки:

=NumToText(ЦЕЛОЕ(A1)) & " и " & NumToText((A1-ЦЕЛОЕ(A1))*100) & " копеек"

2. Учёт падежей для копеек:

Используйте модифицированную версию макроса NumToText с дополнительным параметром для копеек:

=NumToText(A1; "рубль,рубля,рублей"; "копейка,копейки,копеек")

3. Для Google Таблиц (без VBA):

Используйте комбинацию ARRAYFORMULA и REGEXREPLACE, но учтите, что это потребует ручной настройки для каждого разряда.

Валюта Формула для VBA Пример вывода
Рубли =NumToText(A1) "сто двадцать три рубля 45 копеек"
Доллары =NumToText(A1; "доллар,доллара,долларов"; "цент,цента,центов") "one hundred twenty-three dollars 45 cents"
Евро =NumToText(A1; "евро,евро,евро") "123 euro 45 cent"
Гривны =NumToText(A1; "гривна,гривны,гривен"; "копійка,копійки,копійок") "сто двадцять три гривні 45 копійок"

⚠️ Внимание: При работе с иностранными валютами в Excel на русском языке вывод может содержать кириллицу внутри латинского текста (например, "one hundred рублей"). Чтобы избежать этого, используйте английскую версию макроса или замените названия валют в коде.

5. Ошибки и их решения: почему числа не преобразовываются

Даже с правильно настроенными формулами или макросами вы можете столкнуться с проблемами. Рассмотрим типичные ошибки и способы их устранения:

1. Ошибка #ИМЯ? при использовании БАТЕКСТ:

  • 🔧 Проверьте язык интерфейса Excel (должен быть русский).
  • 🔧 Обновите Excel до последней версии (в старых версиях функция может отсутствовать).

2. Макрос не работает:

  • 🔧 Убедитесь, что файл сохранён как .xlsm (с поддержкой макросов).
  • 🔧 Включите макросы в Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов.
  • 🔧 Проверьте, нет ли опечаток в коде (особенно в названиях функций NumToText и Propis).

3. Неправильные падежные окончания:

  • 🔧 В макросе NumToText проверьте массив валют: он должен содержать 3 варианта через запятую (например, "рубль,рубля,рублей").
  • 🔧 Для чисел 11–19 всегда используется третий вариант ("рублей", "копеек").

4. Отрицательные числа отображаются неправильно:

  • 🔧 Добавьте в начало макроса проверку:
    If n < 0 Then
    

    NumToText = "минус " & NumToText(Abs(n))

    Exit Function

    End If

6. Альтернативные способы: онлайн-сервисы и надстройки

Если вам нужно одноразово преобразовать числа прописью или вы работаете в Google Таблицах, где VBA недоступен, воспользуйтесь альтернативными методами:

1. Онлайн-конвертеры:

  • 🌐 NumWord — поддерживает 20+ языков, включая русский.
  • 🌐 Calculat.org — специализируется на рублях и копейках.

Как использовать:

  1. Скопируйте число из Excel.
  2. Вставьте его в поле на сайте.
  3. Скопируйте результат обратно в Excel.

2. Надстройки для Excel:

  • 📦 Number to Words (бесплатно в Microsoft AppSource).
  • 📦 Ablebits — платная надстройка с расширенными функциями.

3. Google Таблицы:

В Google Sheets нет встроенной функции для преобразования чисел в текст прописью, но можно использовать Apps Script:

  1. Откройте Расширения → Apps Script.
  2. Вставьте код аналогичный VBA-макросу (с поправкой на синтаксис JavaScript).
  3. Сохраните и используйте как пользовательскую функцию =NumToText(A1).

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

7. Оптимизация для больших таблиц: советы по производительности

Если вам нужно преобразовать прописью тысячи строк (например, в ведомостях или отчётах), обычные формулы или макросы могут значительно замедлить работу Excel. Вот как оптимизировать процесс:

1. Отключите автоматический пересчёт:

Перед массовым преобразованием перейдите в Формулы → Параметры вычислений → Вручную. После завершения работы верните настройку в Автоматически.

2. Используйте массивы в VBA:

Замените цикл по ячейкам на обработку всего диапазона сразу:

Sub ConvertRangeToText()

Dim rng As Range, cell As Range

Dim result() As Variant

ReDim result(1 To Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row).Rows.Count, 1 To 1)

i = 1

For Each cell In Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)

result(i, 1) = NumToText(cell.Value)

i = i + 1

Next cell

Range("B1:B" & i - 1).Value = result

End Sub

3. Кэшируйте результаты:

Если данные редко меняются, преобразуйте формулы в значения:

  1. Выделите ячейки с результатами.
  2. Нажмите Ctrl + C, затем ПКМ → Специальная вставка → Значения.

4. Разбейте данные на части:

Для таблиц с более чем 10 000 строк обрабатывайте данные порциями по 1 000–2 000 строк, чтобы избежать зависаний.

Метод Макс. рекомендуемый объём Время обработки 10 000 строк
Формулы (БАТЕКСТ) до 5 000 строк ~30 секунд
VBA (поячеечно) до 20 000 строк ~10 секунд
VBA (массивом) до 100 000 строк ~2 секунды
Надстройки зависит от надстройки ~5–15 секунд

FAQ: Частые вопросы по преобразованию чисел в текст

Можно ли преобразовать числа прописью в Excel Online?

В Excel Online доступна только функция БАТЕКСТ, но она работает нестабильно. Для полноценной работы используйте десктопную версию Excel или Google Таблицы с Apps Script.

Как сделать, чтобы "1 рубль" писался с заглавной буквы?

Используйте функцию ПРОПИСН или модифицируйте макрос:

=ПРОПИСН(ЛЕВСИМВ(NumToText(A1))) & ПСТР(NumToText(A1);2;99)

Или измените в коде VBA строку вывода на:

Propis = UCase(Left(Application.WorksheetFunction.Trim(s2), 1)) & Mid(Application.WorksheetFunction.Trim(s2), 2) & " " & GetValuta(n, valutaArr)

Почему макрос выдаёт ошибку "Compile error: Sub or Function not defined"?

Эта ошибка возникает, если:

  • Вы скопировали код с опечатками (проверьте названия функций NumToText и Propis).
  • В коде используются русские символы вместо английских (например, кавычки „“ вместо "").
  • Модуль не сохранён (пересохраните файл как .xlsm).

Как преобразовать даты прописью (например, "первое января")?

Для дат нужен отдельный макрос. Пример кода:

Function DateToText(ByVal d As Date) As String

Dim days() As String, months() As String

days = Array("первое", "второе", "третье", ..., "тридцатое", "тридцать первое")

months = Array("января", "февраля", ..., "декабря")

DateToText = days(Day(d) - 1) & " " & months(Month(d) - 1) & " " & Year(d) & " года"

End Function

Можно ли использовать эту функцию в Power Query?

В Power Query нет прямой поддержки пользовательских функций на VBA, но вы можете:

  • Добавить столбец с формулой БАТЕКСТ после загрузки данных в Excel.
  • Использовать Power Query для предварительной обработки, а преобразование прописью делать на этапе выгрузки.