【VBA】n日後の営業日を求める

Excel VBAでn日後(または前)の営業日を計算するにはWorksheetFunction.WorkDayを使用します。

https://learn.microsoft.com/ja-jp/office/vba/api/excel.worksheetfunction.workday

事前準備

祝日の判定を行うには、事前に祝日の日付をシートに書き込んでおく必要があります。
祝日は内閣府から提供されているcsvファイルの内容をコピーして使用します。

https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html

リンク先の 昭和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で最終行・最終列を取得する

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
Licensed under CC BY-NC-SA 4.0
最終更新 2018年7月17日 12:14
Hugo で構築されています。
テーマ StackJimmy によって設計されています。