Microsoft Access Club >SampleFile >インデックス >このページ >次頁 < 前項  サイト内検索


未来・過去にわたる年齢計算:SampleFile065



年齢の計算は、現時点を基準に年齢を算出する方法と、未来及び過去の時点における年齢を算出する方法 とがあります。今回は、後者の未来及び過去の時点での年齢計算方法をご紹介します。表示させるフォーム形式は、2種類用意しています。

テーブルデータ

サンプルとして、下記のようなテーブルを想定して下さい。ランダムに生年月日を設定しています。

ID 氏名 生年月日
1 芳田正巳 1960年5月24日
2 窪田高次 1954年12月3日
3 坂木健二 1961年3月12日
4 南正一 1964年6月1日
5 市川健作 1959年4月30日
6 神田正春 1961年2月14日
7 柴田明子 1971年7月22日
8 末沢順子 1969年2月21日
9 田中幸一 1961年8月31日
10 高木香奈 1970年9月30日
11 春樹一郎 1963年1月2日
12 前田洋子 1969年4月19日
13 北田明子 1972年11月30日
14 北川信二 1962年4月2日
15 真鍋涼子 1970年3月21日
16 佐藤今日子 1971年10月21日
17 林慶子 1969年12月25日
18 前田京子 1969年4月11日

未来にわたる年齢計算 / テキストボックス入力の場合

下記のようなフォームを用いて、帳票形式で各人について年齢を表示させてみましょう。

解説
  1. フォーム上のテキストボックスにテーブルデータを加工してデータを表示させる場合はクエリを用います。
  2. tbl_sampleテーブルを元にしたクエリを作成します。
  3. 新しいフィールドを作成し、以下の関数を記述します。

  1. 上記クエリへの 年齢計算 フィールドにある GetYears と GetMonth は 、独自に作成したFunction関数です。

標準プロシージャ GetYears

年を求める標準プロシージャです。
Function GetYears(dat年月日 As Date, dat基準日 As Date) As Integer

    Dim datBirthday_1 As Date
    Dim datBirthday_2 As Date

    '日付形式であるかどうか判断します。Null対策も含みます。
    If IsDate(dat年月日) Then

        '日付の間隔を計算する DateDiff関数 を用いて"年"を計算します。
        GetYears = DateDiff("yyyy", dat年月日, dat基準日)

        datBirthday_1 = Format(dat年月日, "mm/dd") '今年の誕生日を求めます
        datBirthday_2 = Format(dat基準日, "mm/dd")
        
        '誕生日が過ぎていれば求めたGetYearsから1歳を引きます。
        If datBirthday_1 > datBirthday_2 Then GetYears = GetYears - 1
        
        'dat基準日が誕生日以前の日であれば求めたGetYearsから1歳を足します。
        If GetYears < 0 Then GetYears = GetYears + 1

    End If

End Function

標準プロシージャ GetMonth

月数を求める標準プロシージャです。

Function GetMonth(dat年月日 As Date, dat基準日 As Date) As Integer

    Dim dblBirthday As Double

    If IsDate(dat年月日) Then  'dat年月日がDate型か否かを判別します。
    
        dblBirthday = (DateDiff("m", dat年月日, dat基準日))
   
        '誕生日が過ぎていれば求めた birthday から1歳引きます。
        If (DatePart("d", dat年月日) > DatePart("d", dat基準日)) Then
            dblBirthday = dblBirthday - 1
        End If
   
        'dat基準日が誕生日以前の日であれば、求めたdblbirthdayから1歳を足します。
        If dblBirthday < 0 Then
            dblBirthday = dblBirthday + 1
        End If
   
        GetMonth = dblBirthday Mod 12

    End If

End Function

未来にわたる年齢計算 / InputBox入力の場合

次は、フォームが開かれると同時に 基準日の入力を求めるInputBoxが表示され、入力した日付でデータ表示される仕組みをお話します。

フォームの開く時イベントプロシージャの作成

フォームの開く時イベントに以下のようなプロシージャを記述します。

Private Sub Form_Open(Cancel As Integer)

    Dim str内容 As String
    Dim strInput As String
    Dim strMsg As String

    str内容 = "年齢計算を行う基準日を入力して下さい。" & Chr(13) & _
              "入力形式はyyyy/mm/ddです。"
    strInput = InputBox(str内容, "管理者")  'InputBoxを用いて、入力を求めます。
    strMsg = "フォームを開けません。" & _
	     "入力形式がyyyy/mm/ddと異なるか、キャンセルされました。"

    'IsDate関数を用いて、入力形式がDate型か否かを判断します。
    If IsDate(strInput) Then  
        Me.txt基準日 = strInput
    Else
        MsgBox strMsg, 16, "Akira"
        End      'フォームを開かず終了します。
    End If
 
    DoCmd.SelectObject acForm, "frm_sample", True
    DoCmd.Minimize

End Sub
解説
  • InputBoxの返す値  を利用する時には直接用いるのではなく、変数を間に挟ませるのが一般的です。また、ここでもIsDate関数を用いてエラーチェックを行っています。

読み込み時イベントプロシージャの作成

フォームの読み込み時イベントに以下のようなプロシージャを記述します。

Private Sub Form_Load()

  DoCmd.Requery

End Sub
解説

最後にメインフォームを作成して終了です。一度サンプルファイルで確認して下さい。

留意点

誕生日や年齢については、詳しく求めれば求めるほど誤差が生じます。一例を挙げますと下記のようなことが生じます。

  1. 厳密には、12月1日に誕生した人は、翌年の11月30日に満一年を迎えます。 しかし、DateDiff()関数を用いる限り12月1日に1歳年齢が上がってしまいます。
  2. 世間では、4月30日に誕生した人は、翌年の2月28日には10ヶ月目を迎えているはずですが、 このサンプルソフトでは9ヶ月目になります。つまり、月単位の計算ではなく日数の経過単位であることが原因です。 3月29日では10ヶ月目、3月30日で11ヶ月目になります。

関連ページ

ページの先頭へ 前ページへ戻る

 


未来・過去にわたる年齢計算:SampleFile065


 

-Microsoft Access Club-

PLESKコンパネインストール済みの専用・共有レンタルサーバーを提供しています。日本語版で信頼性は抜群です。
PLESKインストール済みの専用・共有レンタルサーバーを提供しています。
信頼性は抜群です。コンパネ表記は日本語で信頼性は抜群です。