AccessのVBAを使用して指定した日を起点として次の営業日(翌営業日)を返すユーザー定義関数のサンプルプログラムを覚書。
営業日を返すサンプルプログラムの概要
以下の記事で以前作成した休日かどうかを判断するユーザー定義関数のCheckHoliday関数を利用して次の営業日を返すユーザー定義関数を新たに作成しました。
引数として受け取った日から1日ずつ日付を進めていき、休日判定がFalseになった日付を返します。
Access VBA:指定した日付が休日(祝祭日、土日)かどうかをチェックするユーザー定義関数
AccessのVBAで指定した日付が休日(祝祭日、土日)かどうかを判定するためのユーザー定義関数を作成したので覚書しておく。 OSの設定を和暦にしているとうまく動かないとの指摘があったので、和暦対応を追記しました。
休日判定をする仕組みについては、上記の記事に詳細を記載していますのでそちらを参照してください。
ユーザー定義関数を作成する前に必要な準備について
概要にも記載しましたが、この記事で紹介するユーザー定義関数のサンプルプログラムは、以下の記事で作成した"CheckHoliday"を使用します。
Access VBA:指定した日付が休日(祝祭日、土日)かどうかをチェックするユーザー定義関数
AccessのVBAで指定した日付が休日(祝祭日、土日)かどうかを判定するためのユーザー定義関数を作成したので覚書しておく。 OSの設定を和暦にしているとうまく動かないとの指摘があったので、和暦対応を追記しました。
必ず上記の記事に記載されている"CheckHoliday"関数を作成するために必要な準備と"CheckHoliday"関数を作成してから紹介するユーザー定義関数のサンプルプログラムを作成してから記事を読みすすめてください。
作成するユーザー定義関数
以下にユーザー定義関数のサンプルプログラムを記載します。 AccessのVBAの標準モジュールに記載してください。
'引数として受け取った日付の次の営業日を返す関数
Function GetNextWorkDay(dtDate As Date) As Date
'次の日に設定しなおす
dtDate = dtDate + 1
'CheckHoliday関数の返り値がFalse(休日ではない)まで1日ずつ加算する。
Do Until CheckHoliday(dtDate) = False
dtDate = dtDate + 1
Loop
GetNextWorkDay = dtDate
End Function
作成したユーザー定義関数の使用例
例えば、[日付]というフィールド翌営業日を計算する基になる日付が入っていた場合は以下のようになります。
GetNextWorkDay([日付])
[日付]フィールドの値が2016/1/8だった場合、結果として2016/1/12が返されます。
※2016/1/11が成人式でお休みのため。
コメント
翌営業日を計算する基になる日付が"日"のみで、"年"と"月"がありません。
その場合、どのようにすればよいでしょうか?
例) 給料日 15日
この給料日の日にちだけを基にして、休祝日であれば翌営業日という感じです。
この”15日”という値は、データとしては日付として入っているけど表示形式で日だけしか表示されているのではなく、”15日”っていう文字列で入っているのでしょうか?
そうなります。
DLOOKUP関数で参照し、定型入力で”日”が表示されている状態です。この部分は不要であれば定型入力を削除することも可能です。
説明不足で申し訳ありません。
返信ありがとうございます。
“15”は数値として入っているということですね。
年と月を表す値はどのフィールドにもない状態ですか?
それとも年と月は別のフィールドに入っていたりしますか?
分かりやすく例えるなら、
給料日:20日(定型入力:00"日")
みたいなフィールドが存在し、これとは別に
2016/4/1 ~ 2016/4/20
といった計算期間があります。
この2016/4/20 の日にちを給料日フィールドから参照したいのですが、2016/4/20 が休祝日であった場合、翌営業日にズレてほしいといったイメージです。
難しい依頼だと思いますが、知恵を貸してほしいです。
以下のように仮定した場合の例です。
[計算期間開始日]フィールド→給与計算期間の開始日が日付型で入力されている。
[計算期間終了日]フィールド→給与計算期間の終了日が日付型で入力されている。
[給料日]フィールド→給料日が数値で入力されている(定型入力:00″日”)
GetNextWorkDay(Year([計算期間開始日]) & “/” & Month([計算期間終了日]) & “/” & [給料日])
給料日の”年”、”月”に当たる部分を他のフィールドからYear関数とMonth関数で取り出して、給料日の数値の文字列結合して合成した日付を関数の引数に渡しています。
もし、計算期間の”2016/4/1 ~ 2016/4/20″が1つのフィルドに文字列として入力されているとすると、もう少し複雑な方法になりますが、できないことはないです。
各フィールドとフィールドに入っている値の具体的な例があると助かります。