суббота, 12 ноября 2011 г.

Срок службы агрегата

"Здравствуйте!

Нашла Ваш сайт об экселе. Подумала - может Вы мне поможете, если хорошо знаете эту программу.

Помогите, пожалуйста, решить следующую проблему.

Есть некий агрегат. Дата выпуска агрегата - 25.03.1987 г. Срок службы, например, 35 лет, т.е. - до 25.03.2022 г.

Нужно высчитать:

- сколько агрегат отработал с даты выпуска (гг., мм.) до сегодняшнего дня

- остаток срока службы на сегодняшнюю дату (гг., мм.), т.е. сколько осталось до 25.03.2022 г.

Спасибо заранее за оказанную помощь."

Решение указанной проблемы не представляет особой сложности. Придумывать ничего не надо. Достаточно взять дату начала службы агрегата, конца срока службы агрегата и текущую дату. Вычесть одно из другого и получим искомый результат.

Однако вопрос задан и на него надо отвечать, тем более, что человек ищет, как автоматизировать и облегчить работу с помощью глубоко уважаемого мной Excel! А это, есть ХОРОШО!!!

И так, рисуем табличку.

срок службы агрегата

Для того чтобы посчитать сколько агрегат отработал нужно от текущей даты отнять дату выпуска и полученную разницу обработать формулами ГОД() и МЕСЯЦ() соответственно.



=ГОД(СЕГОДНЯ()-B3)-1900



Отсчет даты в Excel ведется с 1900 года, поэтому от полученного года надо отнимать "1900"



=МЕСЯЦ(СЕГОДНЯ()-B3)

Для того чтобы посчитать сколько агрегату осталось еще работать до конца срока службы нужно от даты окончания срока службы отнять текущую дату и полученную разницу обработать формулами ГОД() и МЕСЯЦ() соответственно.



=ГОД(C3-СЕГОДНЯ())-1900





=МЕСЯЦ(C3-СЕГОДНЯ())

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

числовой формат

Архив с файлом примера можно скачать.

Табель учета рабочего времени

"Добрый день. Есть время работы в месяц, и по этому календарю надо сделать табель учета рабочего времени, так как не все сотрудники работают одинаковое время, допустим Сидоров в понедельник отработал 6 часов, а Иванов 8 часов, вот и надо чтобы не считать на калькуляторе время, а просто ввел часы за месяц и табель уже раскидал время."

К письму прилагается табличка с табелем учета рабочего времени, фрагмент которой прилагаю.

табель учета рабочего временитабель учета рабочего времени

Сразу видно, что табличка отражает не столько учет рабочего времени, сколько график работы. Табличка несомненно удобна для пользователя т.к. сразу видно сколько работников в одно время работают, что несомненно важно для организации работы, а вот считать рабочие часы в таком виде действительно неудобно из-за самого вида и текстового формата значений.

Учитывая, что основная задача обеспечить удобство пользования, принято решение не менять вид самой таблички, а добавить к ней дополнительные расчетные поля, которые обеспечат преобразование и расчет данных.

Первая задача преобразовать значения типа "8\17" в число отработанных часов. Кроме этого 17-8=9, а из таблички видно, что рабочий день 8-часовой, значит сюда заложен еще и перерыв на обед - 1 час. А если работа с "8/11" 11-8=3, то перерыва на обед нет. С учетом дополнительных условий, задачу можно решить с помощью следующей формулы.



