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

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

  • в зависимости от того, на какую цифру заканчивается число, его падеж и число могут быть:
    • единственное, именительный (двадцать один рубль)
    • единственное, родительный (двадцать два/три/четыре рубля)
    • множественное, родительный (двадцать, двадцать пять/шесть/семь/восемь/девять рублей)
  • При этом даже из этого правила уже есть исключения — числа от 11 до 14 — множественного числа, хотя числа от 1 до 4 — единственного.
  • Ноль пишется цифрами, но не пишется прописью. Кроме случая с копейками — там он пишется в прописи, но цифрами.
  • При этом от нуля может зависеть то, как будет выглядеть число или сумма прописью.
  • Копейки женского рода, а рубли — мужского. Одна копейка, но один рубль.

И это далеко не все нюансы. Есть ли варианты, которые их все учитывают?

Сопоставление чисел и их эквивалентов прописью

Сумма прописью без применения VBA макросов и надстроек

Это звучит невероятно — такая формула существует. Но для того, чтобы она работала, необходимо создать в книге 10 именованных диапазонов со служебными данными. Функционал находится во вкладке «Формулы».

Как добавить именованные диапазоны в книгу

При создании диапазонов нужно изменять поля из таблицы внизу. Значения удобно копировать тройным кликом.

Имя Диапазон
n_1={«»;»одинz»;»дваz»;»триz»;»четыреz»;»пятьz»;»шестьz»;»семьz»;»восемьz»;»девятьz»}
n_2={«десятьz»;»одиннадцатьz»;»двенадцатьz»;»тринадцатьz»;»четырнадцатьz»;»пятнадцатьz»;»шестнадцатьz»;»семнадцатьz»;»восемнадцатьz»;»девятнадцатьz»}
n_3={«»:1:»двадцатьz»:»тридцатьz»:»сорокz»:»пятьдесятz»:»шестьдесятz»:»семьдесятz»:»восемьдесятz»:»девяностоz»}
n_4={«»;»стоz»;»двестиz»;»тристаz»;»четырестаz»;»пятьсотz»;»шестьсотz»;»семьсотz»;»восемьсотz»;»девятьсотz»}
n_5={«»;»однаz»;»двеz»;»триz»;»четыреz»;»пятьz»;»шестьz»;»семьz»;»восемьz»;»девятьz»}
n0=»000000000000″&ПСТР(1/2;2;1)&»00″
n0x=ЕСЛИ(n_3=1;n_2;n_3&n_1)
n1x=ЕСЛИ(n_3=1;n_2;n_3&n_1)
мил={0;»овz»:1;»z»:2;»аz»:5;»овz»}
тыс={0;»тысячz»:1;»тысячаz»:2;»тысячиz»:5;»тысячz»}

После добавления всех диапазонов окошко будет выглядеть так:

И наконец-то можно будет применить формулу ниже. В данном примере — к ячейке A1:

=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПРОПНАЧ(ИНДЕКС(n_4;ПСТР(ТЕКСТ(A1;n0);1;1)+1)&ИНДЕКС(n0x;ПСТР(ТЕКСТ(A1;n0);2;1)+1;ПСТР(ТЕКСТ(A1;n0);3;1)+1)&ЕСЛИ(-ПСТР(ТЕКСТ(A1;n0);1;3);"миллиард"&ВПР(ПСТР(ТЕКСТ(A1;n0);3;1)*И(ПСТР(ТЕКСТ(A1;n0);2;1)-1);мил;2);"")&ИНДЕКС(n_4;ПСТР(ТЕКСТ(A1;n0);4;1)+1)&ИНДЕКС(n0x;ПСТР(ТЕКСТ(A1;n0);5;1)+1;ПСТР(ТЕКСТ(A1;n0);6;1)+1)&ЕСЛИ(-ПСТР(ТЕКСТ(A1;n0);4;3);"миллион"&ВПР(ПСТР(ТЕКСТ(A1;n0);6;1)*И(ПСТР(ТЕКСТ(A1;n0);5;1)-1);мил;2);"")&ИНДЕКС(n_4;ПСТР(ТЕКСТ(A1;n0);7;1)+1)&ИНДЕКС(n1x;ПСТР(ТЕКСТ(A1;n0);8;1)+1;ПСТР(ТЕКСТ(A1;n0);9;1)+1)&ЕСЛИ(-ПСТР(ТЕКСТ(A1;n0);7;3);ВПР(ПСТР(ТЕКСТ(A1;n0);9;1)*И(ПСТР(ТЕКСТ(A1;n0);8;1)-1);тыс;2);"")&ИНДЕКС(n_4;ПСТР(ТЕКСТ(A1;n0);10;1)+1)&ИНДЕКС(n0x;ПСТР(ТЕКСТ(A1;n0);11;1)+1;ПСТР(ТЕКСТ(A1;n0);12;1)+1));"z";" ")&ЕСЛИ(ОТБР(ТЕКСТ(A1;n0));"";"Ноль ")&"рубл"&ВПР(ОСТАТ(МАКС(ОСТАТ(ПСТР(ТЕКСТ(A1;n0);11;2)-11;100);9);10);{0;"ь ":1;"я ":4;"ей "};2)&ПРАВСИМВ(ТЕКСТ(A1;n0);2)&" копе"&ВПР(ОСТАТ(МАКС(ОСТАТ(ПРАВСИМВ(ТЕКСТ(A1;n0);2)-11;100);9);10);{0;"йка":1;"йки":4;"ек"};2);"один тысяча";"одна тысяча")

VBA-процедура для суммы прописью

Вызов процедуры находится в меню «Изменить символы» в группе «ИЗМЕНИТЬ» на панели надстройки. Макрос преобразует числа на месте, превращая их в текст:

Числа в других падежах

Зачастую после получения числа прописью нужно указать его в другом падеже. Например, «сумма в размере пятисот тысяч трехсот трех рублей». Надстройка !SEMTools справляется и с этой задачей — смотрите раздел склонение по падежам в Excel.