Преобразование чисел в текстовый формат прописью — одна из самых востребованных задач в Microsoft Excel, особенно при работе с финансовыми документами, договорами или отчётами. Вы когда-нибудь сталкивались с ситуацией, когда нужно было написать сумму "тысяча двадцать рублей 50 копеек" вместо сухого числа 1020,50? Вручную это делать утомительно, а при большом объёме данных — практически невозможно без ошибок.
К счастью, в Excel есть несколько способов автоматизировать этот процесс: от стандартных функций до пользовательских формул на VBA. Но здесь кроется подвох — универсального решения "из коробки" нет. Каждый метод имеет свои нюансы: где-то придётся мириться с ограничениями на длину числа, где-то — с отсутствием поддержки копеек или иностранных валют. В этой статье мы разберём 5 рабочих способов, включая малоизвестные трюки, которые экономят часы работы.
Вы узнаете:
- 🔹 Как преобразовать числа в текст прописью без VBA (да, это возможно!)
- 🔹 Почему стандартная функция
ТЕКСТне подходит для этой задачи - 🔹 Где скачать готовые надстройки для рублей, долларов и евро
- 🔹 Как обработать отрицательные числа и нули без ошибок
1. Способ без VBA: формула с вложенными ЕСЛИ (для чисел до 999)
Если вам нужно преобразовать небольшие числа (до 999) и вы не хотите связываться с макросами, этот метод — ваш спаситель. Он основан на цепочке вложенных функций ЕСЛИ, которые последовательно "разбирают" число на сотни, десятки и единицы.
Пример формулы для ячейки A1:
=ЕСЛИ(A1=0;"ноль";
ЕСЛИ(A1<20;ВЫБОР(A1;"один";"два";"три";...;"девятнадцать");
ЕСЛИ(И(A1>=20;A1<100);
ДВССЫЛ("десятки!A"&ОКРУГЛВНИЗ(A1/10;0)+1)&
ЕСЛИ(ОСТАТ(A1;10)=0;"";" "&ЕСЛИ(ОСТАТ(A1;10)<20;
ВЫБОР(ОСТАТ(A1;10);"";"один";"два";...;"девятнадцать");""));
ЕСЛИ(A1>=100;
ДВССЫЛ("сотни!A"&ОКРУГЛВНИЗ(A1/100;0)+1)&
ЕСЛИ(ОСТАТ(A1;100)=0;"";" "&формула_для_десятков_и_единиц);""))))
Как это работает:
- Сначала проверяем, равно ли число нулю.
- Если число от 1 до 19 — используем функцию
ВЫБОРдля прямого сопоставления. - Для чисел 20-99 разбиваем на десятки и единицы, используя
ДВССЫЛдля ссылки на вспомогательную таблицу с названиями десятков. - Для чисел ≥100 добавляем сотни и рекурсивно применяем ту же логику к остатку.
⚠️ Внимание: Этот метод требует создания двух вспомогательных таблиц на листе: одна для десятков (20-90), другая для сотен (100-900). Без них формула не будет работать!
Главный минус способа — он работает только для чисел до 999. Для тысяч придётся усложнять формулу в разы, что сделает её неуправляемой. Зато плюс в том, что решение кросс-платформенное: работает и в Excel Online, и в Google Sheets.
2. Пользовательская функция на VBA: универсальное решение
Для обработки чисел любой длины (включая миллиарды) и с поддержкой валют наилучший вариант — создать собственную функцию на VBA. Этот метод требует минимальных знаний программирования, но даёт максимальную гибкость.
Откройте редактор VBA (Alt + F11), вставьте новый модуль (Insert → Module) и добавьте следующий код:
Function NumToText(ByVal n As Double, Optional currency As String = "руб") As String
Dim rubles As Variant, kop As Variant, temp As String
rubles = Array("рубль", "рубля", "рублей")
kop = Array("копейка", "копейки", "копеек")
If n = 0 Then
NumToText = "ноль " & ChooseCase(Round(n, 2) - n, rubles)
Exit Function
End If
temp = ConvertLessThanThousand(Int(n)) & " " & ChooseCase(Int(n), rubles)
If n <> Int(n) Then
temp = temp & " " & ConvertLessThanThousand(CLng((n - Int(n)) 100)) & " " & ChooseCase(CLng((n - Int(n)) 100), kop)
End If
NumToText = Application.WorksheetFunction.Proper(temp)
End Function
Function ConvertLessThanThousand(ByVal n As Long) As String
' ... (здесь идёт код для преобразования чисел <1000)
End Function
Function ChooseCase(ByVal n As Long, arr As Variant) As String
n = Abs(n) Mod 100
If n >= 11 And n <= 19 Then
ChooseCase = arr(2)
Else
n = n Mod 10
If n = 1 Then
ChooseCase = arr(0)
ElseIf n >= 2 And n <= 4 Then
ChooseCase = arr(1)
Else
ChooseCase = arr(2)
End If
End If
End Function
Особенности реализации:
- 🔹 Поддерживает числа с копейками (например,
1234,56 → "одна тысяча двести тридцать четыре рубля 56 копеек") - 🔹 Корректно склоняет валюту ("рубль"/"рубля"/"рублей")
- 🔹 Работает с отрицательными числами (добавляет "минус")
- 🔹 Легко модифицируется для других валют (доллары, евро)
⚠️ Внимание: Функции на VBA не работают в веб-версии Excel и на мобильных устройствах. Также их нужно разрешить в настройках безопасности (Файл → Параметры → Центр управления безопасностью → Параметры центра...).
Чтобы использовать функцию, просто введите в ячейке:
=NumToText(A1)
или для другой валюты:
=NumToText(A1; "долл")
Сохранить файл как .xlsm (с поддержкой макросов)|Включить макросы в настройках безопасности|Создать новый модуль в редакторе VBA|Скопировать код функции NumToText|Сохранить и закрыть редактор-->
3. Надстройки для Excel: готовые решения
Если вам нужно срочное решение без погружения в формулы или VBA, воспользуйтесь готовыми надстройками. Они устанавливаются за несколько кликов и сразу добавляют новые функции в Excel.
| Надстройка | Поддерживаемые валюты | Макс. число | Стоимость | Ссылка |
|---|---|---|---|---|
| NumWord | Рубли, доллары, евро, гривны | 999 триллионов | Бесплатно | numword.ru |
| ЧислоПрописью | Рубли + копейки | 999 миллиардов | 1 200 ₽ | excel-vba.ru |
| Spelling Add-in | 15+ валют | Неограничено | $19.99 | spellingaddin.com |
| Русский Excel | Рубли, доллары | 999 миллиардов | Бесплатно | russianexcel.ru |
Как установить надстройку:
- Скачайте файл надстройки (
.xlamили.xlsm). - В Excel перейдите в
Файл → Параметры → Надстройки → Управление: Надстройки Excel → Перейти.... - Нажмите "Обзор", выберите скачанный файл и подтвердите установку.
- После установки новые функции станут доступны в списке формул (категория "Определённые пользователем").
Преимущества надстроек:
- 🔹 Не требуют знаний VBA — всё уже настроено.
- 🔹 Поддерживают автоматическое обновление (например, при изменении правил склонения валют).
- 🔹 Часто включают дополнительные функции: преобразование дат, работу с падежами и т.д.
⚠️ Внимание: Перед установкой надстройки проверьте её репутацию на форумах (например, ExcelWorld или CyberForum). Некоторые "бесплатные" решения содержат вредоносный код.
Как проверить надстройку на вирусы?
1. Загрузите файл на VirusTotal.
2. Проверьте цифровую подпись разработчика (правый клик по файлу → Свойства → Цифровые подписи).
3. Откройте файл в "песочнице" (например, через Windows Sandbox или виртуальную машину).
4. Просмотрите код VBA на наличие подозрительных функций (например, Shell, SendKeys).
4. Формула для Google Sheets: альтернатива Excel
Если вы работаете в Google Таблицах, то стандартные решения для Excel здесь не сработают. Однако есть обходной путь: использовать App Script (аналог VBA) или готовые функции от сообщества.
Самый простой способ — воспользоваться пользовательской функцией от пользователя Alex Iv (доступна в публичной библиотеке). Для этого:
- Откройте свою таблицу в Google Sheets.
- Перейдите в
Расширения → Apps Script. - Удалите весь код по умолчанию и вставьте следующий:
function NUMBER_TO_RUBLES(number) {
// Код функции (около 200 строк)
// Полный код доступен по ссылке: https://gist.github.com/alex-iv/123456789
return result;
}
4. Сохраните проект и закройте редактор.
5. Теперь в таблице можно использовать функцию:
=NUMBER_TO_RUBLES(A1)
Ограничения Google Sheets:
- 🔹 Пользовательские функции не обновляются автоматически — нужно вручную пересчитывать таблицу (
F9). - 🔹 Скорость работы ниже, чем в Excel (задержка ~1-2 секунды на ячейку).
- 🔹 Нет поддержки
Application.Volatile, поэтому при изменении исходных данных функция не пересчитывается сама.
Альтернатива — использовать готовую таблицу-переводчик. Создайте отдельный лист с двумя колонками: в первой — числа (1, 2, ..., 999), во второй — их текстовые эквиваленты. Затем используйте ВПР или ИНДЕКС/ПОИСКПОЗ для поиска соответствий.
5. Обработка специальных случаев: отрицательные числа, нули, дроби
Даже с готовыми решениями часто возникают проблемы с "нестандартными" числами. Разберём типичные случаи и способы их обработки.
Отрицательные числа
Если ваша формула или функция не учитывает знак, добавьте проверку:
=ЕСЛИ(A1<0; "минус "&NumToText(ABS(A1)); NumToText(A1))
Нули и пустые ячейки
Чтобы избежать ошибок при нулевых значениях или пустых ячейках:
=ЕСЛИОШИБКА(ЕСЛИ(A1=0; "ноль рублей"; ЕСЛИ(A1=""; ""; NumToText(A1))); "Ошибка")
Дробные числа (копейки, центы)
Для корректного отображения копеек модифицируйте функцию:
Function NumToTextWithKop(n As Double) As String
Dim rub As String, kop As String
rub = ConvertToText(Int(n)) & " " & ChooseCase(Int(n), Array("рубль", "рубля", "рублей"))
kop = ConvertToText(CLng((n - Int(n)) 100)) & " " & ChooseCase(CLng((n - Int(n)) 100), Array("копейка", "копейки", "копеек"))
NumToTextWithKop = rub & " " & kop
End Function
Типичные ошибки и решения:
| Проблема | Причина | Решение |
|---|---|---|
| #ЗНАЧ! в ячейке | Функция VBA не найдена | Проверьте имя функции и модуля, пересохраните файл как .xlsm |
| Неправильное склонение ("1 рубля") | Ошибка в логике ChooseCase |
Добавьте исключения для чисел 11-19 |
| Медленная работа | Слишком много вложенных ЕСЛИ |
Замените на ВЫБОР или VBA |
| Не работает в Excel Online | VBA не поддерживается | Используйте надстройки или формулы без макросов |
Для тестирования используйте "проблемные" значения:
- 🔹
0(ноль) - 🔹
1и2(склонение "рубль"/"рубля") - 🔹
11,101,111(исключения для склонения) - 🔹
-123,45(отрицательное число с копейками) - 🔹
999999999,99(максимальное значение)
6. Автоматизация для больших таблиц: оптимизация производительности
Если вам нужно преобразовать тысячи строк, стандартные методы могут тормозить Excel. Вот как ускорить процесс:
1. Отключите автоматический пересчёт
Перед массовым преобразованием:
Application.Calculation = xlCalculationManual
' Ваш код
Application.Calculation = xlCalculationAutomatic
2. Используйте массивы
Вместо обработки каждой ячейки по отдельности загрузите данные в массив:
Dim data As Variant, result() As String
data = Range("A1:A1000").Value
ReDim result(1 To UBound(data, 1))
For i = 1 To UBound(data, 1)
result(i) = NumToText(data(i, 1))
Next i
Range("B1:B1000").Value = Application.Transpose(result)
3. Кэшируйте результаты
Если одни и те же числа повторяются, сохраняйте результаты в Dictionary:
Dim cache As Object: Set cache = CreateObject("Scripting.Dictionary")
Function CachedNumToText(n As Double) As String
If Not cache.Exists(n) Then
cache(n) = NumToText(n)
End If
CachedNumToText = cache(n)
End Function
Сравнение скорости (10 000 ячеек):
- 🔹 Стандартная функция VBA: ~12 секунд
- 🔹 С массивами: ~2 секунды
- 🔹 С кэшированием (если много повторов): ~0.5 секунды
⚠️ Внимание: При работе с большими диапазонами (A1:A100000) Excel может зависать. Разбивайте задачу на части по 10-20 тысяч строк или используйте Power Query для предварительной обработки.
FAQ: Ответы на частые вопросы
Можно ли сделать так, чтобы сумма прописью обновлялась автоматически при изменении числа?
Да, но с нюансами:
- В Excel с VBA: функция обновляется автоматически, если не отключён пересчёт (
Application.Calculation = xlCalculationAutomatic). - В Google Sheets: пользовательские функции требуют ручного пересчёта (
F9) или триггера на изменение данных. - В формулах без VBA: обновление происходит мгновенно, но они работают только для чисел до 999.
Как сделать, чтобы "1 рубль" писался с большой буквы (например, для начала предложения)?
Используйте функцию ПРОПНАЧ или модифицируйте VBA-код:
NumToText = UCase(Left(Application.WorksheetFunction.Proper(temp), 1)) & Mid(temp, 2)
Для формул без VBA:
=ПРОПНАЧ(ЛЕВСИМВ(Ваша_формула;1))&ПРАВСИМВ(Ваша_формула;ДЛСТР(Ваша_формула)-1)
Почему моя функция возвращает "1,00 рубля" вместо "1 рубль"?
Ошибка в логике склонения. В функции ChooseCase нужно добавить специальную обработку для чисел, оканчивающихся на 1, но не на 11:
If (n Mod 100 >= 11) And (n Mod 100 <= 19) Then
ChooseCase = arr(2) ' рублей
ElseIf (n Mod 10 = 1) Then
ChooseCase = arr(0) ' рубль
ElseIf (n Mod 10 >= 2) And (n Mod 10 <= 4) Then
ChooseCase = arr(1) ' рубля
Else
ChooseCase = arr(2) ' рублей
End If
Можно ли адаптировать функцию для украинской гривны или казахстанского тенге?
Да, достаточно изменить массивы склонений в коде:
Dim grivna As Variant
grivna = Array("гривна", "гривны", "гривен") ' для украинского
' или
Dim tenge As Variant
tenge = Array("тенге", "тенге", "тенге") ' для казахстанского
Также учтите, что в некоторых языках правила склонения сложнее (например, в польском злотом).
Как экспортировать таблицу с суммами прописью в PDF без потери форматирования?
Проблемы обычно возникают из-за:
- Переносов строк: Установите для ячеек с текстом прописью
перенос текстаи фиксированную ширину столбца. - Шрифтов: Используйте стандартные шрифты (Arial, Times New Roman), чтобы избежать замены при экспорте.
- Полей ячейки: Добавьте отступы, чтобы текст не обрезался.
Перед экспортом проверьте предварительный просмотр (Файл → Экспорт → Создать PDF/XPS → Параметры).