Как в Excel перевести цифры в текст прописью?

Как в Excel перевести цифры в текст прописью? - коротко

В Excel для преобразования цифр в русскую пропись используют пользовательскую функцию SpellNumber, которую добавляют через VBA и вызывают, например, как =SpellNumber(A1). При необходимости можно установить готовый ад‑ин, где такая функция уже реализована.

Как в Excel перевести цифры в текст прописью? - развернуто

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

Первый и самый распространённый метод — создание пользовательской функции на VBA. Откройте редактор макросов (клавиши Alt + F11), в проекте выберите любой модуль или создайте новый (в меню Insert → Module) и вставьте следующий код:

Function SpellNumber(ByVal MyNumber)
 Dim Units, Tens, Hundreds, TempStr
 Dim i, n, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10
 MyNumber = Trim(Str(MyNumber))
 If MyNumber = "" Then SpellNumber = "" : Exit Function
 If IsNumeric(MyNumber) = False Then SpellNumber = "Ошибка" : Exit Function
 MyNumber = Format(MyNumber, "0.00")
 n = Split(MyNumber, ".")
 Units = Array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять")
 Tens = Array("", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", _
 "шестьдесят", "семьдесят", "восемьдесят", "девяносто")
 Hundreds = Array("", "сто", "двести", "триста", "четыреста", "пятьсот", _
 "шестьсот", "семьсот", "восемьсот", "девятьсот")
 Dim Words
 Words = ""
 ' Обрабатываем целую часть
 n1 = Val(Left(n(0), Len(n(0)) - 3))
 n2 = Val(Mid(n(0), Len(n(0)) - 2, 1))
 n3 = Val(Mid(n(0), Len(n(0)) - 1, 1))
 n4 = Val(Right(n(0), 1))
 If n1 > 0 Then Words = Words & SpellNumber(n1) & " тысяч "
 If n2 > 0 Then Words = Words & Hundreds(n2) & " "
 If n3 > 1 Then Words = Words & Tens(n3) & " " & Units(n4)
 If n3 = 1 Then Words = Words & Array("десять", "одиннадцать", "двенадцать", _
 "тринадцать", "четырнадцать", "пятнадцать", _
 "шестнадцать", "семнадцать", "восемнадцать", _
 "девятнадцать")(n4)
 If n3 = 0 And n4 > 0 Then Words = Words & Units(n4)
 ' Добавляем слово «рубль» и его формы
 Words = Trim(Words) & " рубль"
 If Val(n(0)) Mod 10 = 2 Or Val(n(0)) Mod 10 = 3 Or Val(n(0)) Mod 10 = 4 Then
 Words = Replace(Words, "рубль", "рубля")
 ElseIf Val(n(0)) Mod 10 = 0 Or (Val(n(0)) Mod 10 >= 5 And Val(n(0)) Mod 10 <= 9) _
 Or (Val(n(0)) Mod 100 >= 11 And Val(n(0)) Mod 100 <= 14) Then
 Words = Replace(Words, "рубль", "рублей")
 End If
 ' Обрабатываем копейки
 If Val(n(1)) > 0 Then
 Words = Words & " " & SpellNumber(Val(n(1))) & " копеек"
 End If
 SpellNumber = Words
End Function

После закрытия редактора макросов функция будет доступна в листе как обычная формула. Чтобы получить словесное представление числа, достаточно написать, например:

=SpellNumber(A1)

где A1 — ячейка с числом 1234,56. Результатом будет строка «одна тысяча двести тридцать четыре рубля пятьдесят шесть копеек».

Если требуется вывод только целой части без валютных обозначений, достаточно убрать из кода блоки, связанные с «рубль» и «копейка», либо создать отдельную функцию, например SpellNumberOnly, где оставлен только основной алгоритм преобразования.

Второй способ — использовать готовый надстройку. На официальном сайте Microsoft Store и в популярных сторонних ресурсах можно найти бесплатные дополнения, такие как “Number to Words” или “Kutools for Excel”. После установки такие надстройки добавляют в ленту кнопку, которая преобразует выбранные ячейки в текст прописью за один клик. Преимущество готовых решений в том, что они поддерживают разные языки, учитывают падежи и умеют работать с большими числами без необходимости писать код.

Третий вариант — использовать Power Query. В редакторе запросов создайте новый запрос, импортируйте таблицу, затем добавьте пользовательскую функцию на M‑языке:

let
 NumberToWords = (n as number) as text =>
 let
 // Пример упрощённого преобразования только до миллионов
 units = {"", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять"},
 teens = {"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать"},
 tens = {"", "", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто"},
 hundreds = {"", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот"},
 h = Number.IntegerDivide(n, 100),
 t = Number.Mod(Number.IntegerDivide(n, 10), 10),
 u = Number.Mod(n, 10),
 result = 
 if n = 0 then "ноль"
 else Text.Combine(
 List.RemoveNulls({
 if h > 0 then hundreds{h} else null,
 if t = 1 then teens{u} else null,
 if t > 1 then tens{t} else null,
 if t <> 1 then units{u} else null
 }), " "
 )
 in
 result
in
 NumberToWords

После сохранения функции в запросе добавьте столбец =NumberToWords([YourNumberColumn]) и получите требуемый текст. Этот метод удобен, когда работа ведётся полностью в Power Query без доступа к VBA.

Независимо от выбранного подхода, важно помнить о некоторых нюансах:

  • В VBA‑функции следует включить обработку отрицательных чисел, если они могут появиться в данных. Для этого достаточно добавить проверку If MyNumber < 0 Then … и добавить слово «минус» перед результатом.
  • При работе с большими суммами (миллионы, миллиарды) код необходимо расширить, добавив массивы для «миллион», «миллиард» и соответствующие правила склонения.
  • Если в таблице присутствуют ячейки, содержащие текст, формула должна проверять тип данных, иначе возникнет ошибка выполнения. В VBA это делается через IsNumeric, а в Power Query Value.Is.

Таким образом, для получения чисел прописью в Excel достаточно выбрать один из перечисленных методов, внедрить его в свой файл и применять как обычную формулу. Выбор зависит от уровня доступа к макросам, необходимости поддержки разных валют и предпочтений в работе с надстройками или Power Query.