Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
98
Добавлен:
20.04.2015
Размер:
1.32 Mб
Скачать

"Остаток:"???"дн"; [красный]"доплата"???"дн"; [синий]"съезд"

позволяющий предъявить данные в удобной форме. Для лиц, у которых сегодня закончился оплаченный срок, выводится слово СЪЕЗД синего цвета. Для тех, у кого имеется задолженность, выводится слово доплата и число дней, за которые нужно доплатить, красного цвета. В нормальном случае выводится число оставшихся оплаченных дней проживания.

В столбце Доплата: сумма для должников предъявляется сумма, которую им необходимо внести к погашению долга H5=ABS(ЕСЛИ(G5<0;G5*C5;0)).

Пример 6.31. Нерегулярные таблицы.

Обычно, пользовательские таблицы, обрабатываемые в Excel, имеют регулярную структуру, где все строки и столбцы содержат одинаковое число элементов. На практике, однако, это обстоятельство наблюдается (см. рис. 6.31а) не всегда. Рассмотрим пример с такой нерегулярной структурой.

П

Рис. 6.31а

усть (рис 6.31б) требуется подсчитать общее число рабочих дней и часов сотрудников организации. При этом все они могут иметь разное количество рабочих дней и часов в месяце/квартале/году.

Здесь можно поступить традиционным образом – оставить 365 колонок (по одной для каждого дня), а суммы получать в 366 столбце. При такой структуре собственно данные и итоговый столбец оказываются разнесенными на столь большое расстояние, что от пользователя потребуется постоянное утомительное перемещение по таблице, не говоря уже о том, что в рабочем листе всего-то 256 столбцов.

A

B

C

D

E

F

G

H

I

1

Имя

Столбцов

Всего

2

Петр

4

1.Май

6.Май

3

14ч

4

Иван

6

2.Май

7.Май

12ч

10.Май

5

25ч

6

Олег

2

4.Апр

20ч

7

20ч

8

Всего

9

59ч

Рис. 6.31б

Если “итоговые” функции, которые мы желаем реализовать, несложны, мы можем построить их другим способом. Для Петра, например, число отработанных дней вычисляется в ячейке С2, а часов – в С3. Каждая рабочая смена в таблице зафиксирована датой и числом отработанных часов. Поскольку итоговые клетки (столбец С) находятся слева от заранее неизвестного и изменяющегося числа суммируемых клеток, требуется как-то определить, сколько же столбцов следует обработать. Для выяснения этого обстоятельства здесь создана техническая колонка В (Столбцов), содержащая следующее выражение для Петра

B2=ПОИСКПОЗ(999999;D2:VI2;1).

Здесь функция ПОИСК() пытается найти заведомо слишком большое (999999) для нашей задачи число во второй строке. Поскольку известно, что никакая возможная дата, ни тем более число рабочих часов не могут его превышать, результатом будет номер последней непустой числовой клетки в этой строке, начиная от начальной D2. Отсюда мы легко найдем количество отработанных дней как число клеток, деленное на два, поскольку для каждого рабочего дня заполняются две клетки C2=ОТБР(B2/2).

Функция отбрасывания понадобилась для того, чтобы получить правильный результат, если дата была введена, а число часов – еще нет. Сложнее сформировать сумму часов. В качестве критерия суммирования положим, что значение слагаемого не должно превышать самой длинной рабочей смены, например 24 часов. Таким образом, не будут просуммированы значения дат. Современные возможные даты это числа больше 36000 (так 1.1.99г= 36161). Сама область суммирования (для Петра) ограничена столбцом D и столбцом, найденным с помощью функции ИНДЕКС() со вторым аргументом, взятым из колонки В,

C3 {=СУММ(ЕСЛИ(D2:ИНДЕКС(D2:VI2;;B2)<24;

D2:ИНДЕКС(D2:VI2;;B2);0))}.

