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

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

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

Для новичков начнём с самого простого — встроенных инструментов. Опытные пользователи найдут здесь оптимизированные VBA-решения и примеры для работы с разными валютами. Все примеры протестированы в Excel 2019–2023 и Microsoft 365, но majority методов будут работать и в более ранних версиях (начиная с Excel 2010).

1. Встроенная функция БАТЕКСТ: ограничения и возможности

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

  • 💵 Работает только с долларами США (вывод в формате "$1,234.56" → "One thousand two hundred thirty-four and 56/100").
  • 📛 Не поддерживает рубли, евро или другие валюты без дополнительных манипуляций.
  • 🔢 Максимальное число — 999 999 999,99 (миллиард минус одна копейка).
  • 🌍 В русских версиях Excel результат выдаётся на английском языке.

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

=БАТЕКСТ(1234,56;2)

Результат: "One thousand two hundred thirty-four and 56/100".

Чтобы адаптировать функцию для рублей, придётся заменить "$" на "руб." и "and" на "коп." вручную или через =ПОДСТАВИТЬ(). Но это полумера — для полноценной русификации лучше использовать другие методы.

⚠️ Внимание: Функция БАТЕКСТ округляет числа до двух знаков после запятой. Если вам нужно сохранить больше десятичных разрядов, используйте альтернативные способы.

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

Для полной русификации и гибкости наилучший вариант — создать собственную функцию на VBA. Этот метод позволяет:

  • 📝 Преобразовывать числа любой длины (включая триллионы).
  • 💰 Указывать валюту (рубли, доллары, евро).
  • 🔄 Обрабатывать копейки/центы отдельно.
  • 🌐 Выводить результат на русском языке с правильными падежами.

Вот готовый код функции, который нужно вставить в редактор VBA (Alt + F11Вставка → Модуль):

Function NumToText(ByVal Number As Double, Optional Currency As String = "руб.") As String

Dim Rubles As Variant, Kopecks As Variant, Temp As String

Dim Fractional As String, IntegerPart As String

' Разделяем целую и дробную части

IntegerPart = Int(Number)

Fractional = Round((Number - IntegerPart) * 100, 0)

' Массивы для чисел

Dim Units(9) As String, Teens(9) As String, Tens(9) As String, Hundreds(9) As String

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

Teens = Array("десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", _

"пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятьнадцать")

Tens = Array("", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", _

"шестьдесят", "семьдесят", "восемьдесят", "девяносто")

Hundreds = Array("", "сто", "двести", "триста", "четыреста", "пятьсот", _

"шестьсот", "семьсот", "восемьсот", "девятьсот")

' Обработка целой части

If IntegerPart = 0 Then

Rubles = "ноль"

Else

Temp = ""

' Миллиарды

If IntegerPart >= 1000000000 Then

Temp = NumToText(Int(IntegerPart / 1000000000)) & " миллиард"

If Int(IntegerPart / 1000000000) Mod 100 >= 11 And Int(IntegerPart / 1000000000) Mod 100 <= 19 Then

Temp = Temp & "ов"

Else

Select Case Int(IntegerPart / 1000000000) Mod 10

Case 1: Temp = Temp & ""

Case 2, 3, 4: Temp = Temp & "а"

Case Else: Temp = Temp & "ов"

End Select

End If

IntegerPart = IntegerPart Mod 1000000000

If IntegerPart > 0 Then Temp = Temp & " "

End If

' Миллионы

If IntegerPart >= 1000000 Then

Temp = Temp & NumToText(Int(IntegerPart / 1000000)) & " миллион"

If Int(IntegerPart / 1000000) Mod 100 >= 11 And Int(IntegerPart / 1000000) Mod 100 <= 19 Then

Temp = Temp & "ов"

Else

Select Case Int(IntegerPart / 1000000) Mod 10

Case 1: Temp = Temp & ""

Case 2, 3, 4: Temp = Temp & "а"

Case Else: Temp = Temp & "ов"

End Select

End If

IntegerPart = IntegerPart Mod 1000000

If IntegerPart > 0 Then Temp = Temp & " "

End If

' Тысячи

If IntegerPart >= 1000 Then

Temp = Temp & NumToText(Int(IntegerPart / 1000)) & " тысяча"

If Int(IntegerPart / 1000) Mod 100 >= 11 And Int(IntegerPart / 1000) Mod 100 <= 19 Then

Temp = Temp & ""

Else

Select Case Int(IntegerPart / 1000) Mod 10

Case 1: Temp = Temp & ""

Case 2, 3, 4: Temp = Temp & "и"

Case Else: Temp = Temp & ""

End Select

End If

