VBAでn日後(または前)の営業日を計算するには
WorksheetFunction.WorkDayを使用します。
祝日の判定を行うために、事前に祝日の日付を
シートに書き込んでおく必要があります。
今回は2018年度の祝日をシートに書き込んでおきます。
祝日 | 祝日名 |
2018/1/1 | 元日 |
2018/1/2 | 年始休日 |
2018/1/3 | 年始休日 |
2018/1/8 | 成人の日 |
2018/2/11 | 建国記念の日 |
2018/2/12 | 振替休日 |
2018/3/21 | 春分の日 |
2018/4/29 | 昭和の日 |
2018/4/30 | 振替休日 |
2018/5/3 | 憲法記念日 |
2018/5/4 | みどりの日 |
2018/5/5 | こどもの日 |
2018/7/16 | 海の日 |
2018/8/11 | 山の日 |
2018/9/17 | 敬老の日 |
2018/9/23 | 秋分の日 |
2018/9/24 | 振替休日 |
2018/10/8 | 体育の日 |
2018/11/3 | 文化の日 |
2018/11/23 | 勤労感謝の日 |
2018/12/23 | 天皇誕生日 |
2018/12/24 | 振替休日 |
2018/12/29 | 年末休日 |
2018/12/30 | 年末休日 |
2018/12/31 | 年末休日 |
シートの名前はholidayとし、データの1行目はヘッダーとします。
営業日の計算を行うコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Option Explicit 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 = getMaxRow(holidaySht, 1) getWorkDay = Application.WorksheetFunction.WorkDay(day, diff, holidaySht.Range("A2:A" & lastRow)) Set holidaySht = Nothing End Function Function getMaxRow(sht As Worksheet, targetCol As Long) As Long getMaxRow = sht.Cells(sht.Rows.Count, targetCol).End(xlUp).Row End Function |
holidayシートの最終行を取得するためgetMaxRowを使用しています。
getMaxRowの詳細についてはこちらをご覧ください。

【VBA】最終行・最終列を取得する
for文などで1行目から最終行、または1列目から最終列まで
連続して処理を行いたいときがあります。
この記事では最終行と最終列を取得するVBAのサンプルコードをご紹介します。
2018/7/12(木)を起点として、営業日を計算してみます。
営業日を計算するテストコードです。
1 2 3 4 5 6 7 8 |
Option Explicit Sub test_getWorkDay() MsgBox getWorkDay(#7/12/2018#, 1) MsgBox getWorkDay(#7/12/2018#, 2) MsgBox getWorkDay(#7/12/2018#, -1) End Sub |
getWorkDay(#7/12/2018#, 1)
getWorkDayの最初の引数に起点日である#2018/7/12#を入力します。
日付を#で囲んで日付型として入力します。
日付型として入力すると、#月/日/年#の順番に自動的に変わります。
次の引数に1と入力して1営業日後を取得してみます。
2018/7/12(木)の1営業日後は2018/7/13(金)となります。
2日後の営業日を取得してみます。
getWorkDay(#7/12/2018#, 2)
2018/7/14(土)、2018/7/15(日)、2018/7/16(祝日・海の日)があるので
2営業日後は2018/7/17(火)となります。
1日前の営業日を取得してみます。
getWorkDay(#7/12/2018#, -1)
1営業日前を取得したいときは2番目の引数に-1を入力します。
1営業日前の2018/7/11(水)がメッセージボックスに表示されます。
コメント