Решить эту задачу можно следующим методом: сначала разбить дату на составляющие, день месяц и год (причем для месяца сформировать не его порядковый номер в году, а название), а после этого все компоненты соединить в текстовой строке.
Таблица, построенная на базе этого алгоритма, с формулами и числовым примером показана на рис. 6.7.
Ячейки таблицы выполняют следующие функции:
- ячейка А1 - служит входом (содержит дату в формате Excel);
- ячейка А2 - определяет номер дня месяца;
- ячейка A3 - определяет номер месяца;
- ячейка А4 - определяет год;
- ячейки А5:А15 - обеспечивает написание названия месяца;
- ячейка А16 - добавляет нуль перед номером дня месяца, если этот номер меньше или равен 9;
- ячейка А17 - служит выходом (содержит дату прописью).
День недели позволяет определить функция ДЕНЬНЕД, которую можно ввести, вызвав мастер функций и выделив в списке Категория элемент Дата и время (рис. 6.1). Синтаксис функции следующий:
ДЕНЬНЕД (дата_в_числовом_формате; тип)
Она возвращает день недели, соответствующий первому аргументу дата_в_чи-словом_формате. День недели будет представлен как целое число в интервале от 1 (воскресенье) до 7 (суббота).
Аргумент дата_в_числовом_формате - это код дата-время, который Excel применяет для операций в датами. Данный аргумент можно задавать и в текстовом виде, заключив строку в кавычки. Тип - это число, определяющее нумерацию дней недели. Аргумент Тип может принимать следующие значения:
- 1 (либо опущено) - число от 1 (воскресенье) до 7 (суббота);
- 2 - число от 1 (понедельник) до 7 (воскресенье);
- 3 - число от 0 (понедельник) до 6 (воскресенье).
Таким образом, в зависимости от типа, указанного в функции ДЕНЬНЕД, 5-й день недели может быть четвергом, пятницей или субботой. Чтобы не задавать второй аргумент, будем считать, что 5-й день недели - это четверг.
Если в ячейках G4 и F4 находится число 1, то функция ЕСЛИ возвратит текст одиннадцать. Если же значение 1 находится только в ячейке F4, а ячейка G4 содержит другое число, то возвращается текст один (рубль). Если в ячейке F4 находится значение, отличное от 1 , то формула переадресовывает решение задачи в ячейку G6. В ячейке G6 находится аналогичная формула:
=ЕСЛИ (G4-2 ; ЕСЛИ (F4=1 ; " двенадцать " ; "два" ) ; G7 )
В ней производится анализ значений ячеек G4 и F4 на предмет того, какое числительное писать: двенадцать или два. Если условия не выполняются, то осуществляется переадресация в ячейку G7 и т. д. Анатогичными формулами заполняются ячейки столбца G по 13-ю включительно.
В столбце "Десятки" находятся формулы, которые формируют количественные числительные для десятков. Рассмотрим, по какому алгоритму они работают. В ячейке F5 содержится такая формула:
=ЕСЛИ ( F4=0 ;"";ЕСЛИ(F4=1; ЕСЛИ (G4-0;" десять";"") ;F6) )
Сначала она производит проверку ячейки F4 на предмет наличия там значения 0. Если это значение присутствует (то есть в числе нуль десятков), формула выдает пустое значение.
Если же в ячейке F4 находится другое значение, то начинает работу первая функция ЕСЛИ. Она проверяет, находится ли в ячейке F4 значение 1. Если это так, то надо посмотреть, какое значение находится в столбце "Единицы" (ячейка G4). Это делает вторая функция ЕСЛИ. В случае, когда там находится значение О, формула выдает текст десять. Если же в ячейке G4 находится любое другое значение, формула выдает пустое значение (""). Таким образом учитывается тот факт, что числительные для значений с 1 1 по 19 уже сформированы в столбце "Единицы".
Если в ячейке F4 находится значение, отличное от 1, управление передается в ячейку F6. В ячейке F6, в свою очередь, записана следующая формула:
=ЕСЛИ(F4=2; "двадцать"; F7)
Когда в ячейке F4 находится значение 2, формула возвращает текст двадцать. В противном случае происходит переадресация в ячейку F7.
Формулы, аналогичные этой, необходимо занести в ячейки столбца F по 12-ю включительно.
Числительные для сотен формируются в столбце Е. В ячейке Е5 содержится такая формула:
=ЕСЛИ(F4=0; "" ;ЕСЛИ (Е4=1; "сто";Е6) )
Сначала она производит проверку ячейки Е4 на предмет нахождения там значения 0. Если это значение присутствует, формула выдает пустое значение (в числе нуль сотен).
Если же там находится другое значение, формула продолжает проверку при помощи второй логической функции ЕСЛИ. Когда в ячейке Е4 находится значение 1, выдается текст сто. В противном случае выполняется переадресация в ячейку Е6.
В ячейке Е6 находится следующая формула:
=ЕСЛИ(Е4=2;"двести";Е7)
Она выдает текст двести, если в ячейке Е4 находится значение 2, и передает управление в ячейку Е7 в противном случае.
Аналогичными формулами следует заполнить ячейки столбца Е по 12-ю включительно.
ПРИМЕЧАНИЕ
Примите во внимание тот факт, что в последних формулах, формирующих единицы, десятки и прочие разряды, при невыполнении условия передача управления в расположенную ниже ячейку не производится.Если в ячейке А4 находится 0, то не пишется ничего. Если числительное заканчивается, например, на букву "а" (два) или "е" (четыре), то формула возвращает текст миллиона. Аналогичная проверка проводится для всех возможных окончаний.
Для определения того, какой буквой заканчивается числительное, используется текстовая функция ПРАВСИМВ (рассмотрена в главе 4).
В ячейке D14 при помощи следующей формулы формируется название для тысяч:
=ЕСЛИ(В4+С4+D4=0;"";ЕСЛИ(ПРАВСИМВ(D5;1)="а";"тысяча";
ЕСЛИ(ПРАВСИМВ(D5;1)="е";"тысячи";
ЕСЛИ(ПРАВСИМВ(D5;1)="и";"тысячи";"тысяч"))))
Сначала в формуле суммируются значения, находящиеся в ячейках В4, С4 и D4. Это делается для того, чтобы определить, присутствуют л и в числе разряды тысяч. А затем, как и в предыдущей формуле, выполняется анализ окончания числительного и на основе его результатов выбирается падежное окончание для слова "тысяча".
Формула в ячейке G14 имеет следующий вид:
=ЕСЛИ(А4+B4+С4+D4+Е4+F4+G4=0;"Нуль рублей";
ЕСЛИ(ПРАВСИМВ(G5;1)="H";"рубль";
ЕСЛИ(ПРАВСИМВ(G5;1)="a";"рубля";
ЕСЛИ(ПРАВСИМВ(G5;1)="е";"рубля";
ЕСЛИ(ПРАВСИМВ(G5;1)="и";"рубля";"рублей")))))
Сначала в формуле проверяется, присутствует ли в данном числе целое значение рублей. Если нет, то выдается надпись Нуль рублей.
Однако не следует создавать слишком сложные вложенные формулы. Не забывайте, что для функции ЕСЛИ допускается не более семи уровней вложения. Таким образом, на определенном этапе ячейку, которая влияет на другие ячейки и в которой находится сложная формула, нужно оставить и выполнить вложение формул в следующих зависимых от нее ячейках.
В ячейке А2 модуля должна находиться следующая формула:
=ЕСЛИ(МЕСЯЦ(С1)=5;"мая";
ЕСЛИ(МЕСЯЦ(С1)= 6;"июня";
ЕСЛИ(МЕСЯЦ(С1)= 7;"июля";
ЕСЛИ(МЕСЯЦ(С1)=8;"августа";
ЕСЛИ(МЕСЯЦ(С1)= 9;"сентября";
ЕСЛИ(МЕСЯЦ(С1)=10;"октября";
ЕСЛИ(МЕСЯЦ(С1)=11;"ноября";"декабря")))))))
В ячейке A3 при помощи приведенной ниже формулы будет формироваться результат:
=СЦЕПИТЬ(" от ";ЕСЛИ(ДЕНЬ(С1)< = 9;0; "") ;
ДЕНЬ (C1);" ";
ЕСЛИ (МЕСЯЦ (С1)=1 ; "января" ;
ЕСЛИ (МЕСЯЦ (С1)=2 ; "февраля" ;
ЕСЛИ (МЕСЯЦ (C1)=3; "марта";
ЕСЛИ (МЕСЯЦ (С1)=4; "апреля" ;С2) ) ) ) ;
" ";ГОД(С1)x ;" года.")
Существует мнение, что имеется только один способ заставить Excel производить эту операцию - написать программу на языке Visual Basic for Applications, который является встроенным языком программирования для пакета Microsoft Office. Однако мы покажем, как решить эту задачу, не прибегая к программированию.
Если число больше или равно 100, то мы получим количество сотен в этом числе. В противном случае результатом будет 0. Аналогичные формулы используем и для других разрядов. Значение знаменателя дроби в этих формулах изменяется в зависимости от разряда: для тысяч - 1000, для миллионов - 1000000 и т. д.
В строке 4 определяются значения каждого из разрядов. Для этого надо выделить младший разряд в числах, которые находятся в строке 3. Это делается путем вычитания из них значений, которые находятся в ячейке левее, умноженных на 10. Например, в ячейке С4 содержится формула для определения десятков тысяч:
=СЗ-ВЗ*10
Как видите, из определенного в ячейке СЗ количества десятков тысяч вычитается установленное в ячейке ВЗ количество сотен тысяч, умноженное на 10. В случае числа 1111111,11 это будут следующие значения:
111 - 11*10
В результате мы получим в разряде сотен тысяч значение 1.
Формула для копеек (ячейка НЗ) несколько отличается от остальных формул строки 3. Мы хотим, чтобы в случае, когда число копеек не превышает 9, перед цифрой добавлялся 0. А следовательно, сумма, в которой указаны только целые рубли, должна выглядеть как "20 руб. 00 коп.". Это обеспечивается путем занесения в ячейку Н4 следующей формулы:
=ЕСЛИ(НЗ<=9;0;"")


