내 워크시트에서 프로세스의 예상 종료 시간을 계산하고 싶습니다.
그러나 나는 이것을 미리 정해진 시간 제약으로 제한하고 싶습니다. 예를 들어 14시에 4시간을 추가하면 결과가 18시가 아니라 9시가 되기를 바랍니다.
근무일은 8:00 - 17:00라고 가정합니다. 그리고 토요일, 일요일은 생략하고
누구든지 나를 도와줄 수 있나요?
rcl의 Simon의 도움으로 나는 그의 솔루션을 몇 분 만에 계산할 수 있도록 조정했습니다. 그러나 문제가 있는 것 같습니다. 내가 추가할 때
22-05-15 16:00까지 960분 동안 이 함수는 26-05-15 14:00의 올바른 결과를 제공합니다.
그러나 1시간 추가(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
답변1
다음은 원하는 작업을 수행하고 완전히 구성 가능합니다. 또한 Excel에서 숫자 날짜+시간으로 인식하는 한 모든 입력 또는 출력 형식을 지원합니다. 근무 시간/요일의 시작 또는 종료를 설정할 수 있습니다.
Public Function EndDayTimeM(StartTime As Double, Minutes As Long)
Dim rangeH, numH, rangeD, numD, startD, durW, durD, durH, durM, startW, endW, remTime As Long
Dim startH, endDate As Double
rangeH = 8 ' Starting hour of working day
numH = 9 ' Length of working day in hours
rangeD = 2 ' Starting day of working week
numD = 5 ' Length of working week in days
' Calculates offset from 00:00 Monday in starting week
startW = Fix(StartTime) - DatePart("w", StartTime)
startD = DatePart("w", StartTime) - rangeD
startH = (StartTime - Fix(StartTime)) * 24
' Calculates end time in working weeks, hours, minutes
remTime = Minutes + (startD * numH * 60) + ((startH - rangeH) * 60)
durW = Fix(remTime / 60 / numH / numD)
remTime = remTime - (durW * numD * numH * 60)
durD = Fix(remTime / 60 / numH)
remTime = remTime - durD * 60 * numH
durH = Fix(remTime / 60)
remTime = remTime - durH * 60
durM = remTime
' Converts working weeks into calendar weeks
endDate = startW + durW * 7 + rangeD + durD + (rangeH + durH) / 24 + durM / 1440
EndDayTimeM = endDate
End Function
답변2
이런 게 있으면 더 좋을 것 같아요 -
Public Function EndDayTimeM(StartTime As String, Minutes As Double)
Dim begintime As Date
begintime = CDate(starttime)
Dim startminutes As Double
startminutes = Hour(starttime) * 60 + Minute(starttime)
Dim x As Integer
x = startminutes + minutes
Dim endtime As Date
If x < 1020 Then
endtime = DateAdd("n", minutes, begintime)
MsgBox (endtime)
End If
If x > 1020 Then
If Weekday(begintime, vbMonday) = 5 Then
endtime = DateAdd("y", 3, begintime)
Else: endtime = DateAdd("y", 1, endtime)
End If
endtime = DateAdd("n", minutes, endtime)
endtime = DateAdd("n", -480, endtime)
MsgBox (endtime)
End If
End function
답변3
실제로 반대 투표를 받은 이전 답변에서 제가 말한 내용은 다음과 같습니다.
Public Function EndDayTimeM(StartTime As String, Minutes As Double)
Dim start As Date, starthour As Date, endhour As Date, minutes2 As Date
start = CDate(StartTime)
minutes2 = DateAdd("n", Minutes, 0)
starthour = 8 / 24 'working day starts at 8
endhour = 16 / 24 'working day ends at 16, wasn't it 17?
While minutes2 > 0 'while we have time remaining
If Weekday(start, vbMonday) < 6 Then 'if it's a weekday
EndDayTimeM = start + minutes2 'it ends at the date (soonest possible)
minutes2 = start + minutes2 - CDate(Int(start) + endhour) 'the remaining minutes as a difference between the sum of start and norm minus the end of the day
start = Int(start) + 1 + starthour 'next start is tomorrow's starting
Else
start = start + 1 'if weekend, skip a day
End If
Wend
End Function