IntegerPart = IntegerPart Mod 1000

If IntegerPart > 0 Then Temp = Temp & " "

End If

' Сотни, десятки, единицы

If IntegerPart >= 100 Then

Temp = Temp & Hundreds(Int(IntegerPart / 100)) & " "

IntegerPart = IntegerPart Mod 100

End If

If IntegerPart >= 20 Then

Temp = Temp & Tens(Int(IntegerPart / 10)) & " "

IntegerPart = IntegerPart Mod 10

ElseIf IntegerPart >= 10 Then

Temp = Temp & Teens(IntegerPart - 9) & " "

IntegerPart = 0

End If

If IntegerPart > 0 Then Temp = Temp & Units(IntegerPart) & " "

Temp = Trim(Temp)

' Падежи для рублей

If IntegerPart Mod 100 >= 11 And IntegerPart Mod 100 <= 19 Then

Rubles = Temp & Currency & "ей"

Else

Select Case IntegerPart Mod 10

Case 1: Rubles = Temp & Currency & "ль"

Case 2, 3, 4: Rubles = Temp & Currency & "ля"

Case Else: Rubles = Temp & Currency & "лей"

End Select

End If

End If

' Обработка копеек

If Fractional > 0 Then

Temp = ""

IntegerPart = Fractional

If IntegerPart >= 100 Then

Temp = Hundreds(Int(IntegerPart / 100)) & " "

IntegerPart = IntegerPart Mod 100

End If

If IntegerPart >= 20 Then

Temp = Temp & Tens(Int(IntegerPart / 10)) & " "

IntegerPart = IntegerPart Mod 10

ElseIf IntegerPart >= 10 Then

Temp = Temp & Teens(IntegerPart - 9) & " "

IntegerPart = 0

End If

If IntegerPart > 0 Then Temp = Temp & Units(IntegerPart) & " "

Temp = Trim(Temp)

' Падежи для копеек

If IntegerPart Mod 100 >= 11 And IntegerPart Mod 100 <= 19 Then

Kopecks = Temp & "копеек"

Else

Select Case IntegerPart Mod 10

Case 1: Kopecks = Temp & "копейка"

Case 2, 3, 4: Kopecks = Temp & "копейки"

Case Else: Kopecks = Temp & "копеек"

End Select

End If

NumToText = Rubles & " " & Kopecks

Else

NumToText = Rubles

End If

End Function

После вставки кода функция станет доступна в Excel как =NumToText(). Примеры использования:

  • =NumToText(1234,56) → "одна тысяча двести тридцать четыре рубля пятьдесят шесть копеек"
  • =NumToText(5000; "долл.") → "пять тысяч долларов"
  • =NumToText(1000001) → "один миллион один рубль"

Включите макросы в Файл → Параметры → Центр управления безопасностью → Параметры центра... → Включить все макросы|Скопируйте код в новый модуль (Alt+F11 → Вставка → Модуль)|Сохраните файл как .xlsm (с поддержкой макросов)|Проверьте функцию на тестовых данных: 0, 1, 1001, 1234567,89

-->

⚠️ Внимание: Если при открытии файла Excel блокирует макросы, добавьте папку с файлом в список доверенных расположений (Файл → Параметры → Центр управления безопасностью → Доверенные расположения).

3. Надстройка "ЧислоПрописью": готовое решение без VBA

Если работа с VBA кажется сложной, можно воспользоваться бесплатными надстройками. Одна из самых популярных — "ЧислоПрописью" от Plumsail. Она устанавливается за 2 минуты и добавляет в Excel новую функцию =ЧИСЛОПРОПИСЬЮ().

Преимущества надстройки:

  • 🔧 Не требует знания VBA.
  • 🌍 Поддерживает русский, английский, украинский и другие языки.
  • 💰 Автоматически подставляет рубли, доллары, евро, гривны.
  • 📅 Работает с датами (преобразует "01.01.2023" в "первое января две тысячи двадцать третьего года").

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

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

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

=ЧИСЛОПРОПИСЬЮ(1234,56; "RUR")  ' → "Одна тысяча двести тридцать четыре рубля 56 копеек"

=ЧИСЛОПРОПИСЬЮ(100; "USD") ' → "Сто долларов США"

=ЧИСЛОПРОПИСЬЮ(ДАТА(2023;5;15)) ' → "Пятнадцатое мая две тысячи двадцать третьего года"

Параметр функции Описание Пример значения
число Число или ссылка на ячейку с числом 1234,56 или A1
валюта Код валюты: "RUR", "USD", "EUR" "RUR"
язык Код языка: "RU", "EN", "UA" "RU"
регистр Регистр текста: 0 (как есть), 1 (все прописные) 0

