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

概要

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

事前準備

祝日の判定を行うには、事前に祝日の日付をシートに書き込んでおく必要があります。
祝日は内閣府から提供されているcsvファイルの内容をコピーして使用します。
リンク先の 昭和30年(1955年)から令和5年(2023年)国民の祝日(csv形式:20KB) をクリックして
csvファイルをダウンロードします。

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

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

コード全体

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

参照設定についてはこちらをご覧ください。
https://kazusa-pg.com/vba-references/

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

 1Option Explicit
 2
 3Public Sub TestIsHoliday()
 4
 5  Dim holidayDic As Dictionary
 6  Set holidayDic = New Dictionary
 7  Set holidayDic = StoreHolidaysToDictionary
 8
 9  Dim d As Date
10  d = #1/6/2023#
11  If IsHoliday(d, holidayDic) Then
12    MsgBox d & "は土日祝日です"
13  Else
14    MsgBox d & "は平日です"
15  End If
16
17  d = #1/7/2023#
18  If IsHoliday(d, holidayDic) Then
19    MsgBox d & "は土日祝日です"
20  Else
21    MsgBox d & "は平日です"
22  End If
23
24  d = #1/8/2023#
25  If IsHoliday(d, holidayDic) Then
26    MsgBox d & "は土日祝日です"
27  Else
28    MsgBox d & "は平日です"
29  End If
30
31  d = #1/9/2023#
32  If IsHoliday(d, holidayDic) Then
33    MsgBox d & "は土日祝日です"
34  Else
35    MsgBox d & "は平日です"
36  End If
37
38  Set holidayDic = Nothing
39
40End Sub
41
42Public Function StoreHolidaysToDictionary() As Dictionary
43'###################################################################################
44'祝日の日付と名前をDictionaryに格納し返す
45'祝日かどうか判定するために使用する
46'-----------------------------------------------------------------------------------
47'###################################################################################
48  Dim holidaySht As Worksheet
49  Set holidaySht = ThisWorkbook.Worksheets("holiday")
50
51  Dim holidayDic As Dictionary
52  Set holidayDic = New Dictionary
53  Dim lastRow As Long
54  Dim i As Long
55  lastRow = GetMaxRowUsedRange(holidaySht)
56  For i = 2 To lastRow
57    holidayDic.Add holidaySht.Cells(i, 1).Value, holidaySht.Cells(i, 2).Value
58  Next i
59
60  Set StoreHolidaysToDictionary = holidayDic
61
62  Set holidaySht = Nothing
63  Set holidayDic = Nothing
64
65End Function
66
67Private Function GetMaxRowUsedRange(sht As Worksheet) As Long
68'###################################################################################
69'シート内の使用されている最終行を取得する
70'-----------------------------------------------------------------------------------
71'引数  :sht       シートオブジェクト
72'戻り値:sht内で使用されている最終行
73'###################################################################################
74
75  GetMaxRowUsedRange = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row
76
77End Function
78
79Public Function IsHoliday(day As Date, dic As Dictionary) As Boolean
80'###################################################################################
81'日付が土日祝日かどうか判別する
82'-----------------------------------------------------------------------------------
83'引数:day 土日祝日か確認したい日付
84'    :dic 祝日が格納されたDictionaryオブジェクト
85'###################################################################################
86
87  If dic.Exists(day) Or Weekday(day) = 1 Or Weekday(day) = 7 Then
88    IsHoliday = True
89  Else
90    IsHoliday = False
91  End If
92
93End Function

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

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

:left
:left
:inline

コードの解説

StoreHolidaysToDictionary

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

参照設定についてはこちらをご覧ください。

 1Public Function StoreHolidaysToDictionary() As Dictionary
 2'###################################################################################
 3'祝日の日付と名前をDictionaryに格納し返す
 4'祝日かどうか判定するために使用する
 5'-----------------------------------------------------------------------------------
 6'###################################################################################
 7  Dim holidaySht As Worksheet
 8  Set holidaySht = ThisWorkbook.Worksheets("holiday")
 9
10  Dim holidayDic As Dictionary
11  Set holidayDic = New Dictionary
12  Dim lastRow As Long
13  Dim i As Long
14  lastRow = GetMaxRowUsedRange(holidaySht)
15  For i = 2 To lastRow
16    holidayDic.Add holidaySht.Cells(i, 1).Value, holidaySht.Cells(i, 2).Value
17  Next i
18
19  Set StoreHolidaysToDictionary = holidayDic
20
21  Set holidaySht = Nothing
22  Set holidayDic = Nothing
23
24End Function
25
26Private Function GetMaxRowUsedRange(sht As Worksheet) As Long
27'###################################################################################
28'シート内の使用されている最終行を取得する
29'-----------------------------------------------------------------------------------
30'引数  :sht       シートオブジェクト
31'戻り値:sht内で使用されている最終行
32'###################################################################################
33
34  GetMaxRowUsedRange = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row
35
36End Function

holidayシートの最終行を取得するためGetMaxRowUsedRangeを使用しています。

GetMaxRowUsedRangeの詳細についてはこちらをご覧ください。

IsHoliday

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

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

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

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

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

関連ページ