AcessのVBAで指定した日を起点として指定した日数後の営業日の日付を返すユーザー定義関数を作ったので覚書。
例えば、2015/1/26(水)から5営業日後の日付を求めたい時などに使用するためのユーザー定義関数のサンプルプログラムです。
ユーザー定義関数を作成する前に必要な準備について
この記事で紹介するユーザー定義関数のサンプルプログラムは、以下の記事で作成した"CheckHoliday"を使用します。
必ず上記の記事に記載されている"CheckHoliday"関数を作成するために必要な準備と"CheckHoliday"関数を作成した上で紹介するユーザー定義関数のサンプルプログラムを作成してください。
サンプルプログラム概要
今回紹介するユーザー定義関数のサンプルプログラムは、例えば「注文を受けた日からXX営業日以内」などの条件があった際に注文を受けた日(起点となる日)と何営業日目かを示す数値を指定することで「注文を受けた日からXX営業日後」の日付を返します。
ユーザー定義関数のサンプルプログラム
作成するユーザー定義関数のサンプルプログラムのコードは以下のとおりです。
AccessのVBAの標準モジュールに記載してください。
'引数として受け取った日付から数えて指定した営業日数後の日付を返す関数
'例えば、「注文を受けてから3営業日以内」など
Function GetWorkDay(dtDate As Date, intCount) As Date
i = 0
Do Until i = intCount
If CheckHoliday(dtDate + 1) = False Then
'営業日だったらiに1を加算
i = i + 1
End If
dtDate = dtDate + 1
Loop
GetWorkDay = dtDate
End Function
作成したユーザー定義関数の使用例
例えば、[受注日]フィールドに入力された日付から3営業日後の日付を取得したい場合
GetWorkDay([受注日],5)
[受注日]が2016/1/27だったとすると5営業日後は土日を挟むので2016/2/3が値として返されます。
指定日付からn営業日前の日付を返すユーザー定義関数
コメント欄に「作業日程表などがあり、その作業の5営業日前までに必要書類を提出しなければならない、などの場合にはどうしたらいいのか?」という質問が来ましたので、新たにGetLimitDayという関数を作成しました。
Function GetLimitDay(dtDate As Date, intCount) As Date
i = 0
Do Until i = intCount
If CheckHoliday(dtDate - 1) = False Then
i = i + 1
End If
dtDate = dtDate - 1
Loop
GetLimitDay = dtDate
End Function
使い方は、GetWorkDayと同じです。
お詫びと訂正
2019/2/22に記事中のプログラムを修正しました。
プログラムに間違いがあり、指定した営業日後の日付が返らない場合がありました。
大変申し訳ありません。
なかば様のコメント対応をしていた際に気づきました。
2019年のカレンダーを基にチェックをかけて、プログラムの不具合は修正されたという認識ですが、使用する際は必ず自己チェックをお願いいたします。
コメント
n営業日後、と表示させたい場合にはどうしたらいいでしょうか?
4行目、13行目を -1 に変更しただけではエラーになってしまい、動きません。
なかばさん
コメントありがとうございます。
“n営業日後”と表示させたいとありますが、具体的な例を教えてもらえますか?
るーと 様
申し訳ありません、「n営業日前」の表示をさせたい、の誤りです。
作業日程表などがあり、その作業の5営業日前までに必要書類を提出しなければならない、などの場合にはどうしたらいいのかわかりません。
なかばさん、遅くなって申し訳なかったです。
それともう一つ。もともとのプログラムにミスがあったようで、元のプログラムも修正しています。
なかばさんのやりたいことが出来るユーザー定義関数を記事に追記したので参考にして下さい。
申し訳なかったです。