VBAで休日・祝日判定を行うにはWeekday関数
とDictionaryオブジェクト
を使用します。
土曜日と日曜日の判定にWeekday
を使用し、祝日の判定にDictionary
を使用します。
事前準備 #
祝日の判定を行うには、事前に祝日の日付をシートに書き込んでおく必要があります。
祝日は内閣府から提供されているcsvファイルの内容をコピーして使用します。
リンク先の 昭和30年(1955年)から令和5年(2023年)国民の祝日(csv形式:20KB) をクリックしてcsvファイルをダウンロードします。
csvファイルから2023年度の祝日をコピーしてExcelシートに貼り付けます。
シートの名前はholidayとし、データの1行目はヘッダーとします。
土日・祝日の判定を行うコード #
コード全体 #
土日・祝日のコード全体は下記になります。
動作させるためにはMicrosoft Scripting Runtimeに参照設定を行う必要があります。
参照設定の方法はこちらをご覧ください。
一番上の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に参照設定を行う必要があります。
参照設定についてはこちらをご覧ください。
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の詳細についてはこちらをご覧ください。
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
に日付が存在するか、Dictionary
のExists
メソッドを使用して確認しています。日付がDictionary
に存在すれば祝日と判定します。
また、土日の判別にWeekday
を使用して、日付が土曜日か日曜日か判定しています。
Weekday
に日付を入力すると1~7の値を返します。
日曜日は1、土曜日は7を返すので、1または7のどちらかを取得したときに土日と判定します。
以上の祝日と土日の判定をOr演算子で結合して休日・祝日の判定をします。