=ЕСЛИ(ЕОШ(НАЙТИ("\";B7;1));0;ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))-ЗНАЧЕН(ПСТР(B7;1;НАЙТИ("\";B7;1)-1))-ЕСЛИ(ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))-ЗНАЧЕН(ПСТР(B7;1;НАЙТИ("\";B7;1)-1))>4;1;0))

Общий смысл этой формулы заключается в том, что сначала находится и преобразуется в цифру время конца рабочего дня, далее - начало рабочего дня и берется между ними разница. Кроме этого проверяются логические условия на заполненность ячейки и длительность рабочего дня для определения наличия "обеда". И так, время конца рабочего дня возвращает фрагмент формулы.



ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))

Опорой для этого служит знак "\", который разделяет значения начала и конца рабочего дня. Далее аналогично находится время начала рабочего дня и берется между ними разница.



ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))-ЗНАЧЕН(ПСТР(B7;1;НАЙТИ("\";B7;1)-1))

Учитывая, что функция НАЙТИ("\";B7;1) возвращает ошибку "#ЗНАЧ!" для пустых ячеек таблицы, т.к. не находит опорный знак "\", в начало формулы добавляем условие, которое позволяет возвращать "0" если ячейка таблички вообще не заполнена.



=ЕСЛИ(ЕОШ(НАЙТИ("\";B7;1));0;

Теперь осталось разобраться с перерывом на обед. Условие такое, если рабочий день длится больше 4 часов, то перерыв есть и 1 час надо вычитать из общего рабочего времени, в противном случае перерыва нет. Эту задачу решает следующий фрагмент формулы.



ЕСЛИ(ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))-ЗНАЧЕН(ПСТР(B7;1;НАЙТИ("\";B7;1)-1))>4;1;0)

Полученную формулу копируем в дополнительные расчетные ячейки.

рабочие часы

Теперь осталось разобраться с графой "Ночь", т.е. с учетом ночных часов работы, видимо они оплачиваются отдельно. Дело хорошее, строго соответствует КЗОТ, поэтому надо что то придумывать. Условие такое: ночные часы считаются с 22.00 и рабочий день заканчивается в 24.00. За основу возьмем выше приведенную формулу.



=ЕСЛИ(ЕОШ(НАЙТИ("\";B7;1));0;ЕСЛИ(ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))>22;ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))-22;0)-ЕСЛИ(ЗНАЧЕН(ПСТР(B7;1;НАЙТИ("\";B7;1)-1))<22;0;ЗНАЧЕН(ПСТР(B7;1;НАЙТИ("\";B7;1)-1))))

Фрагмент формулы



ЕСЛИ(ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))>22;

проверяет оканчивается ли рабочий день в ночные часы, т.е. после 22.00.

Фрагмент формулы



ЕСЛИ(ЗНАЧЕН(ПСТР(B7;1;НАЙТИ("\";B7;1)-1))<22;

проверяет начинается ли рабочий день в ночные часы, т.е. после 22.00. В зависимости от результата проверки указанные фрагменты возвращают либо "0" либо часы начала и конца работы в ночное время. Далее берется разница этих значений.



ЕСЛИ(ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))>22;ЗНАЧЕН(ПСТР(B7;НАЙТИ("\";B7;1)+1;2))-22;0)-ЕСЛИ(ЗНАЧЕН(ПСТР(B7;1;НАЙТИ("\";B7;1)-1))<22;0;ЗНАЧЕН(ПСТР(B7;1;НАЙТИ("\";B7;1)-1)))


Полученную формулу копируем в дополнительные расчетные ячейки.

ночные часы

Далее осталось только просуммировать часы работы за месяц и ночные часы. Это уже совсем просто.

часы работы в месяц

Ограничения к применению.

1. В табеле не менять стиль заполнения рабочего времени, особенно это касается знака "\" по нему идет поиск и преобразование текстовых значений часов в числовые. Часы могут заполняться двух или одно-значными цифрами.

2. Формулы рассчитаны на приведенный график работы т.е. рабочий день с 8.00 до 24.00, после 22.00 считается ночное время, если график выйдет за указанные значения возможны ошибки.

Архив с файлом примера можно скачать.

понедельник, 27 июня 2011 г.

Защита ячеек

Пару дней назад получил вопрос.

"Задача поставлена так, в ячейку забиваю число "1" и блокируется строка и данные забитые в строке изменить нельзя
а если в ячейку забиваю число "0" то в строке можно работать и изменять данные. Как это можно сделать?"

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

Рассмотрим сначала, как в принципе создать такую защиту.

Я для этого использую стандартную процедуру проверки вводимых значений. Стоя на определенной ячейке выбрать пункт меню "Данные" - "Проверка", откроется окно "Проверка вводимых значений". На вкладке параметры установить условия проверки согласно рисунка.

проверка вводимых значений

Суть этих условий - запрет ввода в ячейку любого текста длина которого больше или равна нулю. Понятно, что такого текста в природе не существует, значит мы защитили ячейку от случайного изменения.

Конечно, эта защита имеет ряд недостатков: во-первых ее легко убрать, во-вторых она не защищает от копирования данных в ячейку, т.е. срабатывает только при ручном вводе с клавиатуры, однако в качестве защиты от случайного, непреднамеренного изменения вполне сгодится.

Чтобы управлять этой защитой необходимо найти способ изменения значения параметра "Максимум"=0. Это можно сделать при помощи функции ЕСЛИ(), образец на рисунке ниже.

проверка вводимых значений

Логика формулы



=ЕСЛИ(B1=1;0;257)

следующая. Если значение ячейки B1 равно "1" то формула возвращает "0", т.е. длина текста задается меньше нуля - ячейка A1 заблокирована для ввода. Если значение ячейки B1 равно "0" или "пусто" то формула возвращает "257", т.е. длина текста вводимого в ячейку A1 меньше 257 знаков и ячейка разблокируется. Проверяем.

блокировка ячейки

Все работает. Вот такой вариант блокировки ячейки. Чтобы заблокировать строку, надо указать такие условия для нужных ячеек в строке.


Для начинающих. Условия на ячейку совсем необязательно создавать для каждой ячейки. Достаточно создать для одной, а потом скопировать их на другие ячейки, используя меню "Правка" - "Специальная вставка" - "Условия на значения" см. рисунок ниже.

специальная вставка

Однако, при копировании, надо помнить, что адрес ячейки управления B1 будет изменяться точно так, как и при копировании формул. Если это не надо, допустим, вы хотите одной ячейкой управлять блокировкой целой таблицы, то адрес ячейки надо задать абсолютным $B1$. В общем, те же правила что и при копировании формул.

Архив с файлом примера можно скачать.

P.S. Кстати, этот вопрос напомнил мне одну старинную тему разработки еще 2004 года - управление списками.