Как в 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.