【Excel/VBA】土日祝日を判定して営業日を取得する方法

Excel/VBA

本日は日付を渡して土日祝日だった場合はその次の営業日を取得する方法です。連休だったり企業独自の休日にも対応。基本ベースは後ろ倒しで作成してますが、場合によって前倒し等も対応可能。

スポンサーリンク

土日かどうかを判定する:Weekday


平日なのか土日なのかの判定だけならWeekdayを使うだけなのでとっても簡単なお仕事です。

構文①:Weekday(日付)

渡した日付の曜日を1(日曜)~7(土曜)の値で返します。

      曜日  
1日曜
2月曜
3火曜
4水曜
5木曜
6金曜
7土曜

使用例↓

構文②:Weekday(日付,曜日の始まり値)

曜日の始まり値を設定する事も出来て、設定するとその曜日を1として対応する値を返します。

使用例↓

月曜始まり(2)に設定すれば、その日付が土曜なら6を返し日曜なら7を返す訳です。


土日かどうかだけならこれで十分ですが祝日等を除く営業日を求める場合、単純に日曜日ならその次の日 みたいにしてしまうと月曜日が祝日の場合NGなので、下記マクロを作成してみた。

土日祝日を判定して営業日を返すコード:GetWorkDate2020


先程のWeekDayとの合わせ。コピペでそのまま使えます。

Public Function GetWorkDate2020(targetDate As Date) As Date

  ' 祝日
  Dim arrHoliday() As Variant ' ①祝日配列
  arrHoliday = Array("2020/01/01", "2020/01/13", "2020/02/11", "2020/02/23", "2020/02/24", "2020/03/20", "2020/04/29", "2020/05/03", "2020/05/04", "2020/05/05", "2020/05/06", "2020/07/23", "2020/07/24", "2020/08/10", "2020/09/21", "2020/09/22", "2020/11/03", "2020/11/23")


  ' 土日または祝日の場合
  Do While UBound(Filter(arrHoliday, targetDate)) = 0 Or Weekday(targetDate, 2) > 5 ' ②営業日判定
        targetDate = DateAdd("d", 1, targetDate) ' ③日付インクリメント
  Loop
  
  ' 返却値
  GetWorkDate = targetDate
 
End Function

簡単に解説

 

①祝日配列

2020年の祝日一覧を配列化。無理にここに持たなくてもシートとかに保存しても良いかも。VariantにしてるのはArrayで突っ込む為。その会社独自の記念日とかの休みもここに入れとけば祝日判定してくれます。

②判定部分

祝日を詰め込んだ配列にフィルターを掛けて要素数を取得していて、祝日配列の中にその日付があれば0を返します。
配列にいない場合は先程のWeekDayを用いて6以上の場合(=土曜か日曜)で判定を行う。

③日付インクリメント

土日祝日判定されてここに落ちてきた場合、その日付にDateAddで一日してもう一度判定…を繰り返し、平日であると判定されれば脱出し、その日付を返す訳です。
1でインクリメントしてますが、-1でデクリメントさせる事も出来るので場面で切り替えてけば良いかと思います。

経理関係のエクセルとかで結構必要に駆られる場面があるかと思うので是非参考にしてみてください~(ᵔᴥᵔ)

コメント