Excel VBAでn日後(または前)の営業日を計算するにはWorksheetFunction.WorkDayを使用します。
WorksheetFunction.WorkDay メソッド (Excel) | Microsoft Learn
事前準備 #
祝日の判定を行うには、事前に祝日の日付をシートに書き込んでおく必要があります。
祝日は内閣府から提供されているcsvファイルの内容をコピーして使用します。
国民の祝日について - 内閣府
リンク先の 昭和30年(1955年)から令和5年(2023年)国民の祝日(csv形式:20KB) をクリックしてcsvファイルをダウンロードします。
csvファイルから2023年度の祝日をコピーしてExcelシートに貼り付けます。
シートの名前はholidayとし、データの1行目はヘッダーとします。
n日後の営業日を求めるコード #
n日後の営業日を求めるを行うコードは以下になります。
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の詳細についてはこちらをご覧ください。
【VBA】UsedRangeで最終行・最終列を取得する
·2 分
Programming
VBA
TestGetWorkDay
には2023/3/17(金)を起点として、1営業日後と2営業日後と1営業日前の営業日を求めるコードを書いています。
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
の結果が出力されます。
2023/03/20
2023/03/22
2023/03/16