ACCESS 土日祝日を除いた平日を取得する方法(VBAコード公開)

土日祝日を除いた平日を取得する方法

ACCESSでは日付を扱うシーンが多く発生します。

その中でも、お仕事に使う場合は土日祝日を除いた平日のみを使いたいというケースがあります。

例えば、請求日や支払日などは単純に翌月末ではなく最終営業日に指定する、などです。

今回は、ACCESSで土日祝日を除いた平日を取得する方法をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSで実際に作成したフォームやレポートを、その作成方法と共にご紹介していきます。

休日判定の方法

まずは今回ご紹介する休日判定の方法の概要をご紹介します。

VBAでFunctionプロシージャを作成し、引数に指定した日付が休日であればTrue、平日であればFalseを返すようにします。

これでその日が平日か休日かが判定できます。

判定の流れについてです。

まず基本の曜日判定にはWeekday関数を利用します。
Weekday関数は引数に指定した日付の曜日を返す関数です。

これで土日が休日と判定できます。

月曜日から金曜日の場合は、別途作成した祝日テーブルとマッチングを行い、祝日テーブルにその日があれば休日、なければ平日、と判定します。

Weekday関数

最初に利用するWeekday関数についてご紹介しましょう。

Weekday関数は以下の構文で利用します。

Weekday ( 曜日を求める日 , [週の基準] )

Weekday関数は曜日を数値で返します。[]は省略可能な引数です。

最後の引数である週の基準は何曜日をスタートにするか、という指定です。
省略可能で、省略すると日曜日が1になります。

例えば、週の基準を1、または省略した場合は、以下のように値が得られます。

日曜日1
月曜日2
火曜日3
水曜日4
木曜日5
金曜日6
土曜日7

週の基準を月曜日始まりにしたい場合は、2を指定します。

その場合は以下の値が戻ります。

日曜日7
月曜日1
火曜日2
水曜日3
木曜日4
金曜日5
土曜日6

なお、日付を指定する際はデータ型を日付型で入力する必要がありますので、#で囲うことを忘れないようにしてください。

例えば、2022年10月13日の曜日を、日曜日始まりで求める場合は以下のように記述します。


 Weekday(#2022/10/13#)

このように、Weekday関数を使って曜日を求めることができます。

WeekdayName関数

先ほど紹介したWeekday関数では、曜日が数値で返されます。

数値だと直感的に何曜日かわかりにくいですよね。

そこで、曜日をテキストに戻す関数があります。

それがWeekdayName関数です。

WeekdayName関数は以下の構文で利用します。

WeekdayName ( 曜日を示す数値 , [曜日の省略] , [週の基準] )

WeekdayName関数は与えられた曜日を示す数値に対して、曜日のテキストを返します。[]は省略可能な引数です。

例えば週の基準を1、または省略した場合は、日曜日始まりになります。そのため、以下の値が得られます。

記述戻り値
WeekdayName(1)日曜日
WeekdayName(2)月曜日
WeekdayName(3)火曜日
WeekdayName(4)水曜日
WeekdayName(5)木曜日
WeekdayName(6)金曜日
WeekdayName(7)土曜日

2つ目の引数の曜日の省略は「〇曜日」の「曜日」を省略するか否かを指定します。
Trueだと省略、Falseだと曜日を付けて返します。


 WeekdayName(1,True)

の場合は、「日」とだけ値が戻るということです。

祝日テーブル

上記のWeekday関数とWeekdayName関数を使って、曜日を判定することが可能です。

土日であれば休日判断できますね。

曜日が月曜日から金曜日であれば、祝日か否かをテーブルとマッチングして判定します。

今回はMST_休日というテーブルを判定用に準備しました。

このように、単純に日付だけが格納されているテーブルです。

休日判定のプロシージャ

では、実際に作成した休日判定のプロシージャをご覧ください。


Public Function kyujitsuhantei(x As Date) As Boolean

'変数にADOオブジェクトを代入
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient

'曜日で判定
If WeekdayName(Weekday(x), True) = "土" Or WeekdayName(Weekday(x), True) = "日" Then

    kyujitsuhantei = True
    Debug.Print "曜日判定:休日"

'休日テーブルで判定
Else

    'レコードセットを取得
    rst1.Open "MST_休日", cnn, adOpenKeyset, adLockReadOnly

    rst1.Find "休日 = #" & x & "#"
    
    If rst1.EOF = True Then

        kyujitsuhantei = False
        Debug.Print "平日"
            
    Else

        kyujitsuhantei = True
        Debug.Print "テーブル判定:休日"
        
    End If
    
    rst1.Close: Set rst1 = Nothing

End If

'終了処理
cnn.Close: Set cnn = Nothing

End Function

kyujitsuhanteiというFunctionプロシージャです。

このプロシージャを実行する際は、


 kyujitsuhantei(#2022/10/13#)

のように、日付を引数として指定します。

これがプロシージャの宣言を行っている最初に行に記載してある(x As Date)の部分ですね。

そして、引数に指定した日付が休日であればTrueを、平日であればFalseを返します。

プロシージャ解説

では、プロシージャの中身を解説します。

最初はWeekdayName関数とWeekday関数を使って、曜日で休日か否かを判定します。


'曜日で判定
If WeekdayName(Weekday(x), True) = "土" Or WeekdayName(Weekday(x), True) = "日" Then

    kyujitsuhantei = True

ここは前述した2つの関数を使って土日を判定しているだけなのでご理解いただけるかと思います。

上記で土日ではない、つまり曜日が月曜日から金曜日の場合は次の処理に移ります。


'休日テーブルで判定
Else

    'レコードセットを取得
    rst1.Open "MST_休日", cnn, adOpenKeyset, adLockReadOnly

    rst1.Find "休日 = #" & x & "#"
    
    If rst1.EOF = True Then

        kyujitsuhantei = False
        Debug.Print "平日"
            
    Else

        kyujitsuhantei = True
        Debug.Print "テーブル判定:休日"
        
    End If
    
    rst1.Close: Set rst1 = Nothing

今回はADOを使ってレコード操作をしています。

rst1.Findの部分では、MST休日テーブルに対して、引数に指定されたxの日付があるか否かをFindメソッドで調べています。

Findメソッドでは、該当の値が見つからないとレコードセットが最後まで移動した状態になります。

そこで、


 If rst1.EOF = True Then

という条件分岐で、MST休日テーブルにxが見つかったか否かを判定しています。

EOF = Trueの場合は見つかっていない、つまりxは休日ではないということになりますし、EOF = Falseの場合はテーブルに該当日付が見つかっているので、xは休日であるということになります。

この結果に応じて、kyujitsuhanteiにTrueかFalseを格納しているのです。

ADOについて詳しく知りたい方は下記の記事もご覧ください。

ADOを使ったレコード操作

このプロシージャとテーブルを作成しておけば、簡単に平日 / 休日の判定が可能です。

Functionプロシージャの引数に日付を指定するだけなので汎用性が高く、どのACCESSデータベースに入れても利用しやすいのでぜひ活用ください。

以上、土日祝日を除いた平日を取得する方法をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。