Як обчислити передбачувані моменти за 8 годин робочих днів


-2

У своєму робочому аркуші я хочу обчислити орієнтовний час закінчення процесів, враховуючи часові рамки робочого дня.

Припустимо робочі дні з 8:00 до 17:00 та опустіть суботу та неділю.

Так, наприклад, коли я додаю 4 години до 14:00, я не хочу, щоб результат був 18:00, але 9:00 (3 години веде вас до кінця робочого дня, остання година починається наступного робочого дня ).

Хтось може мені допомогти?

EDIT -

За допомогою Саймона в rcl мені вдалося адаптувати його рішення для обчислення з хвилинами. Однак, здається, є проблема. Коли я додаю

960 хвилин до 22-05-15 16:00 функція дає правильний результат 26-05-15 14:00

однак, за годину додатково (60 хвилин) результат змінюється назад до 25-05-15 09:00.

Хтось бачить тут проблему?

Option Explicit

Public Function EndDayTimeM(StartTime As String, Minutes As Double)

On Error GoTo Hell
' start and end hour are fixed here.
' could put them in cells and look them up
Dim startMinute As Long, endMinute As Long, startHour As Long, endHour As Long

startMinute = 480

endMinute = 960 ' was 18

startHour = 8

endHour = 16

Dim calcEnd As Date, start As Date
start = CDate(StartTime)
calcEnd = DateAdd("n", Minutes, start)

If DatePart("h", calcEnd) > endHour Or DatePart("h", calcEnd) <= startHour Then
    ' add 15 hours to get from 17+x to 8+x
    calcEnd = DateAdd("h", 15, calcEnd)  ' corrected

End If

If DatePart("w", calcEnd) = 7 Or DatePart("w", calcEnd) = 1 Then
    ' Sat or Sun: add 2 days
    calcEnd = DateAdd("d", 2, calcEnd)
End If

If DatePart("h", calcEnd) > endHour Or DatePart("h", calcEnd) <= startHour Then
    ' add 15 hours to get from 17+x to 8+x
    calcEnd = DateAdd("h", 15, calcEnd)  ' corrected
End If

EndDayTimeM = calcEnd

GoTo Ret

Hell:
EndDayTimeM = Err.Description
Ret:

End Function

1
А як бути, якщо це п’ятниця? Ви хочете 09:00 у понеділок?
симон у rcl

@simon у rcl так, будь ласка!
Аржен ван дер Валк

Відповіді:


1

У Excel перейдіть на вкладку Стрічки для розробників і натисніть Visual Basic. Вікно Visual Basic

Клацніть правою кнопкою миші проект VBA (окреслений червоним кольором) та виберіть Вставити, а потім - Модуль. Це додасть Module1 до проекту нижче VBAProject. Двічі клацніть на Module1.

Виберіть панель праворуч і вставте наступний код у:

Option Explicit

Public Function EndDayTime(StartTime As String, Hours As Double)

    On Error GoTo Hell
    ' start and end hour are fixed here. 
    ' could put them in cells and look them up
    Dim startHour As Long, endHour As Long
    startHour = 8

    endHour = 17 ' was 18

    Dim calcEnd As Date, start As Date
    start = CDate(StartTime)
    calcEnd = DateAdd("h", Hours, start)

    If DatePart("h", calcEnd) > endHour Or DatePart("h", calcEnd) <= startHour Then
        ' add 15 hours to get from 17+x to 8+x
        calcEnd = DateAdd("h", 15, calcEnd) ' corrected

    End If

    If DatePart("w", calcEnd) = 7 Or DatePart("w", calcEnd) = 1 Then
        ' Sat or Sun: add 2 days
        calcEnd = DateAdd("d", 2, calcEnd)
    End If

    EndDayTime = calcEnd

    GoTo Ret

Hell:
    EndDayTime = Err.Description
Ret:

End Function

Потім ви можете використовувати його на своєму робочому аркуші наступним чином: EndDayTime у стовпці С У цьому прикладі у мене є DateTime, який я ввів у A2, кілька годин у B2 ... B8, а стовпець C має функцію EndDayTime, використовуючи Ax і Bx. У колонці A після рядка 2 вона просто копіює C [рядок - 1], тому попередній кінець стає наступним початком

Ура -

EDIT: Виправлений код за часом закінчення 17, а не 18.


Читаючи, я бачу, що я неправильно закінчив годину. Просто змініть код з endHour = 18 на endHour = 14, а calcEnd = DateAdd ("h", 14, calcEnd) на calcEnd = DateAdd ("h", 15, calcEnd). Ви також повинні змінити коментар ....
simon у rcl

ви можете мені знову допомогти? Я ніколи не займався програмуванням VBA, тому я не знаю, як самостійно адаптувати ваш код. В даний час, коли я використовую вашу функцію, це відбувається: 08-05-15 09:00 9 08-05-15 18:00 Однак завтра субота, тому я хочу, щоб вона змінилася на 11-05-15 9:00 , чи знаєте ви, чи можливо це працювати і з хвилинами? тож коли я додаю 4,5 години, він повинен додати 4:30? Вибачте за моє незрозуміле початкове запитання! І заздалегідь дякую!
Аржен ван дер Валк

Якщо ви поставите 4.5, він повинен працювати належним чином. Вам потрібно змінити час закінчення з 18 на 17, як я вже говорив у своєму попередньому коментарі. Код тепер редагується для правильного часу закінчення.
simon at rcl

Чудово! У мене було одне останнє питання і вирішив його сам. Коли час закінчення встановлено на 17, час закінчення може отримати більше 17:00 (так 17:20) Коли час закінчення встановлено на 16, це питання вирішується! багато спасибі!
Аржен ван дер Валк

добре, я подумав, що це спрацювало: але коли я додаю 6,4 до 15.05.2015 16:07, я отримую 11-05-15 13:07. Тож функція може обчислювати лише цілі числа?
Аржен ван дер Валк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.