Я работаю над этим проектом некоторое время, и у меня ничего не получается, поэтому я решил, что спрошу вас, ребята. Есть несколько задач: цитирование, привязка, выдача ... и каждая из них имеет собственное время ответа.
Котировка должна быть произведена в течение 3 часов, привязка - 8 часов, а срок оформления - 2 дня. Но проблема в том, что время ответа основано только на времени с 9:00 до 20:00 (расчетное время), исключая выходные и праздничные дни. У меня есть справочная таблица по праздникам, а также время выполнения задач, проиндексированных из другой справочной таблицы.
Часть, в которой я застрял, связана с «остановкой часов» и переводом времени ответа задачи на следующий день, если это после 8:00 вечера.
Это формула, которую я создал для этого, но она не работает должным образом, потому что она будет показывать то же время, если я изменил Time на (48,0,0) для выдачи или Time (8,0,0) для привязки. . В столбце P3 указано время начала.
=IF(AND(TEXT(P3,"dddd") = "Friday",HOUR(P3)+MINUTE(P3)/60+SECOND(P3)/(60*60)>17),P3+TIME(15,0,0)+DAY(2),IF(HOUR(P3)+MINUTE(P3)/60+SECOND(P3)/(60*60)>17,P3+TIME(15,0,0),P3+Time(3,0,0)))
Спасибо! Любая помощь будет принята с благодарностью, ребята!
Да, @JoshJay, но я новичок, когда дело доходит до VBA, но я пытаюсь изучить функции, а также продолжаю искать идеи в Интернете
Вот вам для начала непроверенный и не полностью реализованный код:
Function GetTurnaroundDateAndTime(TaskType As String, StartTime As Date, TaskTimeRange As Range, HolidayLookupRange As Range)
Dim taskTime As Double
Dim dayBegin As Double 'could be a parameter
Dim dayEnd As Double 'could be a parameter
Dim result As Date
Dim isValid As Boolean
Dim offset As Double
dayBegin = 9 'could be a parameter
dayEnd = 20 'could be a parameter
offest = 0
'Get Task Time in hours
taskTime = GetTaskTime(TaskType, TaskTimeRange)
'Calculate initial turnaround time (without regard to nights/weekends/holidays)
result = DateAdd("h", taskTime + offset, StartTime)
'check if it's a valid turnaround date and time, return if so
isValid = False
Do While isValid = False
'check #1 - is the turnaround time before the day begins?
If Hour(result) < 9 Then
If Hour(StartTime) < 20 Then
offset = offset - 20 + Hour(StartTime) 'check to see if a portion of the task time would be before end of day, subtract this amount from the offset
End If
offset = offset + 9 = Hour(result) 'gets the offset to the beginning of day
ElseIf Weekday(result, vbSaturday) = 1 Then
offset = offset + 48 'if we're on a Saturday, add two days
ElseIf Weekday(result, vbSunday) = 1 Then
offset = offset + 24 'if we're on a Sunday, add one day
ElseIf IsHoliday(result, HolidayLookupRange) Then
offset = offset + 24 'if we're on a holiday, add one day
Else
isValid = True
End If
result = DateAdd("h", taskTime + offset, StartTime) 're-evaluate result
Loop
GetTurnaroundDateAndTime = result
End Function
Function GetTaskTime(TaskType As String, TaskTimeRange As Range) As Double
'TODO: implement function to lookup the task time from the table
GetTaskTime = 3
End Function
Function IsHoliday(DateToLookup As Date, HolidayLookupRange As Range) As Boolean
'TODO: implement function to lookup if date is a holiday
IsHoliday = False
End Function
Вот несколько ссылок, которые помогут вам начать работу с VBA:
Вы захотите протестировать множество различных сценариев, прежде чем почувствуете себя комфортно с кодом. Я просто быстро собрал что-нибудь!
вау, это выглядит сложно. Обязательно постараюсь это узнать, обновлю вас!
Звучит как очень сложная вещь в Excel! Можете ли вы использовать пользовательскую функцию VBA? Это потребует, чтобы книга была книгой с поддержкой макросов.