काम के घंटे और लंघन सप्ताहांत के साथ अंत समय की गणना


0

अपनी वर्कशीट में, मैं प्रक्रियाओं के अनुमानित अंत समय की गणना करना चाहता हूं।

हालाँकि, मैं इसे पूर्वनिर्धारित समय की कमी के लिए प्रतिबंधित करना चाहता हूँ। इसलिए उदाहरण के लिए, जब मैं 4 घंटे 14:00 तक जोड़ता हूं, तो मैं नहीं चाहता कि परिणाम 18:00 हो, लेकिन 9:00!

8:00 - 17:00 के कार्य दिवसों को मानते हुए। और शनिवार और रविवार को छोड़ देना

क्या कोई मेरी मदद कर सकता है?

आरसीएल में साइमन की मदद से मैं मिनटों के साथ गणना करने के लिए अपने समाधान को अनुकूलित करने में कामयाब रहा। हालांकि, वहाँ एक समस्या होने लगती है। जब मैं जोड़ता हूं

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

1
अगर मैं आज सुबह 9 बजे आपके फ़ंक्शन का उपयोग करता हूं और एक तर्क 479 मिनट का है, तो यह सही है, लेकिन 480 मिनट 1700 से 2300. 6 घंटे तक रुक जाता है।
रेस्टाफैरियन

@Raystafarian के उद्देश्य से हाँ, क्योंकि मैं सुबह 8:00 बजे तक छोड़ने का अंतिम समय चाहता हूं
Arjen van der Valk

जवाबों:


1

निम्नलिखित वह करेगा जो आप चाहते हैं और पूरी तरह से कॉन्फ़िगर करने योग्य है, इसके अलावा यह किसी भी इनपुट या आउटपुट प्रारूप का समर्थन करता है जब तक कि एक्सेल अभी भी इसे संख्यात्मक तारीख + समय के रूप में समझता है। आप अपने काम के घंटे / दिनों के लिए कोई भी शुरुआत या अंत निर्धारित कर सकते हैं।

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

1

आप इस तरह से कुछ के साथ बेहतर होगा -

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

आपको धन्यवाद! मुझे लगता है कि यह काम करता है, मुझे अपने उद्देश्य के लिए मेसोबॉक्स की आवश्यकता नहीं है
Arjen van der Valk

1
ठीक है, हाँ, बस इसे अपने लक्ष्य में बदलें। मैंने इसका इस्तेमाल अवधारणा के प्रमाण के लिए किया।
रेस्टाफैरियन

ओह, माफ करना, मैं देख रहा हूँ! यह भी एक अच्छा समाधान
Arjen van der Valk

1

मैं अपने पिछले उत्तर के बारे में बात कर रहा था जो व्यवहार में नीचे आया,:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.