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(月・祝)の土日・祝日判定を行います。
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
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に参照設定を行う必要があります。
参照設定についてはこちらをご覧ください。
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 27 28 29 30 31 32 33 34 35 36 |
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を戻り値として返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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演算子で結合して休日・祝日の判定をします。
コメント