Приветствую уважаемое сообщество. Бьюсь над проблемой планирования времени. Прошу помощи.
Пишу на vba. Постараюсь описать суть задачи. Есть рабочее время. Допустим с 8:00 до 17:00. Есть обеденное время с 12:00 до 13:00. Есть переменная calcHrs, которая содержит в себе некоторое количество часов (4, 5, 6, ...). Есть стартовое время startTime, с которого и начинается расчёт. Необходимо расчитать итоговое время resTime, по принципу: resTime = startTime - calcHrs Иными словами resTime - это время в прошлом, с которого прошло calcHrs рабочих часов до startTime времени.
Вроде бы просто. Но здесь имеются подводные камни: 1. Обеденное время не должно учитываться. То есть если результат расчёта попадает на 12:00, нужно вычитать доп.час. 2. Рабочий день ограничен. И если результат расчёта меньше 8:00, необходимо пересчитывать остаток от 17:00 предыдущего дня.
Покажу на примерах.
Пример #1 startTime = 10:00 calcHrs = 4 resTime = 15:00. Почему resTime = 15:00? Потому что до 8:00 2 часа, и значит остаток нужно считать с конца предыдущего дня. То есть 17:00 - 2 оставшихся часа. ----- Пример #2 startTime = 14:00 calcHrs = 5 resTime = 8:00. Почему resTime = 8:00? Потому что с 14-ти до 13-ти проходит час, и не учитывается обед. То есть оставшиеся 4 часа продолжают вычитаться с 12:00, минуя промежуток 12:00-13:00.
Ну и, собственно, главный вопрос. Как уложить всю эту логику в формулу или код? Я чувствую, что существует очень лаконичное решение, может быть даже из области высшей математики. Но честно не знаю как сделать просто. Такая вот интересная задача. Сейчас выполнил в коде Vba только лишь для calcHrs = 5,6,7. При иных значения всё ломается. Да и решение это использует всякие GoTo переходы. Некрасиво в общем. Как бы вы реализовали решение?
Приветствую уважаемое сообщество. Бьюсь над проблемой планирования времени. Прошу помощи.
Пишу на vba. Постараюсь описать суть задачи. Есть рабочее время. Допустим с 8:00 до 17:00. Есть обеденное время с 12:00 до 13:00. Есть переменная calcHrs, которая содержит в себе некоторое количество часов (4, 5, 6, ...). Есть стартовое время startTime, с которого и начинается расчёт. Необходимо расчитать итоговое время resTime, по принципу: resTime = startTime - calcHrs Иными словами resTime - это время в прошлом, с которого прошло calcHrs рабочих часов до startTime времени.
Вроде бы просто. Но здесь имеются подводные камни: 1. Обеденное время не должно учитываться. То есть если результат расчёта попадает на 12:00, нужно вычитать доп.час. 2. Рабочий день ограничен. И если результат расчёта меньше 8:00, необходимо пересчитывать остаток от 17:00 предыдущего дня.
Покажу на примерах.
Пример #1 startTime = 10:00 calcHrs = 4 resTime = 15:00. Почему resTime = 15:00? Потому что до 8:00 2 часа, и значит остаток нужно считать с конца предыдущего дня. То есть 17:00 - 2 оставшихся часа. ----- Пример #2 startTime = 14:00 calcHrs = 5 resTime = 8:00. Почему resTime = 8:00? Потому что с 14-ти до 13-ти проходит час, и не учитывается обед. То есть оставшиеся 4 часа продолжают вычитаться с 12:00, минуя промежуток 12:00-13:00.
Ну и, собственно, главный вопрос. Как уложить всю эту логику в формулу или код? Я чувствую, что существует очень лаконичное решение, может быть даже из области высшей математики. Но честно не знаю как сделать просто. Такая вот интересная задача. Сейчас выполнил в коде Vba только лишь для calcHrs = 5,6,7. При иных значения всё ломается. Да и решение это использует всякие GoTo переходы. Некрасиво в общем. Как бы вы реализовали решение?Cere6ellum
Сообщение отредактировал Cere6ellum - Суббота, 29.05.2021, 14:45
То есть даты не учитываем, работаем в пределах одних суток от стартового времени? И количество часов всегда целое? Просила же побольше примеров...
То есть даты не учитываем, работаем в пределах одних суток от стартового времени? И количество часов всегда целое? Просила же побольше примеров... Pelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
То есть даты не учитываем, работаем в пределах одних суток от стартового времени? И количество часов всегда целое? Просила же побольше примеров...
Даты не учитываем, чтобы не нагружать пример. Я их учитываю у себя в коде. Здесь намеренно не указал. Числа тоже целые, это тоже не проблема всё. Поэтому и указал именно так, чтобы сосредоточиться лишь на логике.
То есть даты не учитываем, работаем в пределах одних суток от стартового времени? И количество часов всегда целое? Просила же побольше примеров...
Даты не учитываем, чтобы не нагружать пример. Я их учитываю у себя в коде. Здесь намеренно не указал. Числа тоже целые, это тоже не проблема всё. Поэтому и указал именно так, чтобы сосредоточиться лишь на логике.Cere6ellum