2017-12-21 24 views
0

私はインターネットからこの機能を手に入れました。これまでの数を数えるときはうまくいっていますが、日付が異なる年の場合は結果が間違っています。 例:それは6日となったときに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関数()の呼び出しを交換する必要があります。