【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

関連ページ