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

Преобразование числовых значений в текстовый формат прописью — одна из самых востребованных задач в бухгалтерии, финансовом учете и документообороте. Когда вы формируете счета, акты или договоры в Microsoft Excel, суммы в цифрах часто требуется дублировать словами. Например, вместо 1 256,78 ₽ нужно получить "Одна тысяча двести пятьдесят шесть рублей 78 копеек".

В этой статье мы разберем 5 рабочих способов реализовать эту функцию: от встроенных инструментов Excel до пользовательских формул и макросов на VBA. Вы узнаете, какой метод подходит для вашей версии программы (включая Excel 365, 2019, 2016 и более ранние), как адаптировать вывод под российский рубль или иностранную валюту, а также избежать типичных ошибок при работе с большими числами или дробными значениями.

Особое внимание уделим нюансам оформления: склонению числительных, обработке нулевых значений и интеграции функции в динамические таблицы. Если вы никогда не работали с VBA — не переживайте: мы предоставим готовые скрипты с подробными комментариями, которые можно просто скопировать и вставить.

Для удобства все методы проранжированы по сложности — от самых простых (подходящих новичкам) до продвинутых (для автоматизации массовых документов). Также в конце статьи вы найдете FAQ с ответами на частые вопросы и таблицу сравнения способов по скорости выполнения и универсальности.

1. Стандартная функция БАТЕКСТ (только для английской версии Excel)

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

  • 🌍 Вывод осуществляется на английском языке (например, 100"One hundred baht").
  • 💰 Валюта по умолчанию — бат (таиландская валюта), что не подходит для российских документов.

Тем не менее, функцию можно адаптировать для рублевых сумм с помощью вложенных формул. Пример для числа в ячейке A1:

=SUBSTITUTE(SUBSTITUTE(BAHTTEXT(A1), "Baht", "рубль"), "Satang", "копейка")
⚠️ Внимание: В русской версии Excel функция БАТЕКСТ() отсутствует. Попытка её использования приведёт к ошибке #ИМЯ?.

Для пользователей Excel 365 с подпиской Microsoft 365 доступна экспериментальная функция =TEXTAFTER() в комбинации с BAHTTEXT, но её применение требует глубокой настройки локализации.

📊 Какую версию Excel вы используете?
Excel 365
Excel 2019
Excel 2016
Excel 2013 или старше
Не знаю

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

Самый универсальный и точный способ — создать пользовательскую функцию (UDF) на языке VBA. Она будет корректно склонять числительные для рублей и копеек, обрабатывать дробные значения и поддерживать числа до 999 триллионов.