Вручную|Стандартной функцией БАТЕКСТ|Через VBA|С помощью надстроек|Не знаю, как это делать-->

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

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

Алгоритм:

  1. Создайте на листе Слова таблицу с текстовymi представлениями чисел от 0 до 999 (единицы, десятки, сотни).
  2. Используйте функции =ЦЕЛОЕ(), =ОСТАТ() и =ВПР() для разбора числа по разрядам.
  3. Объедините результаты с помощью =СЦЕПИТЬ() или =ОБЪЕДИНИТЬ().

Пример для числа 123:

=СЦЕПИТЬ(

ВПР(ЦЕЛОЕ(A1/100); Слова!A:B; 2; ЛОЖЬ); " ";

ВПР(ОСТАТ(ЦЕЛОЕ(A1/10);10); Слова!C:D; 2; ЛОЖЬ); " ";

ВПР(ОСТАТ(A1;10); Слова!E:F; 2; ЛОЖЬ)

)

Критичный нюанс: этот метод не учитывает падежи валют (например, "рубль/рубля/рублей") и требует ручной доработки для каждого диапазона чисел. Для массовой обработки данных лучше использовать VBA или надстройки.

5. Обработка денежных сумм с копейками: особенности

При работе с денежными суммами важно правильно обрабатывать дробную часть (копейки/центы). Основные правила:

  • 💵 Для рублей используйте падежи: 1 копейка, 2–4 копейки, 5–20 копеек.
  • 🔢 Копейки всегда указывайте двумя знаками (даже если их ноль: "00 копеек").
  • 📌 В официальных документах сумма прописью пишется с заглавной буквы.

Пример формулы для VBA-функции (расширенный вариант из раздела 2):

Function MoneyToText(ByVal Amount As Double, Optional Currency As String = "руб.") As String

' ... (код аналогичен NumToText, но с forced обработкой копеек)

If Fractional = 0 Then

NumToText = Rubles & " 00 копеек"

Else

NumToText = Rubles & " " & Kopecks

End If

' Заглавная первая буква

NumToText = UCase(Left(NumToText, 1)) & Mid(NumToText, 2)

End Function

Результат для =MoneyToText(1234,50): "Одна тысяча двести тридцать четыре рубля пятьдесят копеек".

⚠️ Внимание: В бухгалтерских документах сумма прописью должна точно соответствовать цифровому значению. Проверяйте результат на тестовых данных: 100,01; 101,20; 1111,11.

6. Преобразование дат в текст: "1 января 2023 года"

Часто требуется не только числа, но и даты писать прописью (например, в договорах). Для этого можно использовать комбинацию функций или VBA.

Способ 1: Формулы

=СЦЕПИТЬ(

ВПР(ДЕНЬ(A1); Месяцы!A:B; 2; ЛОЖЬ); " ";

ТЕКСТ(Месяцы!VLOOKUP(МЕСЯЦ(A1); Месяцы!C:D; 2; FALSE); "Т"); " ";

ГОД(A1); " года"

)

Где на листе Месяцы созданы таблицы соответствия чисел и названий дней/месяцев.

Способ 2: VBA-функция

Function DateToText(ByVal DateValue As Date) As String

Dim Days(31) As String, Months(12) As String

Days = Array("", "первое", "второе", "третье", "четвёртое", "пятое", _

"шестое", "седьмое", "восьмое", "девятое", "десятое", _

"одиннадцатое", "двенадцатое", "тринадцатое", "четырнадцатое", _

"пятнадцатое", "шестнадцатое", "семнадцатое", "восемнадцатое", _

"девятнадцатое", "двадцатое", "двадцать первое", "двадцать второе", _

"двадцать третье", "двадцать четвёртое", "двадцать пятое", _

"двадцать шестое", "двадцать седьмое", "двадцать восьмое", _

"двадцать девятое", "тридцатое", "тридцать первое")

Months = Array("", "января", "февраля", "марта", "апреля", "мая", "июня", _

"июля", "августа", "сентября", "октября", "ноября", "декабря")

DateToText = Days(Day(DateValue)) & " " & Months(Month(DateValue)) & " " & _

Year(DateValue) & " года"

End Function

Пример: =DateToText(ДАТА(2023;1;15)) → "пятнадцатое января две тысячи двадцать третьего года".

Как обработать даты с порядковыми числительными (1-й, 2-го, 3-му)?

Для склонения дат по падежам (например, "к 1-му января") потребуется расширенная VBA-функция с учетом рода и падежа. Готовое решение можно найти в библиотеке VBA-Tools на GitHub (репозиторий "RussianDateDeclension").

