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について詳しく知りたい方は下記の記事もご覧ください。
このプロシージャとテーブルを作成しておけば、簡単に平日 / 休日の判定が可能です。
Functionプロシージャの引数に日付を指定するだけなので汎用性が高く、どのACCESSデータベースに入れても利用しやすいのでぜひ活用ください。
以上、土日祝日を除いた平日を取得する方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。