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

スポンサーリンク
この記事は約3分で読めます。

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

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

基準日時点の年齢を取得する自作関数を作りました
仕事上、年齢計算をする場面は多々あると思いますが、法律上の年齢計算の根拠はご存知でしょうか。Accessで法律の規定通りに年齢計算するための関数を作成しました。

そこで、民法通りの月数の計算ができるように自作した関数「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に月数を求めたい時点の日付を日付型で代入してください。

コメントをどうぞ!

  1. ちんく より:

    民法の応答日計算をAccessでしたくて、こちらの記事にたどり着きました。
    おかげさまで月の計算はできたのですが、次のようなことがしたいのですが、詰まりました。

    応答日計算で6月超(6月ちょうどは×)かどうかを判定

    例:2019/4/5~2019/10/3→5月と29日→×
      2019/4/5~2019/10/4→6月→×
      2019/4/5~2019/10/6→6月と1日→○

    もし何かいいアイデアがあれば教えていただましたら幸いです。よろしくお願いいたします。

  2. ちんく より:


    例の3つ目の2019/4/5~2019/10/6は
    2019/4/5~2019/10/5 の間違いです。すいません。

  3. 和休和休 より:

    ちんくさん、初めまして。
    コメントありがとうございます。
    ちょっと風邪をひいてまして、返事が遅くなってしまって申し訳ないです。

    念のため確認させてください。

    今回の例では、初日は算入するのですね。
    2019/4/5から起算していって、6月後の応当日は2019/10/5になります。
    民法第143条第2項により、起算日に応答する日の前日が末日となりますから、期間の末日は、2019/10/4です。この日をもって6月が満了したとなります。

    ちんくさんが求めていることは、ちょうど6月までは「×」6月を超えると「〇」の判定をしたい、ということでよろしいでしょうか。

    2019/4/5~2019/10/4 → × ちょうど6月
    2019/4/5~2019/10/5 → 〇
    2019/4/5~2019/10/6 → 〇

    もし違っていましたら、コメントください。

  4. 和休和休 より:

    2019/8/31から6月後はどうなりますか?

    2019/8/31を起算日として、6月後の応当日は2020/2/31となりますが、2/31という日付は無いので民法第143条第2項の規定により、その月の末日に満了します。
    すなわち、満了日は2020/2/29となります。

    2020/2/28 → ×
    2020/2/29 → × ちょうど6月
    2020/3/1 → 〇

  5. ちんく より:

    ありがとうございます。
    はい、最初の方について、言われるとおりで大丈夫です。

    2019/8/31から6月後については、確かに民法の規定上は、
    2019/8/31~2020/2/29でちょうど6月なのでしょうが、
    2019/8/30から6月後も、同じく2020/2/29になるのでしょうか、正直よく分かりません。

    2019/8/31~2020/2/29は、2019/7/31~2020/1/31と同じく、6月と1日で〇と言いたいのですが。。。
    ただ私の仕事の実際例としては出てくる可能性は極めて少ないので、気にしていただかなくても大丈夫です。すいません。

  6. ちんく より:

    2019/8/31~2020/2/29は、2019/8/30~2020/2/29と同じで、6月ちょうどで×でよいようです。
    失礼いたしました。よろしくお願いいたします。