起算日から経過月数を調べる関数を作りました

日付と日付の間の期間を計算する方法は、民法に規定されています。

「基準日時点の年齢を取得する自作関数を作りました」で触れましたが、ACCESSに用意されているDATEDIFF関数は、民法の規定通りに計算することはできません。

基準日時点の年齢を取得する自作関数を作りました
仕事場、年齢計算をする場面は多々あると思いますが、法律上の年齢計算の根拠はご存知でしょうか。 日本では、「誕生日の前日に歳をとる」とされていて、その根拠となる法律は、「年齢計算ニ関スル法律」と「民法」です。 根拠法令 年齢計算ニ関...

 

そこで、民法通りの月数の計算ができるように自作した関数「GET_KEIKATUKI」を紹介します。

Function GET_KEIKATUKI(KISAN_YMD As Date, KIZYUN_YMD As Date) As Long
'起算日から経過月数を調べる関数(民法対応)

Dim NISSU As Long
Dim OUTOU_YMD As Date
Dim TOUTATU_YMD As Date
Dim LP_CNT As Long
LP_CNT = 0

Do
    '起算日のn月後の日を取得。ただし、その月に応答する日がないときは、その月の末日にする
    '求めた日の前日に期間が満了するので、その日までの経過月数を調べる
    
    '手順1 n月後において起算日が属する月の日数を取得
    NISSU = Day(DateSerial(Year(KISAN_YMD), Month(KISAN_YMD) + LP_CNT + 2, 1) - 1)
    
    '手順2 n月後において起算日が属する月に、応答する日があるか判定し、あればその月の応答する日、なければその月の末日を取得
    OUTOU_YMD = DateSerial(Year(KISAN_YMD), Month(KISAN_YMD) + LP_CNT + 1, IIf(Day(KISAN_YMD) <= NISSU, Day(KISAN_YMD), NISSU))
    
    '手順3 到達年月日を取得し、基準日と比較し基準日に到達していなければカウントアップ
    TOUTATU_YMD = OUTOU_YMD - 1
    
    If TOUTATU_YMD > KIZYUN_YMD Then Exit Do
    LP_CNT = LP_CNT + 1
Loop

GET_KEIKATUKI = LP_CNT
End Function

この関数の前提条件ですが、民法の原則通り期間の初日を不算入としています。

関数の中身は少々アナログな考え方です。

期間の初日から終日までにわたり、毎月の期間の初日に応答する日の前日が満了するごとに1月ずつカウントしていき、期間の週日が到来したときにそれまでにカウントした月を返すように作っています。

このコードを標準モジュールに貼り付けることで、クエリやフォーム、レポート内のテキストボックスで利用できます。

変数KISAN_YMDに 起算日を日付型で代入し、変数KIZYUN_YMDに月数を求めたい時点の日付を日付型で代入してください。

コメントをどうぞ!