2017-12-21 7 views
0

인터넷에서이 기능을 받았습니다. 지금까지 일을 계산할 때 잘 지내고 있지만 날짜가 다른 해가되면 결과가 잘못됩니다. 예 : 그것은 육일 있어야 할 때DateDiff 잘못된 결과 결과

dateFrom = "2017-12-26" 
dateTo = "2018-01-02" 

결과는 28 일입니다 것입니다.

Public Function NetWorkdays(dtStartDate, dtEndDate, arrHolidays) 
    Dim lngDays 
    Dim lngSaturdays 
    Dim lngSundays 
    Dim lngHolidays 
    Dim lngAdjustment 
    Dim dtTest 
    Dim i, x 

    lngDays = DateDiff("d", dtStartDate, dtEndDate) 
    lngSundays = DateDiff("ww", dtStartDate, dtEndDate, vbSunday) 
    lngSaturdays = DateDiff("w", IIf(Weekday(dtStartDate, vbSunday) = vbSaturday, dtStartDate, dtStartDate - Weekday(dtStartDate, vbSunday)), dtEndDate) 

    For x = LBound(arrHolidays) To UBound(arrHolidays) 
     For i = 0 To lngDays 
      dtTest = DateAdd("d", i, dtStartDate) 
      If arrHolidays(x) = dtTest And Weekday(dtTest) <> 1 And Weekday(dtTest) <> 7 Then 
       lngHolidays = lngHolidays + 1 
      End If 
     Next 
    Next 

    If Weekday(dtStartDate, vbSunday) = vbSunday Or Weekday(dtStartDate, vbSunday) = vbSaturday Then 
     lngAdjustment = 0 
    Else 
     lngAdjustment = 1 
    End If 

    NetWorkdays = lngDays - lngSundays - lngSaturdays - lngHolidays + lngAdjustment 
End Function 

Public Function IIf(expr, truepart, falsepart) 
    If expr Then IIf = truepart Else IIf = falsepart 
End function 

아무도 아무것도 수리 그것을 지적 할 수 : 여기

는 기능입니다? 프로토 타입 형태의 접두사에 의해 indiated으로

+1

무엇을하고 있는지 이해하지 못한다면 사용하지 않을 것입니다. 인터넷에서 코드를 재사용하기 전에 그 코드가 무엇을하는지 분석하고 적절하게 조정합니다. – Lankymart

답변

0
dateFrom = #2017-12-26# 
dateTo = #2018-01-02# 
Msgbox Dateto - datefrom,, "Result" 

반환

--------------------------- 
Result 
--------------------------- 
7 
--------------------------- 
OK 
--------------------------- 
+2

왜 작품에 대답하는지, 그리고 OP가 잘못한 이유를 설명하십시오. 코드 만 대답하면 스택 오버플로에 적합하지 않습니다. –

0

:

Public Function NetWorkdays(dtStartDate, dtEndDate, arrHolidays) 

함수는 날짜가 아닌 문자열을 기대하고있다. 증거 :

Option Explicit 

(copy of function) 

Dim dp, n 
For Each dp In Array(Array("2017-12-26", "2018-01-02")) 
    On Error Resume Next 
    n = NetWorkdays(dp(0), dp(1), Array()) 
    If Err Then n = Err.Description 
    On Error GoTo 0 
    WScript.Echo TypeName(dp(0)), dp(0), dp(1), n 
    dp(0) = CDate(dp(0)) 
    dp(1) = CDate(dp(1)) 
    WScript.Echo TypeName(dp(0)), dp(0), dp(1), NetWorkdays(dp(0), dp(1), Array()) 

Next 

출력 (독일어 로케일) :

cscript 47921079.vbs 
String 2017-12-26 2018-01-02 Typenkonflikt 
Date 26.12.2017 02.01.2018 6 

는 버전, 로케일과 달의 위상에 따라보다 안정적인 뭔가() 호출에서는 CDate을 대체 할 수 있습니다.