Чтобы добавить функцию:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. В меню выберите Insert → Module.
  3. Скопируйте и вставьте следующий код:
    Function SumProp(ByVal MyNumber As Currency) As String
    

    Dim Rub As String, Kop As String, Temp As String

    Dim DecimalPlace As Integer, Cnt As Integer

    Dim Place(9) As String

    Place(2) = " тысячи "

    Place(3) = " миллиона "

    Place(4) = " миллиарда "

    Place(5) = " триллиона "

    MyNumber = Round(MyNumber, 2)

    Rub = Int(MyNumber)

    Kop = Format(CStr((MyNumber - Rub) * 100), "00")

    If Rub = 0 Then Rub = ""

    If Kop = 0 Then Kop = "" Else Kop = " " & Kop & " копейки"

    If Rub <> "" Then

    Temp = ""

    DecimalPlace = 1

    Do While Rub > 0

    Cnt = Rub Mod 1000

    If Cnt <> 0 Then

    Temp = ConvertLessThanOneThousand(Cnt, DecimalPlace) & Place(DecimalPlace) & Temp

    End If

    Rub = Rub \ 1000

    DecimalPlace = DecimalPlace + 1

    Loop

    Rub = Application.WorksheetFunction.Trim(Temp)

    End If

    Select Case Kop

    Case " 01 копейки": Kop = " 01 копейка"

    Case " 02 копейки", " 03 копейки", " 04 копейки": Kop = Left(Kop, 7) & "а"

    Case Else: Kop = Kop

    End Select

    Select Case Rub

    Case "один рубль": Rub = "один рубль"

    Case "два рубля", "три рубля", "четыре рубля": Rub = Left(Rub, Len(Rub) - 5) & "а"

    Case Else: Rub = Rub & " рублей"

    End Select

    SumProp = Rub & Kop

    End Function

    Function ConvertLessThanOneThousand(ByVal MyNumber, DecimalPlace As Integer)

    Dim Txt As String, Ones As String, Tens As String

    Dim Hundreds As String

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

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

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

    If Val(MyNumber) = 0 Then Exit Function

    If MyNumber >= 100 Then

    Txt = Hundreds(Int(MyNumber / 100)) & " "

    MyNumber = MyNumber - Int(MyNumber / 100) * 100

    End If

    If MyNumber >= 20 Then

    Txt = Txt & Tens(Int(MyNumber / 10))

    MyNumber = MyNumber - Int(MyNumber / 10) * 10

    If MyNumber > 0 Then Txt = Txt & " "

    End If

    If MyNumber >= 10 Then

    Select Case MyNumber

    Case 10: Txt = Txt & "десять"

    Case 11: Txt = Txt & "одиннадцать"

    Case 12: Txt = Txt & "двенадцать"

    Case 13: Txt = Txt & "тринадцать"

    Case 14: Txt = Txt & "четырнадцать"

    Case 15: Txt & "пятнадцать"

    Case 16: Txt & "шестнадцать"

    Case 17: Txt & "семнадцать"

    Case 18: Txt & "восемнадцать"

    Case 19: Txt & "девятнадцать"

    End Select

    MyNumber = 0

    Else

    Txt = Txt & Ones(MyNumber)

    End If

    ConvertLessThanOneThousand = Txt

    End Function

    После вставки кода закройте редактор VBA и используйте функцию в таблице как =SumProp(A1), где A1 — ячейка с числом. Функция автоматически склоняет рубли и копейки по правилам русского языка.

    Убедитесь, что макросы разрешены в Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов|Проверьте регистр в названии функции (например, SumProp, а не sumprop)|Тестируйте функцию на числах с разным количеством разрядов (123, 1000, 1234567,89)|Сохраните файл как .xlsm (с поддержкой макросов)

    -->

    3. Использование надстройки "ЧислоПрописью"

    Если вам не хочется работать с VBA, можно установить бесплатную надстройку "ЧислоПрописью" от Microsoft или сторонних разработчиков. Она добавляет в Excel новую функцию, которую можно использовать как стандартную.

    Где скачать и как установить:

    • 🔗 Официальный репозиторий надстроек: перейдите в Вставка → Надстройки → Просмотреть другие надстройки и найдите "ЧислоПрописью".
    • 📥 Альтернативные источники: сайты PlanetaExcel или ExcelWorld (проверяйте файлы на вирусы!).

    После установки в списке функций появится =ЧИСЛОПРОПИСЬЮ(). Пример использования:

    =ЧИСЛОПРОПИСЬЮ(A1; "рубль"; "рубля"; "рублей"; "копейка"; "копейки"; "копеек")

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

    • ✅ Не требует знаний VBA.
    • ✅ Поддерживает многовалютность (можно указать доллары, евро и т.д.).
    • ✅ Автоматически обновляется при изменении исходных данных.
⚠️ Внимание: Некоторые надстройки конфликтуют с защищёнными книгами или файлами, открытыми в режиме совместимости. Перед установкой сохраните резервную копию документа.

4. Формулы без VBA: комбинация TEXT и ПОДСТАВИТЬ

Для пользователей, у которых отключены макросы или нет возможности устанавливать надстройки, подойдёт комбинация стандартных функций. Этот метод менее гибкий, но работает в любой версии Excel.

Пример формулы для числа в ячейке A1 (до 999 999 рублей):

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

ТЕКСТ(ЦЕЛОЕ(A1);"[$-419]0") & " " &

ВЫБРАТЬ(ОСТАТ(ЦЕЛОЕ(A1);100);

"рубль";"рубля";"рубля";"рубля";"рублей";"рублей";"рублей";"рублей";"рублей";"рублей") &

ЕСЛИ(ОСТАТ(A1;1)*100>0;

" " & ТЕКСТ(ОКРУГЛ(ОСТАТ(A1;1)*100;0);"00") & " копеек";""))

Ограничения метода:

  • 🔢 Работает только с числами до 1 миллиона.
  • 📉 Не корректно склоняет все числительные (например, "один рубль" будет выведен как "1 рубль").
  • 🔄 Требует ручной настройки для каждого диапазона (тысячи, миллионы и т.д.).
  • Для улучшения результата можно создать вспомогательную таблицу со словами ("один", "два", ..., "девятьсот") и использовать ПОИСКПОЗ() + ИНДЕКС() для подстановки.

    Пример вспомогательной таблицы для числительных

    Создайте на отдельном листе таблицу с двумя столбцами: в первом — числа (1, 2, ..., 999), во втором — их текстовые эквиваленты ("один", "два", ..., "девятьсот девяносто девять"). Затем используйте формулу:

    =ИНДЕКС(Лист2!$B$1:$B$999; ПОИСКПОЗ(ЦЕЛОЕ(A1); Лист2!$A$1:$A$999; 0)) & " рублей"

    5. Power Query: преобразование для больших массивов данных

    Если вам нужно преобразовать тысячи строк (например, в выгрузке банковских платежей), удобнее использовать Power Query. Этот инструмент позволяет создать один раз шаблон преобразования и применять его к новым данным автоматически.

    Алгоритм действий:

    1. Выделите исходную таблицу и нажмите Данные → Из таблицы/диапазонаExcel 2016+).
    2. В редакторе Power Query добавьте пользовательский столбец с формулой на языке M:
      (Number) =>
      

      let

      Rubles = Number.IntegerDivide(Number, 1),

      Kop = Number.Mod(Number, 1) * 100,

      TextRub = if Rubles = 0 then "ноль" else

      List.FirstN(

      {

      "", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять",

      "десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать",

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

      },

      if Rubles < 21 then Rubles + 1 else 1

      ) & " рублей",

      TextKop = if Kop = 0 then "" else

      Number.ToText(Kop, "00") & " копеек"

      in

      TextRub & TextKop

    3. Замените Number.ToText(Kop, "00") на полноценную функцию преобразования, если нужна пропись для копеек.
    4. Нажмите Закрыть и загрузить, чтобы вернуть данные в Excel.

