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

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

祝日の判定を行うには、事前に祝日の日付をシートに書き込んでおく必要があります。
今回は2018年度の祝日をシートに書き込んでおきます。
シートの名前は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 25 26 27 28 29 30 |
Option Explicit 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 End Function Function getMaxRow(sht As Worksheet, targetCol As Long) As Long getMaxRow = sht.Cells(sht.Rows.Count, targetCol).End(xlUp).Row End Function |
holidayシートの最終行を取得するためgetMaxRowを使用しています。
getMaxRowの詳細についてはこちらをご覧ください。

休日・祝日判断をするコードは以下になります。
休日または祝日のときはTrueを戻り値として返します。
平日のときはFalseを戻り値として返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Option Explicit Function isHoliday(day As Date, dic As Dictionary) As Boolean '################################################################################### '日付が土日祝日かどうか? 'カテゴリ:独自 '----------------------------------------------------------------------------------- '引数 :d 土日祝日か確認したい日付 '################################################################################### 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内に存在すれば、dayは祝日と判定します。
WeekDay関数を使用してdayが土曜日か日曜日か判定しています。
WeekDay関数に日付を入力すると1~7の値を返します。
日曜日は1、土曜日は7なので、WeekDay関数を使用して
1または7のどちらかを取得したときに、休日と判定します。
以上の祝日の判定をOr演算子で結合して休日・祝日の判定をします。
test_isHolidayを動かしてisHoliday Functionをテストしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Option Explicit Sub test_isHoliday() Dim holidayDic As Dictionary Set holidayDic = New Dictionary Set holidayDic = storeHolidaysToDictionary MsgBox isHoliday(#7/11/2018#, holidayDic) MsgBox isHoliday(#7/14/2018#, holidayDic) MsgBox isHoliday(#7/15/2018#, holidayDic) MsgBox isHoliday(#7/16/2018#, holidayDic) End Sub |
2018/7/11は水曜日です。平日なのでFalseとメッセージボックスに表示されます。
2018/7/14は土曜日、2018/7/15は日曜日、2018/7/16は海の日です。
それぞれ休日・祝日なのでTrueとメッセージボックスに表示されます。
コメント