Excel VBAでn日後(または前)の営業日を計算するには、WorksheetFunction.WorkDayを使用します。
事前準備
祝日の判定を行うには、事前に祝日の日付をシートに書き込んでおく必要があります。
祝日は内閣府から提供されているcsvファイルの内容をコピーして使用します。
リンク先の昭和30年(1955年)から令和5年(2023年)国民の祝日(csv形式:20KB)をクリックして
csvファイルをダウンロードします。

国民の祝日について - 内閣府
内閣府 国民の祝日について。国民の祝日に関...
csvファイルから2023年度の祝日をコピーしてExcelシートに貼り付けます。
シートの名前はholidayとし、データの1行目はヘッダーとします。
n日後の営業日を求めるコード
n日後の営業日を求めるを行うコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Option Explicit Public Function GetWorkDay(day As Date, diff As Long) As Date '################################################################################### 'day日からdiff日後(マイナスの場合はdiff日前)の営業日を返す '祝日が記載されたシートが必要 '----------------------------------------------------------------------------------- '引数 :day 営業日計算起点日 ' :diff dayから起算して営業日diff日後(マイナスの場合はdiff日前) '################################################################################### Dim holidaySht As Worksheet Set holidaySht = ThisWorkbook.Worksheets("holiday") Dim lastRow As Long lastRow = GetMaxRowUsedRange(holidaySht) GetWorkDay = Application.WorksheetFunction.WorkDay(day, diff, holidaySht.Range("A2:A" & lastRow)) Set holidaySht = Nothing End Function Private Function GetMaxRowUsedRange(sht As Worksheet) As Long '################################################################################### 'シート内の使用されている最終行を取得する '----------------------------------------------------------------------------------- '引数 :sht シートオブジェクト '戻り値:sht内で使用されている最終行 '################################################################################### GetMaxRowUsedRange = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row End Function Public Sub TestGetWorkDay() Debug.Print GetWorkDay(#3/17/2023#, 1) '2023/3/17の1営業日後 Debug.Print GetWorkDay(#3/17/2023#, 2) '2023/3/17の2営業日後 Debug.Print GetWorkDay(#3/17/2023#, -1) '2023/3/17の1営業日前 End Sub |
holidayシートの最終行を取得するためGetMaxRowUsedRangeを使用しています。
GetMaxRowUsedRangeの詳細についてはこちらをご覧ください。
TestGetWorkDayには2023/3/17(金)を起点として、1営業日後と2営業日後と1営業日前の営業日を求める
コードを書いています。
1 2 3 4 5 6 7 |
Public Sub TestGetWorkDay() Debug.Print GetWorkDay(#3/17/2023#, 1) '2023/3/17の1営業日後 Debug.Print GetWorkDay(#3/17/2023#, 2) '2023/3/17の2営業日後 Debug.Print GetWorkDay(#3/17/2023#, -1) '2023/3/17の1営業日前 End Sub |
TestGetWorkDayを実行すると、イミディエイトウィンドウにGetWorkDayの結果が出力されます。
1 2 3 |
2023/03/20 2023/03/22 2023/03/16 |
コメント