AccessのVBAで指定した日付が休日(祝祭日、土日)かどうかを判定するためのユーザー定義関数を作成したので覚書しておく。
OSの設定を和暦にしているとうまく動かないとの指摘があったので、和暦対応を追記しました。
作成するVBAのユーザー定義関数の処理概要
今回作成したユーザー定義関数の処理ステップを簡単に記載しておきます。
- VBAのプログラムだけでは祝祭日のチェックはできないので、別途祝祭日を管理するテーブル(holidayテーブル)を用意する
- holidayテーブルに祝祭日の日付を入力
- 祝祭日だけでなく土日以外の休業日(創立記念日など)も入力する
- 作成した関数にチェックしたい日付を引数として渡す
- 関数側では受け取った引数の日付がholidayテーブルに存在するかをチェックする
- 存在しない場合は、曜日を調べて土日かどうかをチェックする
- 祝祭日もしくは、土日にあたる場合はTrueを返し、そうでない場合はFalseを返す
以下に"holidayテーブル"の構造とユーザー定義関数のコードを記述します。
祝祭日を管理するテーブルの構造
テーブル構造は以下のとおり。
テーブル名:holiday
フィールド名 | データ型 | 入力する値 |
---|---|---|
holiday | 日付/時刻 | 祝祭日の日付 |
holiday_name | 短いテキスト | 祝祭日名 |
注意点
holiday_nameフィールドを用意するかどうかは任意。
祝祭日名については直接使われることはない。
引数として指定する日付は、時刻が指定されているデータ(00:00:00以外)を指定してもよい。
テーブル構造の画面ショット
以下に作成した"holidays"テーブルのデザイン画面の画面ショットを記載します。
テーブルに入力されているデータの画面ショット
以下に作成した"holidays"テーブルに2016年の祝祭日を入力した際の画面ショットを記載します。
土日祝祭日かを判定するVBAのユーザー定義関数
作成するユーザー定義関数のプログラムは以下のとおり。
OSのカレンダーの設定が"和暦"の場合エラーが出てきちんと動作しないというコメントをいただいたので、"和暦"の場合でも動作するように修正しました。
'和暦対応版
'holiday(祝祭日テーブル)を使用して指定した日付が祝祭日、土日かを判定する関数
'祝祭日、土日の場合はTrueを返す
Function CheckHoliday(dt As Date) As Boolean
Dim flg As Boolean
'holiday(祝祭日テーブル)テーブルを検索し、引数として受け取った日付が祝祭日に
'あたるかどうか確認する
If IsNull(DLookup("holiday", "holiday", "holiday = #" & Format(dt, "yyyy/mm/dd") & "#")) Then
'祝祭日に該当しない場合は、土曜日か日曜日かをチェック
'土日が休みでない場合は、Caseに指定する数値を該当の曜日を表す数値に変更する。
Select Case Weekday(dt, vbSunday) '日曜日が1、土曜日が7になる
Case 1
CheckHoliday = True
Case 7
CheckHoliday = True
Case Else
CheckHoliday = False
End Select
Else
'引数に指定した日付がholiday(祝祭日テーブル)テーブルの日付に該当、つまり祝祭日
CheckHoliday = True
End If
End Function
関数の呼び出し方法
以下に作成したVBAのユーザー関数の使用方法のサンプルを記載する。
例1.
CheckHoliday(#2016/1/11#) → True が返される。
例2.
チェックする日付がフィールド(ここでは例として受注日)の場合
CheckHoliday([受注日])
指定した日付が休日(祝祭日、土日)かどうかを判定するユーザー定義関数のサンプルプログラムまとめ
祝祭日を別のテーブルで管理しないとならないところはちょっと面倒だけど、祝祭日は年ごとに変わるので仕方ないところ。
本当はWeb上のサービスをAPIで呼び出して使えたりすると入力する手間も省けるけれど、そういったサービスは見当たらないので...
もしかしたらGoogleカレンダーのAPIなんかでできるかもしれませんが、そこまで調べてないです。
機会があったら調べてみます。
コメント
CheckHoliday関数の最後行(23行)のElseの文を教えてください。
> CheckHoliday関数の最後行(23行)のElseの文を教えてください。
サンプルコードが中途半端に終わってましたね。
記事を書き直しましたので参照ください。
ゆえあって、OS(WIN7 64bit)の「カレンダーの種類」(コントロールパネル→地域と言語→形式→追加の設定→日付→カレンダーで選択)を「和暦」として使用しています。ソフトはOfficeProfessional2010同梱のACCESS2010を使用し、ファイル形式はaccess2007です。
この環境の下で、CheckHoliday関数を使用すると、正しく動作しません。ちなみに、引数を本日(#15/10/9#)で指定して実行すると、「実行時エラー’3075′ クエリ式’holiday = #平 27/9/10’の日付の構文エラーです。」と表示されます。
「和暦」の環境のもとでCheckHoliday関数を使用するにはどうすればよろしいでしょうか。
コメントありがとうございます。
和暦でも正常に動作するように記事中のユーザー関数のプログラムを修正しました。
和暦でも西暦でも動作することを確認済みです。
billyboy 様
早々にご対応いただきありがとうございました。