Кроме вычислений для отдельного человека, в таблице формируются и вертикальные суммы. Число дней, отработанных всеми сотрудниками, находится во всех четных строках столбца С. Чтобы гарантировать суммирование именно этих значений, в функцию СУММ() включены только те строки, номера которых без остатка делятся на два (т.е. четные строки)

C8 {=СУММ(ЕСЛИ(ОСТАТ(СТРОКА(C2:C7);2)=0;C2:C7;0))}.

Аналогично сумма часов находится в нечетных строках

C9 {=СУММ(ЕСЛИ(ОСТАТ(СТРОКА(C2:C7);2)=1;C2:C7;0))}.

Все функции в столбце С вводятся как функции массива, т.е. ввод завершается нажатием клавиш Ctrl+Shift+Enter, о чем свидетельствуют фигурные скобки. Техническая колонка В создана нами только для наглядности. В дальнейшем колонку можно скрыть или включить ее содержимое в С2 и С3.

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

C8=СУММЕСЛИ(C2:C7;”>0”) – сумма всех часов

С9 {=СУММ(ЕСЛИ(C2:C7<1;D2:D7;0))} – число всех дней

и по горизонтали:

C3=СУММЕСЛИ(D2:IV2;”<24”) – сумма часов работника

C2=СЧЁТЕСЛИ(D2:IV2;”>=30000”) – число дней работника,

поскольку здесь нам не нужно знать, какая именно клетка для каждого из рабочих была заполнена последней. Критерием вертикального суммирования часов явилось наличие в столбце В числа больше нуля, а количества дней – числа меньше 1. В горизонтальную сумму часов включались только числа, меньше 24, а в подсчет дней – числа больше 30000.

 Следующие два примера посвящены более сложным, чем ранее, расчетам, связанным с определением временных интервалов. В виду этого рассмотрим несколько технических моментов. Вспомним, что дата в Excel – это целое число, отображенное в формате даты (1 единица = 1 день), время – дробное число в формате времени (один час =1/24= 0,041666667). Таким образом, в одной клетке может сразу отображаться и дата и время (дата_время). Например, число 36069,3958333333 соответствует 01.10.1998 9:30 (1 октября 1998г. 9 часов 30 минут). При расчетах нам может понадобиться извлечь из такой комбинированной даты_времени только дату или только время, иными словами отделить целую или дробную части числа. Дату можно отделить функцией ЦЕЛОЕ():

<дата>=ЦЕЛОЕ(<дата_время>).

Время может быть получено с помощью выражения:

<время>=<дата_время> – ЦЕЛОЕ(<дата_время>).

Однако проще использовать функцию вычисления остатка от деления на 1:

<время>=ОСТАТ(<дата_время>;1).

Например, если в А1 содержится значение 01.10.1998 9:30, то

ЦЕЛОЕ(А1) = 01.10.1998 0:00 и ОСТАТ(А1;1) = 9:30.

В дальнейших рассуждениях дату, содержащую и время, будем обозначать термином <дата_время>; дату, содержащую только число, месяц и год, – термином <дата>; дату, содержащую только время, – термином <время>.

Пример 6.32. Расчет временных интервалов.

Пусть требуется рассчитать зарплату работников, несущих дежурство на производстве, в том числе, и в ночную смену. Предполагается, что график дежурств не определен жестко, а может быть установлен для каждого работника индивидуально и меняться со временем. В этих условиях важно быстро вычислить общее число отработанных часов и количество часов, пришедших на ночную смену. Предполагается также, что длина смены не может превышать одних суток (24 часа).

A

B

C

D

E

F

G

H

1

ГРАФИК ДЕЖУРСТВ сейчас:

2 ноя 03:24

2

НОЧЬ

начало:

20:00ч

конец:

8:00ч

Тариф:

15р/ч

3

Имя

Д е ж у р

с т в о

Всего

часов

Ночь

4

начало

конец

начало

конец

час.

5

Петр

1 ноя 06:00

1 ноя 12:00

6,0

