Access VBA:指定した日付が休日(祝祭日、土日)かどうかをチェックするユーザー定義関数

Access VBA:指定した日付が休日(祝祭日、土日)かどうかをチェックするユーザー定義関数

AccessのVBAで指定した日付が休日(祝祭日、土日)かどうかを判定するためのユーザー定義関数を作成したので覚書しておく。

OSの設定を和暦にしているとうまく動かないとの指摘があったので、和暦対応を追記しました。

スポンサーリンク

作成するVBAのユーザー定義関数の処理概要

今回作成したユーザー定義関数の処理ステップを簡単に記載しておきます。

  1. VBAのプログラムだけでは祝祭日のチェックはできないので、別途祝祭日を管理するテーブル(holidayテーブル)を用意する
  2. holidayテーブルに祝祭日の日付を入力
  3. 祝祭日だけでなく土日以外の休業日(創立記念日など)も入力する
  4. 作成した関数にチェックしたい日付を引数として渡す
  5. 関数側では受け取った引数の日付がholidayテーブルに存在するかをチェックする
  6. 存在しない場合は、曜日を調べて土日かどうかをチェックする
  7. 祝祭日もしくは、土日にあたる場合は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なんかでできるかもしれませんが、そこまで調べてないです。

機会があったら調べてみます。

コメント

  1. CheckHoliday関数の最後行(23行)のElseの文を教えてください。

    • > CheckHoliday関数の最後行(23行)のElseの文を教えてください。
      サンプルコードが中途半端に終わってましたね。
      記事を書き直しましたので参照ください。

  2.  ゆえあって、OS(WIN7 64bit)の「カレンダーの種類」(コントロールパネル→地域と言語→形式→追加の設定→日付→カレンダーで選択)を「和暦」として使用しています。ソフトはOfficeProfessional2010同梱のACCESS2010を使用し、ファイル形式はaccess2007です。
     この環境の下で、CheckHoliday関数を使用すると、正しく動作しません。ちなみに、引数を本日(#15/10/9#)で指定して実行すると、「実行時エラー’3075′ クエリ式’holiday = #平 27/9/10’の日付の構文エラーです。」と表示されます。
    「和暦」の環境のもとでCheckHoliday関数を使用するにはどうすればよろしいでしょうか。

    • コメントありがとうございます。
      和暦でも正常に動作するように記事中のユーザー関数のプログラムを修正しました。
      和暦でも西暦でも動作することを確認済みです。

  3. billyboy 様
    早々にご対応いただきありがとうございました。

タイトルとURLをコピーしました