Accessロゴ

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なんかでできるかもしれませんが、そこまで調べてないです。
機会があったら調べてみます。

スポンサードリンク

  

関連記事