Рассмотрим наглядный пример работы на поминутной шкале. Для удобства восприятия возьмем что-нибудь с небольшими числами (номерами строк). Пусть это будут первые три рабочих дня 2012 года - 10, 11, 12 января. Помним, что у нас рабочий день разбивается на 2 интервала: 08:30-12:00 до обеда и 13:00-17:30 после обеда
Будем искать общее количество рабочего времени, попадающего в интервал времени с началом в 10:45 10 января и окончанием в 15:00 12 января. Сразу в уме прикинем, что должно получиться: 8 ч x 3 дня - 2:15 - 2:30 = 19 ч 15 мин.
Для начала рассчитаем все четыре границы интервалов в минутах от полуночи в пределах одних суток. Затем добавить к этим значениям любое количество полных суток в минутах не составит труда.
Для первой "точки" 08:30 получаем 1440 х 8,5 / 24 = 510. Но 510-я минута от начала суток это на самом деле 60-тисекундный интервал (а не "точка") между (теперь уже именно) точками 8:29 и 8:30. Поэтому 510-я минута нас не очень интресует, так как она не попадает в наш дообеденный интервал. А вот 510+1 = 511-я минута, длящаяся с 8:30 до 8:31, как раз и является первой минутой интервала 08:30-12:00
Для конечной же границы интервала 12:00 всё получается нормально и "лишнюю" минуту добавлять не надо: 1440 х 12 / 24 = 720.
По аналогии для второго (послеобеденного) интервала 13:00-17:30 получаем: 1440 х 13 / 24 + 1= 781 и 1440 х 17,5 / 24 = 1050.
Теперь добавляем к каждой границе полные сутки (в минутах) для каждого из трех дней. Количество полных суток для любого дня в течение года очевидно определяется как номер этого дня от начала года минус один. Поскольку у нас все три дня - январские, то и считать удобно даже в уме.
Для интервала 08:30-12:00 10 января окончательно получаем значения: (10-1) х 1440 + 511 = 13471 минута от начала года и (10-1) х 1440 + 720 = 13680 минут от начала года. И, опуская подробные выкладки, имеем все интервалы за 3 дня в следующем виде: [vba]
Code
10 января: 13471-13680 и 13741-14010 11 января: 14911-15120 и 15181-15450 12 января: 16351-16560 и 16621-16890
[/vba] Теперь уже без деления по числам запишем все 6 получившихся интервалов в едином перечислении через запятую, по ходу превращая их в адреса диапазонов столбца A путем добавления соответствующей буквы и двоеточия: [vba]
[/vba] Посчитаем количество ячеек в получившемся составном диапазоне из 6 областей. Для этого в окне отладки редактора VB исполним оператор (скопируем туда и нажмем Enter): [vba]
[/vba] Получившийся строкой ниже ответ 1440 означает количество рабочих минут в трех рабочих днях 10-12 января. Проверяем: 3 дня х 8 часов х 60 минут = 1440. Что ж, пока всё правильно.
Рассчитаем минутные границы нашего проверяемого интервала 10:45 10 января - 15:00 12 января. Опуская промежуточные выкладки, сразу получим интервал в форме диапазона: [vba]
Code
Range("A13606:A16740")
[/vba] Немного усложним ранее исполненный оператор, придав ему следующий вид: [vba]
[/vba] После исполнения и этого оператора в окне отладке получим значение: 1155. Деля его нацело на 60, получаем 19 (количество полных часов) и остаток от деления 15 (количество минут сверх полных часов). Итого 19:15. И опять правильно - мы именно так и насчитали в уме в самом начале.
На этом разрешите закончить вторую серию и подумать, будет ли (нужно ли) продолжение.
P.S. Кстати, посмотреть интервалы пересечения можно при помощи свойства Address: [vba]
[/vba] В получившемся списке диапазонов (я его дополнительно разбил построчно) можно увидеть, что 4 внутренних полностью совпадают с соответствующими фрагментами исходного списка, а два крайних отличаются одной из границ (по понятным причинам): [vba]
Code
A13606:A13680, (первая граница соответствует времени 10:45 10 января) A13741:A14010, A14911:A15120, A15181:A15450, A16351:A16560, A16621:A16740 (вторая граница соответствует времени 15:00 12 января)
Рассмотрим наглядный пример работы на поминутной шкале. Для удобства восприятия возьмем что-нибудь с небольшими числами (номерами строк). Пусть это будут первые три рабочих дня 2012 года - 10, 11, 12 января. Помним, что у нас рабочий день разбивается на 2 интервала: 08:30-12:00 до обеда и 13:00-17:30 после обеда
Будем искать общее количество рабочего времени, попадающего в интервал времени с началом в 10:45 10 января и окончанием в 15:00 12 января. Сразу в уме прикинем, что должно получиться: 8 ч x 3 дня - 2:15 - 2:30 = 19 ч 15 мин.
Для начала рассчитаем все четыре границы интервалов в минутах от полуночи в пределах одних суток. Затем добавить к этим значениям любое количество полных суток в минутах не составит труда.
Для первой "точки" 08:30 получаем 1440 х 8,5 / 24 = 510. Но 510-я минута от начала суток это на самом деле 60-тисекундный интервал (а не "точка") между (теперь уже именно) точками 8:29 и 8:30. Поэтому 510-я минута нас не очень интресует, так как она не попадает в наш дообеденный интервал. А вот 510+1 = 511-я минута, длящаяся с 8:30 до 8:31, как раз и является первой минутой интервала 08:30-12:00
Для конечной же границы интервала 12:00 всё получается нормально и "лишнюю" минуту добавлять не надо: 1440 х 12 / 24 = 720.
По аналогии для второго (послеобеденного) интервала 13:00-17:30 получаем: 1440 х 13 / 24 + 1= 781 и 1440 х 17,5 / 24 = 1050.
Теперь добавляем к каждой границе полные сутки (в минутах) для каждого из трех дней. Количество полных суток для любого дня в течение года очевидно определяется как номер этого дня от начала года минус один. Поскольку у нас все три дня - январские, то и считать удобно даже в уме.
Для интервала 08:30-12:00 10 января окончательно получаем значения: (10-1) х 1440 + 511 = 13471 минута от начала года и (10-1) х 1440 + 720 = 13680 минут от начала года. И, опуская подробные выкладки, имеем все интервалы за 3 дня в следующем виде: [vba]
Code
10 января: 13471-13680 и 13741-14010 11 января: 14911-15120 и 15181-15450 12 января: 16351-16560 и 16621-16890
[/vba] Теперь уже без деления по числам запишем все 6 получившихся интервалов в едином перечислении через запятую, по ходу превращая их в адреса диапазонов столбца A путем добавления соответствующей буквы и двоеточия: [vba]
[/vba] Посчитаем количество ячеек в получившемся составном диапазоне из 6 областей. Для этого в окне отладки редактора VB исполним оператор (скопируем туда и нажмем Enter): [vba]
[/vba] Получившийся строкой ниже ответ 1440 означает количество рабочих минут в трех рабочих днях 10-12 января. Проверяем: 3 дня х 8 часов х 60 минут = 1440. Что ж, пока всё правильно.
Рассчитаем минутные границы нашего проверяемого интервала 10:45 10 января - 15:00 12 января. Опуская промежуточные выкладки, сразу получим интервал в форме диапазона: [vba]
Code
Range("A13606:A16740")
[/vba] Немного усложним ранее исполненный оператор, придав ему следующий вид: [vba]
[/vba] После исполнения и этого оператора в окне отладке получим значение: 1155. Деля его нацело на 60, получаем 19 (количество полных часов) и остаток от деления 15 (количество минут сверх полных часов). Итого 19:15. И опять правильно - мы именно так и насчитали в уме в самом начале.
На этом разрешите закончить вторую серию и подумать, будет ли (нужно ли) продолжение.
P.S. Кстати, посмотреть интервалы пересечения можно при помощи свойства Address: [vba]
[/vba] В получившемся списке диапазонов (я его дополнительно разбил построчно) можно увидеть, что 4 внутренних полностью совпадают с соответствующими фрагментами исходного списка, а два крайних отличаются одной из границ (по понятным причинам): [vba]
Code
A13606:A13680, (первая граница соответствует времени 10:45 10 января) A13741:A14010, A14911:A15120, A15181:A15450, A16351:A16560, A16621:A16740 (вторая граница соответствует времени 15:00 12 января)
Друзья,помогите дилетанту... Не получается формула расчёта ночных часов, а именно: А1=20:00 10.08.13- время начала работы В1=7:00 11.08.13 - время окончания работы С1= - кол-во ночных часов, если учитывается ночное время с 22:00 до 6:00, т.е. С1 должно быть равно 8:00
Заранее спасибо
Друзья,помогите дилетанту... Не получается формула расчёта ночных часов, а именно: А1=20:00 10.08.13- время начала работы В1=7:00 11.08.13 - время окончания работы С1= - кол-во ночных часов, если учитывается ночное время с 22:00 до 6:00, т.е. С1 должно быть равно 8:00
VovkaPIG, Ваш вопрос не имеет отношения к данной теме. К тому же Правилами форума запрещено задавать новые вопросы в чужих темах. Создайте свою тему
VovkaPIG, Ваш вопрос не имеет отношения к данной теме. К тому же Правилами форума запрещено задавать новые вопросы в чужих темах. Создайте свою темуPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816