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は祝日(成人の日)です。
それぞれ「土日祝日です」とメッセージボックスに表示されます。
コードの解説
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演算子で結合して休日・祝日の判定をします。