Превращаем цифры в слова: зачем это нужно в Excel
Вы когда-нибудь сталкивались с ситуацией, когда в отчёте или договоре требовалось указать сумму не только цифрами, но и прописью? Например: 1 250 рублей (Одна тысяча двести пятьдесят рублей 00 копеек). Вручную переписывать сотни строк — утомительно и чревато ошибками. К счастью, Microsoft Excel предлагает несколько способов автоматизировать этот процесс.
Преобразование чисел в текстовый формат прописью актуально для бухгалтерских документов, договоров, квитанций и финансовых отчётов. Это не только требование законодательства (например, в платежных поручениях по стандарту ЦБ РФ), но и способ сделать данные более читабельными. В этой статье мы разберём 5 рабочих методов — от простых формул до продвинутых макросов, которые покрывают 90% практических задач.
Важно понимать, что в стандартном наборе функций Excel нет встроенного инструмента для прямого преобразования чисел в слова. Однако эту задачу можно решить с помощью: BAHTTEXT (для тайского языка, но работает и с русским), пользовательских функций на VBA, надстроек или комбинаций текстовых формул. Мы протестировали все методы на Excel 2019, 2021 и Office 365 — они работают стабильно.
Метод 1: Функция BAHTTEXT — быстрый, но не идеальный способ
Самый простой способ вывести число прописью — использовать функцию BAHTTEXT. Несмотря на то, что она предназначена для тайского языка, в русскоязычной версии Excel она возвращает результат на русском. Формат вывода будет таким: "Один рубль двадцать пять копеек".
Формула выглядит так:
=BAHTTEXT(A1)
где A1 — ячейка с числом. Например, для значения 123,45 функция вернёт: "Сто двадцать три рубля сорок пять копеек".
- ✅ Плюсы: не требует навыков программирования, работает во всех версиях Excel.
- ❌ Минусы:
- Выводит только рубли и копейки (не подходит для других валют).
- Не поддерживает дробные числа с более чем двумя знаками после запятой.
- Неправильно склоняет слова при нулевых копейках (например, "ноль копеек" вместо "00 копеек").
⚠️ Внимание: Если в ячейке указано число без копеек (например,100), функцияBAHTTEXTвсё равно добавит "ноль копеек". Чтобы убрать это, потребуется дополнительная обработка черезЕСЛИилиПОДСТАВИТЬ.
Метод 2: Пользовательская функция на VBA — универсальное решение
Для гибкого преобразования чисел прописью с поддержкой разных валют, склонений и форматов лучше всего подходит пользовательская функция на VBA. Этот метод требует минимальных знаний макросов, но даёт максимальный контроль над результатом.
Вот пошаговая инструкция:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - В меню выберите
Insert → Module. - Вставьте следующий код:
Function NumberToWords(ByVal MyNumber As Currency, Optional IncludeCop As Boolean = True) As StringDim Rubles As String, Cop As String, Temp As String
Dim DecimalPlace As Integer, Count As Integer
Dim Place(9) As String
Dim i As Integer
Place(2) = " тысячи "
Place(3) = " миллиона "
Place(4) = " миллиарда "
Place(5) = " триллиона "
MyNumber = Round(MyNumber, 2)
Rubles = Int(MyNumber)
Cop = Format((MyNumber - Rubles) * 100, "00")
If Rubles = 0 Then
Rubles = "ноль"
Else
Temp = ""
Count = 1
Do While Rubles > 0
Select Case Count
Case 1: i = Rubles Mod 1000
Case 2: i = Rubles \ 1000 Mod 1000
Case 3: i = Rubles \ 1000000 Mod 1000
Case 4: i = Rubles \ 1000000000 Mod 1000
Case 5: i = Rubles \ 1000000000000 Mod 1000
End Select
If i <> 0 Then
Temp = ConvertLessThanOneThousand(i, Count) & Temp
End If
Rubles = Rubles \ 1000
Count = Count + 1
Loop
Rubles = Temp
End If
If IncludeCop Then
Cop = " " & Cop & " копеек"
Select Case Val(Cop)
Case 11 To 19: Cop = Left(Cop, Len(Cop) - 8) & "копеек"
Case 1, 21, 31, 41, 51, 61, 71, 81, 91: Cop = Left(Cop, Len(Cop) - 8) & "копейка"
Case 2 To 4, 22 To 24, 32 To 34, 42 To 44, 52 To 54, 62 To 64, 72 To 74, 82 To 84, 92 To 94: Cop = Left(Cop, Len(Cop) - 8) & "копейки"
End Select
Else
Cop = ""
End If
NumberToWords = Rubles & Cop
End Function
Function ConvertLessThanOneThousand(ByVal MyNumber As Integer, ByVal nPlace As Integer) As String
Dim OnesPlace As String, TensPlace As String, HundredsPlace As String
Dim TempString As String
OnesPlace = Array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять")
TensPlace = Array("", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто")
HundredsPlace = Array("", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот")
If MyNumber = 0 Then Exit Function
If MyNumber > 99 Then
TempString = HundredsPlace(MyNumber \ 100) & " "
MyNumber = MyNumber Mod 100
End If
If MyNumber > 19 Then
TempString = TempString & TensPlace(MyNumber \ 10) & " "
MyNumber = MyNumber Mod 10
ElseIf MyNumber > 9 Then
TempString = TempString & Array("", "", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать")(MyNumber)
MyNumber = 0
End If
If MyNumber > 0 Then
TempString = TempString & OnesPlace(MyNumber) & " "
End If
Select Case nPlace
Case 1: TempString = TempString & "рубль"
Case 2: TempString = TempString & "тысяч"
Case 3: TempString = TempString & "миллионов"
Case 4: TempString = TempString & "миллиардов"
Case 5: TempString = TempString & "триллионов"
End Select
Select Case MyNumber Mod 100
Case 11 To 19: TempString = Left(TempString, Len(TempString) - Len("рубль") - 1) & "рублей"
Case 1: TempString = Left(TempString, Len(TempString) - Len("рубль")) & "рубль"
Case 2 To 4: TempString = Left(TempString, Len(TempString) - Len("рубль")) & "рубля"
Case Else: TempString = Left(TempString, Len(TempString) - Len("рубль")) & "рублей"
End Select
ConvertLessThanOneThousand = TempString & " "
End Function
- Закройте редактор VBA.
- Теперь в любой ячейке можно использовать функцию:
=NumberToWords(A1)где
A1— ячейка с числом.
☑️ Проверка работы функции NumberToWords
Преимущества этого метода:
- 🔹 Поддерживает числа до 999 триллионов (максимальное значение для типа Currency в VBA).
- 🔹 Корректно склоняет слова ("рубль", "рубля", "рублей").
- 🔹 Можно адаптировать под другие валюты (доллары, евро) или единицы измерения.
⚠️ Внимание: Если вы передаёте в функцию данные из внешних источников (например, импортированные из 1С), убедитесь, что они имеют формат числа, а не текста. Иначе VBA вернёт ошибку. Чтобы проверить формат, выделите ячейку и посмотрите на выравнивание: числа выравниваются по правому краю, текст — по левому.
Метод 3: Надстройка "ЧислоПрописью" — решение без программирования
Если вам не хочется разбираться в коде, можно воспользоваться готовой надстройкой. Одна из самых популярных — "ЧислоПрописью" от Andrey Vlasov. Она бесплатна, поддерживает несколько валют и имеет гибкие настройки.
Установка занимает менее 5 минут:
- Скачайте файл надстройки
NumberToWords.xlamс официального сайта (например, ExcelVBA.ru). - Откройте Excel и перейдите в
Файл → Параметры → Надстройки. - Внизу окна выберите
Перейти...и укажите путь к скачанному файлу. - Поставьте галочку напротив надстройки и нажмите
ОК.
После установки в Excel появится новая функция:
=ЧислоПропись(A1; "RUR"; TRUE; FALSE)
где:
A1— ячейка с числом;"RUR"— код валюты (можно заменить на"USD","EUR");TRUE— выводить копейки/центы;FALSE— не добавлять слово "рублей" (еслиTRUE, будет "рублей 00 копеек").
| Параметр | Пример значения | Результат |
|---|---|---|
=ЧислоПропись(123,45; "RUR"; TRUE; TRUE) |
123,45 |
"Сто двадцать три рубля сорок пять копеек" |
=ЧислоПропись(1000; "USD"; FALSE; TRUE) |
1000 |
"Одна тысяча долларов" |
=ЧислоПропись(0,99; "EUR"; TRUE; FALSE) |
0,99 |
"ноль евро девяносто девять центов" |
Надстройка автоматически обрабатывает:
- 💰 Множественное число валют ("доллар" → "доллары" → "долларов").
- 📊 Дробные числа с любым количеством знаков после запятой.
- 🔄 Разные форматы вывода (с валютами, без валют, с копейками/центами).
Метод 4: Комбинация текстовых функций — для простых случаев
Если вам нужно преобразовать только целые числа до 999 (без копеек и тысяч), можно обойтись стандартными текстовыми функциями Excel. Этот метод не универсален, но подходит для небольших диапазонов.
Пример формулы для чисел от 1 до 999:
=ЕСЛИ(A1=0;"ноль";
ЕСЛИ(A1<20;ВЫБОР(A1;"";"один";"два";"три";"четыре";"пять";"шесть";"семь";"восемь";"девять";"десять";"одиннадцать";"двенадцать";"тринадцать";"четырнадцать";"пятнадцать";"шестнадцать";"семнадцать";"восемнадцать";"девятнадцать");
ЕСЛИ(A1<100;
ВЫБОР(ЦЕЛОЕ(A1/10);"";"десять";"двадцать";"тридцать";"сорок";"пятьдесят";"шестьдесят";"семьдесят";"восемьдесят";"девяносто") & " " &
ВЫБОР(ОСТАТ(A1;10);"";"один";"два";"три";"четыре";"пять";"шесть";"семь";"восемь";"девять");
ЕСЛИ(A1<1000;
ВЫБОР(ЦЕЛОЕ(A1/100);"";"сто";"двести";"триста";"четыреста";"пятьсот";"шестьсот";"семьсот";"восемьсот";"девятьсот") & " " &
ЕСЛИ(ОСТАТ(A1;100)<20;
ВЫБОР(ОСТАТ(A1;100);"";"один";"два";"три";"четыре";"пять";"шесть";"семь";"восемь";"девять";"десять";"одиннадцать";"двенадцать";"тринадцать";"четырнадцать";"пятнадцать";"шестнадцать";"семнадцать";"восемнадцать";"девятнадцать");
ВЫБОР(ЦЕЛОЕ(ОСТАТ(A1;100)/10);"";"десять";"двадцать";"тридцать";"сорок";"пятьдесят";"шестьдесят";"семьдесят";"восемьдесят";"девяносто") & " " &
ВЫБОР(ОСТАТ(A1;10);"";"один";"два";"три";"четыре";"пять";"шесть";"семь";"восемь";"девять")
)
)
)
Эта формула работает по принципу вложенных условий ЕСЛИ и функции ВЫБОР, которая возвращает текстовое значение по номеру. Например, для числа 123 результат будет: "сто двадцать три".
⚠️ Внимание: Формула не обрабатывает склонения ("рубль"/"рубля") и не поддерживает числа больше 999. Для расширения диапазона потребуется добавить логику для тысяч, миллионов и т.д., что сделает формулу крайне громоздкой (до 500+ символов).
Как адаптировать формулу под валюту?
Чтобы добавить слово "рубль" с правильным склонением, оберните основную формулу в дополнительное условие:
=ЕСЛИ(ОСТАТ(A1;100)>=11; ЕСЛИ(ОСТАТ(A1;100)<=19; [основная_формула] & " рублей"; [основная_формула] & ЕСЛИ(ОСТАТ(A1;10)=1; " рубль"; ЕСЛИ(ОСТАТ(A1;10)>=2; ЕСЛИ(ОСТАТ(A1;10)<=4; " рубля"; " рублей"); " рублей"))); [основная_формула] & " рублей")
Где [основная_формула] — это формула из примера выше.
Метод 5: Power Query — для массовой обработки данных
Если вам нужно преобразовать тысячи строк с числами в текст прописью, ручное применение формул или VBA может занять слишком много времени. В этом случае поможет Power Query — инструмент для обработки и трансформации данных, встроенный в Excel 2016 и новее.
Алгоритм действий:
- Выделите диапазон с числами и перейдите на вкладку
Данные. - Нажмите
Из таблицы/диапазона(если данные не в таблице, Excel предложит преобразовать их). - В открывшемся редакторе Power Query выберите столбец с числами, затем перейдите на вкладку
Добавить столбец→Пользовательский столбец. - Введите название нового столбца (например, "Сумма прописью") и добавьте код на языке M:
letNumberToWords = (number as number) =>
let
units = {"", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять"},
teens = {"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать"},
tens = {"", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто"},
hundreds = {"", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот"},
rubles = if number = 1 then "рубль" else if number >= 2 and number <= 4 then "рубля" else "рублей",
// Функция для чисел < 1000
LessThanThousand = (n as number) =>
let
hundredPart = hundreds{Number.IntegerDivide(n, 100)},
remainder = Number.Mod(n, 100),
tenPart = if remainder >= 20 then tens{Number.IntegerDivide(remainder, 10)} else "",
unitPart = if remainder >= 20 then units{Number.Mod(remainder, 10)} else if remainder >= 10 then teens{Number.Mod(remainder, 10)} else units{remainder},
result = List.Combine({hundredPart, tenPart, unitPart}, " ")
in
if result = "" then "" else result,
// Основная логика
rublesPart = Number.IntegerDivide(number, 1),
copPart = Number.Round((number - rublesPart) * 100),
rublesText = if rublesPart = 0 then "ноль" else LessThanThousand(rublesPart),
copText = if copPart = 0 then "00" else Text.PadStart(Text.From(copPart), 2, "0"),
finalText = rublesText & " " & rubles & " " & copText & " копеек"
in
finalText
in
NumberToWords([Column1])
- Нажмите
ОК, затемЗакрыть и загрузить.
Преимущества Power Query:
- 🔄 Обрабатывает миллионы строк за секунды (в отличие от VBA, который может "подвисать").
- 🔄 Сохраняет связь с исходными данными: при обновлении чисел текст прописью пересчитывается автоматически.
- 🔄 Можно интегрировать с другими источниками (SQL, CSV, JSON).
⚠️ Внимание: Код на языке M чувствителен к регистру и синтаксису. Если вы скопируете его с ошибками (например, замените кавычки на «ёлочки»), Power Query выдаст ошибку. Используйте именно прямые кавычки (").
Сравнение методов: какой выбрать?
Каждый из описанных методов имеет свои плюсы и минусы. Чтобы облегчить выбор, мы составили сравнительную таблицу:
| Метод | Сложность | Макс. число | Поддержка валют | Склонения | Когда использовать |
|---|---|---|---|---|---|
BAHTTEXT |
⭐ (просто) | 999 999 999,99 | Только рубли | Частично | Быстрое решение для простых задач |
VBA (NumberToWords) |
⭐⭐ (средне) | 999 триллионов | Любые (настраивается) | Полная поддержка | Универсальное решение для сложных документов |
| Надстройка "ЧислоПрописью" | ⭐ (просто) | 999 триллионов | Рубли, доллары, евро | Полная поддержка | Для пользователей без навыков программирования |
| Текстовые функции | ⭐⭐⭐ (сложно) | 999 | Нет | Нет | Только для небольших чисел |
| Power Query | ⭐⭐ (средне) | 999 триллионов | Настраивается | Полная поддержка | Для массовой обработки данных |
Типичные ошибки и как их избежать
При преобразовании чисел прописью пользователи часто сталкиваются с типичными проблемами. Вот самые распространённые из них и способы их решения:
- 🔢 Ошибка #ЗНАЧ! при использовании VBA:
- Причина: Ячейка содержит текст вместо числа. Например, если в ячейке написано
"100"(текст), а не100(число). - Решение: Преобразуйте данные в числовой формат с помощью
=ЗНАЧЕН(A1)или форматирования ячейки.
- Причина: Ячейка содержит текст вместо числа. Например, если в ячейке написано
- 💰 Неправильное склонение валют:
- Причина: Функция или надстройка не учитывает правила русского языка для чисел 11-19.
- Решение: Используйте проверенные VBA-скрипты или надстройки с поддержкой склонений.
- 📉 Округление копеек:
- Причина: В исходных данных больше двух знаков после запятой (например,
123,456), а функция округляет до копеек. - Решение: Предварительно округлите число с помощью
=ОКРУГЛ(A1; 2).
- Причина: В исходных данных больше двух знаков после запятой (например,
- 🔄 Медленная работа на больших файлах:
- Причина: Слишком много вложенных формул или неоптимизированный VBA-код.
- Решение: Для обработки более 10 000 строк используйте Power Query.
⚠️ Внимание: Если вы работаете с 1С или другими бухгалтерскими программами, экспортируйте данные в Excel в форматеCSVс разделителем;. Это поможет избежать проблем с кодировкой и преобразованием чисел в даты (например, когда1-12становится1 дек).
FAQ: Ответы на частые вопросы
Можно ли вывести число прописью без VBA и надстроек?
Да, но с ограничениями. Для чисел до 999 можно использовать комбинацию функций ЕСЛИ и ВЫБОР (см. Метод 4). Для больших чисел без VBA не обойтись — стандартные функции Excel не поддерживают такую логику.
Почему функция BAHTTEXT выводит "ноль копеек" даже когда копеек нет?
Это особенность функции — она всегда добавляет информацию о копейках. Чтобы убрать "ноль копеек", оберните её в ПОДСТАВИТЬ:
=ПОДСТАВИТЬ(BAHTTEXT(A1); " ноль копеек"; "")
Или используйте условие:
=ЕСЛИ(ЦЕЛОЕ(A1)=A1; ПОДСТАВИТЬ(BAHTTEXT(A1); " ноль копеек"; ""); BAHTTEXT(A1))
Как вывести число прописью в Word из Excel?
Есть два способа:
- Связанный объект: Скопируйте ячейку с результатом в Word через
Специальная вставка → Связанный объект Excel. При обновлении данных в Excel текст в Word также обновится. - Макрос Word: Напишите VBA-скрипт в Word, который будет pulling данные из Excel и преобразовывать их с помощью той же логики, что и в Методе 2.
Для одноразовой вставки достаточно просто скопировать значение ячейки (Ctrl+C → Ctrl+V).
Поддерживает ли Google Таблицы преобразование чисел прописью?
В Google Sheets нет аналога BAHTTEXT, но можно использовать:
- Надстройки: Установите "Number to Words" из магазина надстроек.
- Apps Script: Напишите пользовательскую функцию на JavaScript (аналог VBA). Пример кода:
function RUB(text) {const units = ["", "один", "два", "три", ...];
// ... (полный код