メインコンテンツへスキップ
VBAで休日・祝日を判定する

VBAで休日・祝日を判定する

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

VBAで休日・祝日判定を行うにはWeekday関数Dictionaryオブジェクトを使用します。 土曜日と日曜日の判定にWeekdayを使用し、祝日の判定にDictionaryを使用します。

事前準備
#

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

リンク先の 昭和30年(1955年)から令和5年(2023年)国民の祝日(csv形式:20KB) をクリックしてcsvファイルをダウンロードします。

csvファイルから2023年度の祝日をコピーしてExcelシートに貼り付けます。
シートの名前はholidayとし、データの1行目はヘッダーとします。

土日・祝日の判定を行うコード
#

コード全体
#

土日・祝日のコード全体は下記になります。
動作させるためにはMicrosoft Scripting Runtimeに参照設定を行う必要があります。

参照設定の方法はこちらをご覧ください。

VBAで参照設定を行う
·1 分
Programming VBA

一番上のTestIsHolidayを動かすと、2023/1/6(金)~2023/1/9(月・祝)の土日・祝日判定を行います。

Option Explicit

Public Sub TestIsHoliday()

  Dim holidayDic As Dictionary
  Set holidayDic = New Dictionary
  Set holidayDic = StoreHolidaysToDictionary

  Dim d As Date
  d = #1/6/2023#
  If IsHoliday(d, holidayDic) Then
    MsgBox d & "は土日祝日です"
  Else
    MsgBox d & "は平日です"
  End If

  d = #1/7/2023#
  If IsHoliday(d, holidayDic) Then
    MsgBox d & "は土日祝日です"
  Else
    MsgBox d & "は平日です"
  End If

  d = #1/8/2023#
  If IsHoliday(d, holidayDic) Then
    MsgBox d & "は土日祝日です"
  Else
    MsgBox d & "は平日です"
  End If

  d = #1/9/2023#
  If IsHoliday(d, holidayDic) Then
    MsgBox d & "は土日祝日です"
  Else
    MsgBox d & "は平日です"
  End If

  Set holidayDic = Nothing

End Sub

Public Function StoreHolidaysToDictionary() As Dictionary
'###################################################################################
'祝日の日付と名前をDictionaryに格納し返す
'祝日かどうか判定するために使用する
'-----------------------------------------------------------------------------------
'###################################################################################
  Dim holidaySht As Worksheet
  Set holidaySht = ThisWorkbook.Worksheets("holiday")

  Dim holidayDic As Dictionary
  Set holidayDic = New Dictionary
  Dim lastRow As Long
  Dim i As Long
  lastRow = GetMaxRowUsedRange(holidaySht)
  For i = 2 To lastRow
    holidayDic.Add holidaySht.Cells(i, 1).Value, holidaySht.Cells(i, 2).Value
  Next i

  Set StoreHolidaysToDictionary = holidayDic

  Set holidaySht = Nothing
  Set holidayDic = 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 Function IsHoliday(day As Date, dic As Dictionary) As Boolean
'###################################################################################
'日付が土日祝日かどうか判別する
'-----------------------------------------------------------------------------------
'引数:day 土日祝日か確認したい日付
'    :dic 祝日が格納されたDictionaryオブジェクト
'###################################################################################

  If dic.Exists(day) Or Weekday(day) = 1 Or Weekday(day) = 7 Then
    IsHoliday = True
  Else
    IsHoliday = False
  End If

End Function

2023/1/6は金曜日です。平日なので「2023/01/06は平日です」とメッセージボックスに表示されます。

2023/1/7は土曜日、2023/1/8は日曜日、2023/1/9は祝日(成人の日)です。
それぞれ「土日祝日です」とメッセージボックスに表示されます。

コードの解説
#

StoreHolidaysToDictionary
#

holidayシートの内容をDictionaryオブジェクトに格納して、戻り値として返すコードは以下になります。 Dictionaryオブジェクトを使用するには、Microsoft Scripting Runtimeに参照設定を行う必要があります。
参照設定についてはこちらをご覧ください。

VBAで参照設定を行う
·1 分
Programming VBA
Public Function StoreHolidaysToDictionary() As Dictionary
'###################################################################################
'祝日の日付と名前をDictionaryに格納し返す
'祝日かどうか判定するために使用する
'-----------------------------------------------------------------------------------
'###################################################################################
  Dim holidaySht As Worksheet
  Set holidaySht = ThisWorkbook.Worksheets("holiday")

  Dim holidayDic As Dictionary
  Set holidayDic = New Dictionary
  Dim lastRow As Long
  Dim i As Long
  lastRow = GetMaxRowUsedRange(holidaySht)
  For i = 2 To lastRow
    holidayDic.Add holidaySht.Cells(i, 1).Value, holidaySht.Cells(i, 2).Value
  Next i

  Set StoreHolidaysToDictionary = holidayDic

  Set holidaySht = Nothing
  Set holidayDic = Nothing

End Function

Private Function GetMaxRowUsedRange(sht As Worksheet) As Long
'###################################################################################
'シート内の使用されている最終行を取得する
'-----------------------------------------------------------------------------------
'引数  :sht       シートオブジェクト
'戻り値:sht内で使用されている最終行
'###################################################################################

  GetMaxRowUsedRange = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row

End Function

holidayシートの最終行を取得するためGetMaxRowUsedRangeを使用しています。
GetMaxRowUsedRangeの詳細についてはこちらをご覧ください。

【VBA】UsedRangeで最終行・最終列を取得する
·2 分
Programming VBA

IsHoliday
#

休日と祝日判断をするコードは以下になります。
休日または祝日のときはTrueを戻り値として返し、平日のときはFalseを戻り値として返します。

Public Function IsHoliday(day As Date, dic As Dictionary) As Boolean
'###################################################################################
'日付が土日祝日かどうか判別する
'-----------------------------------------------------------------------------------
'引数:day 土日祝日か確認したい日付
'    :dic 祝日が格納されたDictionaryオブジェクト
'###################################################################################
  
  If dic.Exists(day) Or Weekday(day) = 1 Or Weekday(day) = 7 Then
    IsHoliday = True
  Else
    IsHoliday = False
  End If

End Function

祝日の判別にはDictionaryを使用しています。
祝日の日付が格納してあるDictionaryに日付が存在するか、DictionaryExistsメソッドを使用して確認しています。日付がDictionaryに存在すれば祝日と判定します。

また、土日の判別にWeekdayを使用して、日付が土曜日か日曜日か判定しています。
Weekdayに日付を入力すると1~7の値を返します。
日曜日は1、土曜日は7を返すので、1または7のどちらかを取得したときに土日と判定します。

以上の祝日と土日の判定をOr演算子で結合して休日・祝日の判定をします。

関連記事

【VBA】項目ごとのカウントを行う
··2 分
Programming VBA
【VBA】テキストファイルを読み込む
·3 分
Programming VBA
VBAで参照設定を行う
·1 分
Programming VBA