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

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