7. Типичные ошибки и как их избежать

При преобразовании чисел в текст пользователи часто сталкиваются с следующими проблемами:

Ошибка Причина Решение
Неправильные падежи ("1 рубль", но "2 рубля" отсутствует) Функция не учитывает правила русского языка Используйте VBA-решение с проверкой остатка от деления на 10 и 100
Округление копеек (1234,567 → "56 копеек") Функция БАТЕКСТ округляет до 2 знаков Умножьте дробную часть на 100 и используйте =ОКРУГЛВВЕРХ()
Ошибка #ИМЯ? при вызове пользовательской функции Макросы отключены или файл не сохранён как .xlsm Включите макросы в параметрах безопасности Excel
Медленная работа при обработке больших диапазонов VBA-функции пересчитываются при каждом изменении листа Преобразуйте результаты в значения (Копировать → Специальная вставка → Значения)

Чтобы минимизировать ошибки:

  • 🧪 Тестируйте функцию на краевых значениях: 0, 1, 999, 1000, 1000000, 1234567,89.
  • 📋 Сверяйте результаты с бухгалтерскими стандартами (например, ГОСТ Р 7.0.97-2016 для документов).
  • 🔄 Используйте проверку данных (Данные → Проверка данных) для ограничения ввода только числовых значений.

8. Альтернативные инструменты: онлайн-конвертеры и Power Query

Если Excel недоступен или требуется разовое преобразование, можно воспользоваться альтернативными инструментами:

  • 🌐 Онлайн-конвертеры:
    • NumWord — поддерживает 20+ языков, включая русский.
    • Calculator.net — простой интерфейс, но без обработки валют.
  • 📊 Power Query:

    В Excel 2016+ можно использовать Power Query для загрузки данных с преобразованием. Пример запроса:

    let
    

    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],

    #"Добавлен столбец прописью" = Table.AddColumn(Source, "Прописью", each Number.ToText([Сумма], "ru-RU"))

    in

    #"Добавлен столбец прописью"

    Ограничение: функция Number.ToText в Power Query не поддерживает валюты и падежи.

  • 📱 Мобильные приложения:
    • Number to Words Converter (Android/iOS) — офлайн-работа, экспорт в Excel.
    • Бухгалтерские калькуляторы (например, 1С:Калькулятор) — специализированы для финансовых документов.

Преимущество онлайн-инструментов — не нужно настраивать Excel. Недостатки: риски конфиденциальности (если передаёте чувствительные данные) и отсутствие интеграции с таблицами.

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

1. Можно ли преобразовать числа в текст прописью без VBA?

Да, но с ограничениями:

  • Используйте функцию БАТЕКСТ для английского языка.
  • Для русского языка создайте таблицу шаблонов и комбинируйте функции ВПР, ЦЕЛОЕ, ОСТАТ.
  • Установите надстройку (например, "ЧислоПрописью").

2. Почему моя VBA-функция выдаёт ошибку #ЗНАЧ!?

Возможные причины:

  • Файл не сохранён в формате .xlsm (с поддержкой макросов).
  • В коде есть синтаксические ошибки (пропущенная запятая, скобка).
  • Переменные не объявлены (добавьте Option Explicit в начало модуля).
  • Число превышает допустимый диапазон (например, больше 999 триллионов).

3. Как преобразовать отрицательные числа?

Добавьте в начало VBA-функции проверку:

If Number < 0 Then

NumToText = "минус " & NumToText(Abs(Number), Currency)

Exit Function

End If

Для формульного подхода используйте =ЕСЛИ(A1<0; "минус " & ВашаФормула(ABS(A1)); ВашаФормула(A1)).

4. Можно ли автоматически добавлять "в том числе НДС 20%"?

Да, модифицируйте VBA-функцию:

Function MoneyToTextWithVAT(ByVal Amount As Double, ByVal VATRate As Double)

Dim MainText As String

MainText = MoneyToText(Amount)

MoneyToTextWithVAT = MainText & ", в том числе НДС " & VATRate & "% - " & _

MoneyToText(Amount * VATRate / (1 + VATRate))

End Function

Пример: =MoneyToTextWithVAT(1200; 0,2) → "Одна тысяча двести рублей 00 копеек, в том числе НДС 20% - двести рублей 00 копеек".

5. Как преобразовать числа в текст на украинском/казахском языке?

Используйте надстройку "ЧислоПрописью" с параметром языка:

=ЧИСЛОПРОПИСЬЮ(123; "UAH"; "UA")  ' украинский

=ЧИСЛОПРОПИСЬЮ(123; "KZT"; "KK") ' казахский

Для VBA потребуется создать отдельные массивы слов для каждого языка.