Эта формула вернет результат, равный 1. Значит, интересующий нас день - воскресенье.
Теперь приступим к реализации алгоритма, позволяющего написать прописью название этого дня недели. Введите в ячейку A3 формулу, созданную на основе логической функции ЕСЛИ:
=ЕСЛИ(А2=1;"Воскресенье";А4)
Формула сравнивает номер дня недели со значением 1. Если результатом сравнения является ИСТИНА, то в ячейке A3 появится текст Воскресенье. В противном случае значение ячейки A3 будет определяться содержимым ячейки А4.
В ячейке А4 должна находиться аналогичная формула:
=ЕСЛИ(А2=2;"Понедельник";А5)
Если номер дня недели отвечает понедельнику (равен 2), то в этой ячейке появится текст Понедельник. Данное значение затем передается в ячейку A3.
Заполните аналогичными формулами для других дней недели ячейки А5:А7. А вот в ячейку А8 поместите следующую формулу:
=ЕСЛИ(А2=6;"Пятница";"Суббота")
Она не содержит ссылок на другие ячейки, поскольку мы уже перечислили все дни недели.
Алгоритм, реализованный при помощи этих формул, представлен на рис. 6.3.

Воспользуемся методом вложения формул и минимизируем эту таблицу. На ее базе можно создать модуль, состоящий всего из двух ячеек. Ячейка А1 будет служить входом модуля, а ячейка А2, в которой производятся вычисления, - выходом. Ячейка А2 должна содержать следующую формулу:
=ЕСЛИ(ДЕНЬНЕД(А1)=1;
"Воскресенье";
ЕСЛИ(ДЕНЬНЕД(А1)=2;"
Понедельник";
ЕСЛИ(ДЕНЬНЕД(А1)=3;
"Вторник";
ЕСЛИ(ДЕНЬНЕД(А1)=4;"Среда";
ЕСЛИ(ДЕНЬНЕД(А1)=5;"Четверг";
ЕСЛИ(ДЕНЬНЕД(А1)=6;"Пятница","Суббота"))))))