Преимущества Power Query:

  • 🔄 Обрабатывает миллионы строк без замедления.
  • 🔗 Легко обновляется при изменении исходных данных (Данные → Обновить все).
  • 📊 Поддерживает сложные преобразования (например, добавление валюты или форматирование).
⚠️ Внимание: В бесплатной версии Excel 2016 и старше Power Query называется Power Query для Excel и требует отдельной установки с сайта Microsoft.

Сравнение методов: какой выбрать?

Чтобы помочь вам определиться, мы составили таблицу с плюсами и минусами каждого способа:

Метод Сложность Макс. число Склонение Требует макросов Подходит для
BAHTTEXT 999 трлн ❌ (английский) Англоязычные документы
VBA (SumProp) ⭐⭐ 999 трлн ✅ (руб./коп.) Бухгалтерия, акты, счета
Надстройка 999 трлн Пользователи без навыков VBA
Формулы TEXT+ПОДСТАВИТЬ ⭐⭐⭐ 1 млн ⚠️ (частично) Простые задачи, небольшие таблицы
Power Query ⭐⭐⭐ 999 трлн ⚠️ (требует доработки) Большие массивы данных

Для 90% задач оптимальным решением будет пользовательская функция на VBA (SumProp). Она сочетает гибкость, точность склонений и поддержку больших чисел. Если макросы отключены по политике безопасности компании, используйте надстройку или Power Query.

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

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

  • 💥 Ошибка #ИМЯ? — возникает, если название функции написано с ошибкой или не подключена надстройка. Проверьте регистр и наличие макросов в файле (.xlsm).
  • 🔄 Неправильное склонение — например, "1 рублей" вместо "1 рубль". Это исправляется доработкой функции VBA (см. блок Select Case в коде).
  • 📉 Округление копеек — если в ячейке 123,456, а нужно 123,46, используйте =ОКРУГЛ(A1; 2) перед преобразованием.
  • 🌍 Неправильная валюта — при использовании BAHTTEXT не забывайте заменять "baht" на "рубль" с помощью ПОДСТАВИТЬ.
  • Чтобы проверить корректность работы функции, протестируйте её на крайних значениях:

    0 → "ноль рублей"
    

    1 → "один рубль"

    2 → "два рубля"

    5 → "пять рублей"

    11 → "одиннадцать рублей"

    100 → "сто рублей"

    101 → "сто один рубль"

    1000,99 → "одна тысяча рублей 99 копеек"

    FAQ: Ответы на частые вопросы

    Можно ли сделать сумму прописью без VBA и надстроек?

    Да, но с ограничениями. Используйте комбинацию функций ТЕКСТ, ПОДСТАВИТЬ и ВЫБРАТЬ, как показано в разделе 4. Однако этот метод не обрабатывает числа больше 1 миллиона и может неправильно склонять некоторые числительные.

    Почему функция возвращает "ноль рублей" для пустой ячейки?

    Это стандартное поведение. Чтобы избежать этого, модифицируйте функцию VBA, добавив проверку:

    If IsEmpty(MyNumber) Or MyNumber = 0 Then
    

    SumProp = ""

    Exit Function

    End If

    или используйте в формуле =ЕСЛИ(A1=""; ""; SumProp(A1)).

    Как адаптировать функцию для долларов или евро?

    В функции SumProp замените блоки Select Case для рублей и копеек на аналогичные для другой валюты. Например, для долларов:

    Select Case Rub
    

    Case "one dollar": Rub = "one dollar"

    Case Else: Rub = Rub & " dollars"

    End Select

    и добавьте обработку центов (cents).

    Можно ли использовать эту функцию в Google Таблицах?

    В Google Sheets нет встроенной функции для суммы прописью, но вы можете:

    1. Использовать надстройки из маркетплейса (например, "Number to Words").
    2. Написать собственную функцию на Google Apps Script (аналог VBA).
    3. Экспортировать данные в Excel, обработать их и импортировать обратно.

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

    Все предложенные методы (кроме статичных формул) обновляются автоматически:

    • Функция VBA пересчитывается при изменении исходных данных.
    • Надстройка обновляется вместе с таблицей.
    • В Power Query нажмите Данные → Обновить все.

    Если автоматическое обновление не работает, проверьте настройки вычислений: Формулы → Параметры вычислений → Автоматически.