メモ

主にプログラミング系の備忘録

Accessで使えるWorkDay関数

たぶん出典元はここ。
http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm#Access

「M_休日」テーブル内の「休日」フィールド(日付型)に、
土日以外の休日が登録されている前提です。
元ネタの方が営業日の正負分岐の書き方がいい感じ。
土日以外で休日指定したい方はIsHoliday内のIf文をメンテしてください。
しかし重い。軽量化できないものか。

Option Compare Database

Public Function IsHoliday(dDate As Variant) As Boolean
  On Error GoTo Err_Trap
'日付型の引数の場合はFalseを返す
  If IsDate(dDate) = False Then
    IsHoliday = False
    Exit Function
  End If
  
  If Weekday(dDate) = 1 Or Weekday(dDate) = 7 Or DCount("*", "M_休日", "休日=#" & dDate & "#") Then
    IsHoliday = True
  Else
    IsHoliday = False
  End If
  
Exit Function

Err_Trap:
  'エラー発生時はFalseを返す
  IsHoliday = False
  Exit Function
End Function

Public Function WorkDay(dStartDate As Date, nWeight As Long)
  Dim dDate As Date
  Dim i As Long
  dDate = dStartDate
  i = 0
  
  If nWeight > 0 Then
    Do Until i = nWeight
      dDate = dDate + 1
      If IsHoliday(dDate) = False Then i = i + 1
    Loop
        
  Else
    Do Until i = nWeight
      dDate = dDate - 1
      If IsHoliday(dDate) = False Then i = i - 1
    Loop
  End If
  
  WorkDay = dDate

End Function