1 06:00

1 08:00

2

150

6

Иван

1 ноя 09:30

2 ноя 09:00

23,5

1 20:00

2 08:00

12

563

7

Олег

3 ноя 12:00

4 ноя 01:00

13,0

3 20:00

4 08:00

5

300

8

ВСЕГО

42,5

19

953

Рис. 6.32

На предприятии установлено, что ночная смена начинается в 20 часов (клетка С2), а заканчивается в 8 часов следующего дня (клетка Е2). Начало и конец дежурства (НД и КД) для каждого работника вносятся в клетки В5 и С5 (для Петра) в формате, который включает как дату, так и время (день, месяц, год, часы и минуты – Д МММ чч:мм). Оплата труда за каждый час дежурства в дневное время определяется часовым тарифом (клетка Н2). В ночное время оплата производится по удвоенному тарифу плюс 30 руб. на оплату дороги домой (из дома).

Сначала вычислим общее рабочее время как разность конца и начала дежурства, умноженную на 24 (D5=(C5–B5)*24). Последнее необходимо для преобразования времени-дроби при дате в часы.

Теперь определим дату_время начала первой ночи, которая, возможно, приходится на дежурство. Если работа начинается в дневное время, начало ближайшей ночи (НН) попадет на 20 часов дня заступления на дежурство. Если НД приходится на ночное время, то это и будет начало ночи. Таким образом,

НН=ЕСЛИ(НД приходится на дневное время; дата НД+20:00; НД)

или в адресах

E5=ЕСЛИ(И(B5>=ЦЕЛОЕ(B5)+E$2;

B5<ЦЕЛОЕ(B5)+C$2);ЦЕЛОЕ(B5)+C$2;B5).

Поскольку здесь нужно соединить дату НД и время, установленное на предприятии как начало/конец ночной смены, в формуле используется функция ЦЕЛОЕ(), отбрасывающая дробную часть аргумента, содержащего время НД.

Время конца ночной смены – всегда 8 часов утра. Наша задача определить день КН. Он может быть как днем заступления на дежурство (ЦЕЛОЕ(E5)), так и следующим днем (ЦЕЛОЕ(E5)+1).

Если время НН меньше 8-и часов, то день остается без изменения, если нет – берется следующий день. Иными словами

КН=день НД + 8:00+ЕСЛИ(время НД<8:00; 0; 1)

или F5=ЦЕЛОЕ(E5)+E$2+ЕСЛИ(ОСТАТ(E5;1)<=E$2;0;1).

Функция ОСТАТ() отделяет дробную часть Е5 (т.е. часы и минуты) от полной даты_времени НД.

Теперь найдем время, отработанное в ночную смену. Если время КД менее НН (дежурство заканчивается до наступления ночи), работы в ночную смену не было. В противном случае находится разность между минимальным значением из КД, КН и максимальным из НД, НН и умножается на 24.

Часов ночной смены=ЕСЛИ(КД<НН; 0;МИН(КД;КН)–МАКС(НД;НН))*24

или G5=ЕСЛИ(C5<E5;0;МИН(C5;F5)–МАКС(B5;E5))*24.

Наконец, мы можем вычислить заработанную сумму.

Оплата=за дневную смену + за ночную смену+30, если была ночная смена

или H5=(D5–G5)*H$2+G5*2*H$2+ЕСЛИ(G5>0;30).

К оформлению. В завершении сделаем так, чтобы оператор, работающий на компьютере, мог легко видеть, кто в настоящее время дежурит. Это существенно, поскольку таблица может иметь большой размер и быстро найти в ней нужную строку не так просто. Для ориентирования во времени в клетку F1 введена функция =ТДАТА() предъявления текущей даты_времени. Значение в этой клетке непрерывно само не обновляется – новое время можно получить, нажав клавишу пересчета F9. Для реализации желаемого установим на клетки А5, А6, А7 условный формат

Соседние файлы в папке EXCEL (Попов)