VBAで休日・祝日判定を行うには
Weekday関数とDictionaryオブジェクトを使用します。
土曜日と日曜日の判定にWeekday関数を使用し
祝日の判定にDictionaryオブジェクトを使用します。
WeekDay関数についてはこちらをご覧ください。

Dictionaryオブジェクトを使用するには
Microsoft Scripting Runtimeに参照設定を行う必要があります。
参照設定についてはこちらをご覧ください。

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

今回はcsvファイルから2021年度の祝日をシートにコピーします。
シートの名前はholidayとし、データの1行目はヘッダーとします。
holidayシートの内容をDictionaryオブジェクトに格納して
戻り値として返すコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 = GetMaxRow(holidaySht, 1) 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 |
holidayシートの最終行を取得するためGetMaxRowを使用しています。
GetMaxRowの詳細についてはこちらをご覧ください。

休日・祝日判断をするコードは以下になります。
休日または祝日のときはTrueを戻り値として返します。
平日のときはFalseを戻り値として返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Public Function IsHoliday(day As Date, dic As Dictionary) As Boolean '################################################################################### '日付が土日祝日かどうか? '----------------------------------------------------------------------------------- '引数 :day 土日祝日か確認したい日付 '################################################################################### If dic.Exists(day) Or Weekday(day) = 1 Or Weekday(day) = 7 Then IsHoliday = True Else IsHoliday = False End If End Function |
祝日の日付が格納してあるdicにdayが存在するか
DictionaryオブジェクトのExistsメソッドを使用して確認しています。
dayがdic内に存在すれば祝日と判定します。
WeekDay関数を使用してdayが土曜日か日曜日か判定しています。
WeekDay関数に日付を入力すると1~7の値を返します。
日曜日は1、土曜日は7なので、WeekDay関数を使用して
1または7のどちらかを取得したときに、休日と判定します。
以上の祝日の判定をOr演算子で結合して休日・祝日の判定をします。
TestIsHolidayを動かしてIsHoliday Functionをテストしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Public Sub TestIsHoliday() Dim holidayDic As Dictionary Set holidayDic = New Dictionary Set holidayDic = StoreHolidaysToDictionary MsgBox IsHoliday(#7/21/2021#, holidayDic) MsgBox IsHoliday(#7/22/2021#, holidayDic) MsgBox IsHoliday(#7/24/2021#, holidayDic) MsgBox IsHoliday(#7/25/2021#, holidayDic) End Sub |
2021/7/21は水曜日です。平日なのでFalseとメッセージボックスに表示されます。
2021/7/22は祝日(海の日)、2021/7/24は土曜日、2021/7/25は日曜日です。
それぞれ休日・祝日なのでTrueとメッセージボックスに表示されます。
コメント