Поместите табличный курсор в ячейку А2 и вызовите панель функции ДЕНЬ (рис. 6.8). В поле Дата_как_число введите адрес ячейки А1. Вы должны получить в ячейке А2 формулу, которая определяет день месяца, указанный во введенной в ячейку А1 дате:
=ДЕНЬ(А1)
Для определения года используем функцию ГОД, которая также принадлежит к категории Дата и время. Функция возвращает год, соответствующий аргументу дата_в_числовом_формате. Год определяется как целое число в интервале от 1900 до 9999. Синтаксис функции следующий:
ГОД(дата_в_числовом_формате)

Таким образом, в этой ячейке будет содержаться номер года от рождества Христова в дате, указанной в ячейке А1.

Установите табличный курсор в ячейку А4 и вызовите панель функции МЕСЯЦ (рис. 6.10). В поле Дата_как_число введите адрес ячейки А1. Полученная формула должна иметь вид:
=МЕСЯЦ(А1)
В данном случае функция МЕСЯЦ определяет, какой номер месяца указан в дате, находящейся в ячейке А1.

В ячейках А6:А14 расположите аналогичные формулы для других месяцев, а в ячейку А15 введите несколько другую формулу:
=ЕСЛИ(А4=11;"ноября";"декабря")
Мы хотим, чтобы номер дня, если он меньше 10, был представлен с предшествующим нулем. Реализовать это можно с применением помещенной в ячейку А16 формулы
=ЕСЛИ(А2Если порядковый номер дня месяца меньше или равен 9, функция ЕСЛИ возвращает 0. В противном случае она выдает пустую строку, потому что между кавычками в третьем аргументе ничего не введено.
Результат формируется в ячейке А17 с использованием формулы
=" от "&А16&А2&" "&А5&" "&АЗ&" года."
В этой формуле при помощи символов "&" производится конкатенация (соединение) текстовых строк и содержимого ячеек, в которых находятся определенные ранее элементы даты. Перед датой добавляется предлог "от" (это нужно, в частности, для платежного поручения). Далее следует адрес ячейки А16. Она предназначена для вставки предшествующего нуля перед датой в случае, когда номер дня меньше 10. Указание адреса ячейки А2 приводит к вставке дня месяца. Дальше следует пробел (" "), перед названием месяца. В ячейке А5 находится название месяца. После него опять надо вставить пробел (" "). Ячейка A3 содержит год. Предлог " от " в начале формулы можно удалить или заменить другим.
Для конкатенации элементов можно использовать не только символ "&". В Excel есть текстовая функция СЦЕПИТЬ. Для ее вызова также применяется мастер функций. Панель функции приведена на рис. 6.11. С помощью этой функции можно получить формулу, которая аналогична предыдущей, но более удобна для восприятия:
=СЦЕПИТЬ(" от ";А16;А2;" ";А5;" ";АЗ;" года.")


ПРИМЕЧАНИЕ
Данный модуль легко транспонировать. Для этого нужно либо переместить ячейки на рабочем листе, либо скопировать рабочий лист и при его вставке использовать диалоговое окно Специальная вставка, отметив в нем опцию Транспонировать.

В первом аргументе функции ЕСЛИ содержимое ячейки A3 сравнивается с текстом Январь. Если они одинаковы, то функция возвращает значение 1 - первый месяц. В противном случае ячейка A3 будет содержать значение, находящееся в ячейке А5, адрес которой указан в третьем аргументе функции. Формула в ячейке А5 сравнивает значение ячейки A3 с текстом Февраль. Аналогичные формулы содержатся в ячейках по А1.4 включительно. В ячейке А15 расположена формула, которая несколько отличается от предыдущих:
=ЕСЛИ(А3="Декабрь";12;"Уточните месяц!")
Несовпадение значения в ячейке A3 со словом Декабрь означает, что месяц был введен неправильно. Поэтому в данном случае третьим аргументом является не адрес ячейки, а сообщение Уточните месяц!.
Для формирования даты из отдельных элементов в числовом формате воспользуемся функцией категории Дата и время - ДАТА. Поместите табличный курсор в ячейку А16 и вызовите панель функции ДАТА (рис. 6.15). Введите в поле Год ссылку на ячейку А1, где указан номер года, в поле Месяц - ссылку на ячейку А4, где определен номер месяца в году, а в поле День - ссылку на ячейку А2, где указан день месяца.

В ячейку А5, которая служит выходом модуля, занесите формулу, приведенную ниже:
=ЕСЛИ (А3="Май" ; 5; ЕСЛИ (А3 = "Июнь" ; 6;
ЕСЛИ(А3="Июль" ; 7 ; ЕСЛИ (А3="Август" ; 8 ;
ЕСЛИ(А3="Сентябрь";9;ЕСЛИ(А3="Октябрь";10;
ЕСЛИ(А3="Ноябрь";11;
ЕСЛИ(А3="Декабрь"; 12; "Уточните месяц! "))))))))



ПРИМЕЧАНИЕ
Если вы предполагаете, что число, подаваемое на вход таблицы, будет содержать больше двух знаков после запятой, задайте ссылку на адрес ячейки с входными данными через функцию округления.Рассмотрим принципы работы таблицы на числе 1111111 руб. 11 коп. Это число введено в ячейку А1 (рис. 6.18). В строке 2 таблицы содержатся надписи, которые указывают, для какого разряда производятся вычисления в данном столбце. После отладки таблицы эту строку можно удалить.


Итак, мы заполнили формулами область B5:G13, в которой осуществляется запись прописью чисел от 0 до 999999.
Теперь приступим к формированию числительных для разряда миллионов. Эта операция выполняется в столбце А. В ячейке А5 находится следующая формула:
=ЕСЛИ(А4=0;"";ЕСЛИ(А4=1;"один";А6))
Она анализирует значение в ячейке А4. Если оно равно 0, то ничего не пишется. Если в ячейке А4 находится 1, то пишется текст один (миллион). Если в ячейке А4 содержится другое значение, происходит переадресация в ячейку А6 и т. д. Аналогичными формулами заполнены ячейки столбца А по 12-ю включительно.
Итак, числительные для разрядов мы сформировали, теперь приступим к созданию названий разрядов.


Она объединяет в единое целое все компоненты, предназначенные для написания суммы прописью. В данной формуле содержатся ссылки на все ячейки, в которых находятся сформированные числительные и названия разрядов. Между ссылками на ячейки в функции СЦЕПИТЬ нужно обязательно поставить пробелы.
Например, при формировании прописью числа 1 111 111,11 аргументы функции будут иметь такие значения:
=СЦЕПИТЬ("один";" ";"миллион";" ";"сто";" ";"одиннадцать";" ";"тысяч";" "; ... и т. д. }
В ячейке А16 производится удаление из текста лишних пробелов:
=СЖПРОБЕЛЫ(А15)
Для этого применяется текстовая функция СЖПРОБЕЛЫ (рис. 6.23), которая оставляет в тексте только одиночные пробелы. Функцию СЖПРОБЕЛЫ можно применять для обработки текстов, полученных из других прикладных программ, если эти тексты содержат избыточные пробелы. Синтаксис функции имеет следующий вид:
СЖПРОБЕЛЫ(текст)
где текст - это текст, из которого удаляются пробелы.

Теперь надо обеспечить правильное употребление строчных и прописных букв в надписи. Надпись будет начинаться с прописной буквы. Это делается при помощи формул, которые находятся в ячейках А17 и А18.
В ячейке А17 содержится следующая формула:
=ЛЕВСИМВ(A16;1)
Она выделяет самый левый (то есть первый) символ строки после того, как из нее удалены лишние пробелы.
Формула в ячейке А18 назначает для этого символа прописную букву:
=ПРОПИСH(А17)
Здесь использована функция ПРОПИСН (рис. 6.24), которая делает все буквы в тексте прописными. Синтаксис функции таков:
ПРОПИСН(текст)
где текст - это текст, символы которого преобразуются в прописные. Текст может быть ссылкой на ячейку или текстовой строкой.

Сначала определяем, сколько символов находится в строке после удаления лишних пробелов. Это делается в ячейке А19:
=ДЛСТР (А16)
После этого извлекаем из строки все символы, кроме первого. Предназначенная для этого формула находится в ячейке А20:
=ПРАВСИМВ(А16;А19-1)
Для того чтобы определить количество извлекаемых символов, необходимо из общего количества символов текстовой строки (содержится в ячейке А19) вычесть 1.
Теперь компоненты надписи можно объединить. Для этого запишите в ячейку А21 следующую формулу:
=СЦЕПИТЬ(А18;А20)

Если же вы воспользуетесь командой Зависимые ячейки, то стрелки будут указывать на ячейки, значения которых зависят от данной ячейки.
В случае, когда нужно проследить большое число зависимостей, удобно применить панель Зависимости (рис. 6.26).

На рис. 6.27 показаны стрелки, которые появляются при выполнении команды Влияющие ячейки. Они указывают, формулы каких ячеек оказывают непосредственное влияние на формулы, находящиеся в анализируемой ячейке. Например, на вычисления в ячейке ВЗ влияет значение ячейки А1. На ячейку С4 влияют значения в ячейках С3 и В3, на которые, в свою очередь, влияет ячейка А1.



Для определения зависимостей поместите табличный курсор в рассматриваемую ячейку и вызовите команду Сервис/Зависимости/Зависимые ячейки или Влияющие ячейки (рис. 6.25). После этого между зависимыми ячейками появятся стрелки. Они показывают непосредственное влияние содержимого одних ячеек на формирование результата в других ячейках.