メインコンテンツへスキップ
【VBA】n日後の営業日を求める

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

·2 分
Programming VBA
かずさプログラマー
著者
かずさプログラマー
業務の作業自動化を行っています。Go、VBA、Pythonを主に使用しています。過去にはC#、VB.Net、JavaScriptも使用していました。
目次

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

事前準備
#

祝日の判定を行うには、事前に祝日の日付をシートに書き込んでおく必要があります。
祝日は内閣府から提供されている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

関連記事

VBAで休日・祝日を判定する
·5 分
Programming VBA
【VBA】項目ごとのカウントを行う
··2 分
Programming VBA
【VBA】テキストファイルを読み込む
·3 分
Programming VBA