Помогите воплотить такое. Есть 2 колонки (формат дата): 1-я начало работ, 2-я окончание работ В 3-й считается между ними разница, дающая длительность работ. Необходимо исключить из длительности нерабочее время. Для определенности рабочее время будни с 8-00 до 17-00 \Время начала работ может попадать сразу в нерабочее время\
Помогите воплотить такое. Есть 2 колонки (формат дата): 1-я начало работ, 2-я окончание работ В 3-й считается между ними разница, дающая длительность работ. Необходимо исключить из длительности нерабочее время. Для определенности рабочее время будни с 8-00 до 17-00 \Время начала работ может попадать сразу в нерабочее время\ALARMus
Сообщение отредактировал ALARMus - Пятница, 03.08.2012, 10:45
Это если все даты одного дня, а если отличаются датой, вплоть до разницы в месяцах.
Я пока домыслил, если дата в колонках отличается, то надо от разницы этих колонок отнимать еще 16 часов для разницы дат в 1 день, 32 часа для разницы дат в 2 дня,... Но пока не знаю как учесть: - выходные - разные месяца (год пока что один) - если начало работ зафиксировано после 17-00, но до 8-00 следующего дня
Вот еще что додумал: 1) если разница дней 0, то просто вычесть конец и начало если разница дней 1, то 17-00 вычесть начало + конец вычесть 8-00 +0 если разница дней 2, то 17-00 вычесть начало + конец вычесть 8-00 +9 если разница дней 3, то 17-00 вычесть начало + конец вычесть 8-00 +18
2) подсчитать количество суббот + воскресений между началом и концом, за каждое найденное количество отнять из результата 1) 9
Только как это реализовать (п.п. 1 и 2) и как узнать количество дней если начало и конец в разных месяцах ? Или я слишком нагромоздил и можно проще ?
Это если все даты одного дня, а если отличаются датой, вплоть до разницы в месяцах.
Я пока домыслил, если дата в колонках отличается, то надо от разницы этих колонок отнимать еще 16 часов для разницы дат в 1 день, 32 часа для разницы дат в 2 дня,... Но пока не знаю как учесть: - выходные - разные месяца (год пока что один) - если начало работ зафиксировано после 17-00, но до 8-00 следующего дня
Вот еще что додумал: 1) если разница дней 0, то просто вычесть конец и начало если разница дней 1, то 17-00 вычесть начало + конец вычесть 8-00 +0 если разница дней 2, то 17-00 вычесть начало + конец вычесть 8-00 +9 если разница дней 3, то 17-00 вычесть начало + конец вычесть 8-00 +18
2) подсчитать количество суббот + воскресений между началом и концом, за каждое найденное количество отнять из результата 1) 9
Только как это реализовать (п.п. 1 и 2) и как узнать количество дней если начало и конец в разных месяцах ? Или я слишком нагромоздил и можно проще ?ALARMus
Сообщение отредактировал ALARMus - Пятница, 03.08.2012, 11:44
воспользовался функцией ЧИСТРАБДНИ и делил ее на 3 - получил общее число рабочих часов (*). Осталось воплотить: (*)- [ДАТА НАЧАЛА - начало этого рабочего дня (8-00)] - [конец этого рабочего дня (17-00) - КОНЕЦ РАБОТ]
Как вычислить то что в [] ?
воспользовался функцией ЧИСТРАБДНИ и делил ее на 3 - получил общее число рабочих часов (*). Осталось воплотить: (*)- [ДАТА НАЧАЛА - начало этого рабочего дня (8-00)] - [конец этого рабочего дня (17-00) - КОНЕЦ РАБОТ]
Вот что удалось пока что. Синие шапки - колонки как видите там где не удается получить нужные цифры А также есть ячейки помеченные зеленым - там время начала и время окончания зафиксированы в нерабочее время !
Вот что удалось пока что. Синие шапки - колонки как видите там где не удается получить нужные цифры А также есть ячейки помеченные зеленым - там время начала и время окончания зафиксированы в нерабочее время !ALARMus
Не совсем правильно получилось. в итоге надо получить в часах чистое время работ, которое считается только в рабочее время Последний мой файл как-то подправить, скорее формат ячеек - но не получается - бесит уже. Там где сплошные решетки нарисовались
Не совсем правильно получилось. в итоге надо получить в часах чистое время работ, которое считается только в рабочее время Последний мой файл как-то подправить, скорее формат ячеек - но не получается - бесит уже. Там где сплошные решетки нарисовались ALARMus
Сообщение отредактировал ALARMus - Пятница, 03.08.2012, 14:24
Чисто вне конкурса, но по теме. Нетрадиционное использование свойств объектов Excel для нужд - в данном случае - подсчета времени. Недавно я подобным образом выступал на другом форуме по вопросу, связанному с датами: http://www.sapboard.ru/forum....p456070
Там мой юмор не очень оценили, а мне понравилось. Надеюсь на бОльшее понимание в эксельном сообществе
Макрос ограничен только текущими сутками, т.е. не учитывает переход через полночь. Но в принципе, следуя основной идее, можно дальше развить как угодно.
[vba]
Code
Sub nonTraditionalTimeCalculate()
Dim tBegPlan As Date Dim tEndPlan As Date Dim tBegFact As Date Dim tEndFact As Date
Dim tOutPlan As Date
Dim addrPlan As String Dim addrFact As String
Dim rngPlan As Range Dim rngFact As Range Dim rngIntesect As Range
tBegPlan = TimeSerial(8, 0, 0) 'официальное начало работы tEndPlan = TimeSerial(17, 0, 0) 'официальное окончание работы
tBegFact = TimeSerial(6, 0, 0) 'фактическое начало работы tEndFact = TimeSerial(19, 0, 0) 'фактическое окончание работы
Set rngPlan = Range(addrPlan) Set rngFact = Range(addrFact)
Set rngIntesect = Application.Intersect(rngPlan, rngFact)
If rngIntesect Is Nothing Then tOutPlan = TimeSerial(0, 0, rngFact.Cells.Count) Else tOutPlan = TimeSerial(0, 0, rngFact.Cells.Count - rngIntesect.Cells.Count) End If
Debug.Print tOutPlan 'общее время вне официального интервала
End Sub
[/vba]
Чисто вне конкурса, но по теме. Нетрадиционное использование свойств объектов Excel для нужд - в данном случае - подсчета времени. Недавно я подобным образом выступал на другом форуме по вопросу, связанному с датами: http://www.sapboard.ru/forum....p456070
Там мой юмор не очень оценили, а мне понравилось. Надеюсь на бОльшее понимание в эксельном сообществе
Макрос ограничен только текущими сутками, т.е. не учитывает переход через полночь. Но в принципе, следуя основной идее, можно дальше развить как угодно.
[vba]
Code
Sub nonTraditionalTimeCalculate()
Dim tBegPlan As Date Dim tEndPlan As Date Dim tBegFact As Date Dim tEndFact As Date
Dim tOutPlan As Date
Dim addrPlan As String Dim addrFact As String
Dim rngPlan As Range Dim rngFact As Range Dim rngIntesect As Range
tBegPlan = TimeSerial(8, 0, 0) 'официальное начало работы tEndPlan = TimeSerial(17, 0, 0) 'официальное окончание работы
tBegFact = TimeSerial(6, 0, 0) 'фактическое начало работы tEndFact = TimeSerial(19, 0, 0) 'фактическое окончание работы
Set rngPlan = Range(addrPlan) Set rngFact = Range(addrFact)
Set rngIntesect = Application.Intersect(rngPlan, rngFact)
If rngIntesect Is Nothing Then tOutPlan = TimeSerial(0, 0, rngFact.Cells.Count) Else tOutPlan = TimeSerial(0, 0, rngFact.Cells.Count - rngIntesect.Cells.Count) End If
Debug.Print tOutPlan 'общее время вне официального интервала
Давно вынашиваю идейку создать отдельную тему, наверное, в "Мозговом штурме"? Хочется полета коллективной фантазии на тему где подобный нетрадиционный подход может быть эффективен для каких-нибудь практических задач. Список этих задач и хочется нафантазировать. Предметные области могут быть самые разнообразные.
До двух задач с периодами времени - этой и на САПфоруме - мой мозг воображал только какой-нибудь план рассадки людей в кинотеатре или в самолете: судите сами, ячейки - прямо готовые "кресла" типа A10 (у окна), B10, C10 (у прохода ). В зависимости от занятых мест можно сформировать при помощи Union сложный многообластный Range и далее что-нибудь с ним сделать в плане объединения (Union) или пересечения (Intersect) с другим Range. Например, выяснить совпадающие (конфликтующие) места двух планов рассадки от разных компаний по продаже билетов...
ALARMus, я дико извиняюсь, что немного "засорил" Вашу тему. Умолкаю с офф-топом. Рисунок, кстати, замечательный! Наглядный.
Quote (Serge_007)
Супер! Я оценил
Спасибо, я знал, что тебе понравится
Давно вынашиваю идейку создать отдельную тему, наверное, в "Мозговом штурме"? Хочется полета коллективной фантазии на тему где подобный нетрадиционный подход может быть эффективен для каких-нибудь практических задач. Список этих задач и хочется нафантазировать. Предметные области могут быть самые разнообразные.
До двух задач с периодами времени - этой и на САПфоруме - мой мозг воображал только какой-нибудь план рассадки людей в кинотеатре или в самолете: судите сами, ячейки - прямо готовые "кресла" типа A10 (у окна), B10, C10 (у прохода ). В зависимости от занятых мест можно сформировать при помощи Union сложный многообластный Range и далее что-нибудь с ним сделать в плане объединения (Union) или пересечения (Intersect) с другим Range. Например, выяснить совпадающие (конфликтующие) места двух планов рассадки от разных компаний по продаже билетов...
ALARMus, я дико извиняюсь, что немного "засорил" Вашу тему. Умолкаю с офф-топом. Рисунок, кстати, замечательный! Наглядный.Gustav