• ベストアンサー

エクセル関数(現時点もしくは死亡時の年齢を表示させる)

エクセルの関数で、出生年月日と死亡年月日(健在者は、契約年月日)は入力済みです。 別の列に死亡(契約)年月日から出生年月日をひいて、契約(もしくは現時点)時の年齢や死亡時の年齢を表示させる関数を教えてください。 また、明治38年以降が、自動的に計算されて西暦になおせますが、それ以前(文化や弘化など)も西暦になおせる関数があればおしえてください。 セルC4に死亡年月日(健在者は、契約年月日かまだ未契約の方はTODAY) セルC3に出生年月日(死亡・健在問わず) 印刷範囲外で、セルJ4に死亡年月日の西暦表示 同様にセルJ3に出生年月日の西暦表示 セルK3とK4をあらかじめ結合させておいて、そのセルに年齢を表示させたいと思います。 アドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 ユーザー定義関数を作ってみました。 以下で分かるように、慶長からです。 A1: 天明2年 =HenkanYear(A1)  →1782年 となります。 A1 : 慶応   =HenkanYear(A1,0) 1866 という数字になります。 また、 1993/3/2 とシリアル値か文字列を入れれば、 →平成5年3月2日 どちらでも変換が可能です。 M2年 →1869年 A2 : M2年 =HenkanYear(A2,0) とすれば、1869 という数字になります。 (ただし、シリアル値-数字の場合は、すべて元号付きに変わりますから、表示形式には関係がありません。) なお、私製 DATEDIF関数も作れますが、この関数は、もともと、ナンセンスな部分があるので、できれば、一般関数で行えばよいと思います。 また、年号の変換を関数で、MS-DOS時代に作りました。そのときは、大化からですが、南北朝時代がうまくいきません。 標準モジュールでお試しください。 '----------------------------------------------- Private Const NENGO As String = "慶長,元和,寛永,正保,慶安,承応,明暦,万治,寛文,延宝,天和,貞享,元禄,宝永,正徳,享保,元文,寛保,延享,寛延,宝暦,明和,安永,天明,寛政,享和,文化,文政,天保,弘化,嘉永,安政,万延,文久,元治,慶応,明治,大正,昭和,平成" Private Const HAJIME As String = "1596,1615,1624,1644,1648,1652,1655,1658,1661,1673,1681,1684,1688,1704,1711,1716,1736,1741,1744,1748,1751,1764,1772,1781,1789,1801,1804,1818,1830,1844,1848,1854,1860,1861,1864,1865,1868,1912,1926,1989" Private Const OWARI As String = "1615,1624,1644,1648,1652,1655,1658,1661,1673,1681,1684,1688,1704,1711,1716,1736,1741,1744,1748,1751,1764,1772,1781,1789,1801,1804,1818,1830,1844,1848,1854,1860,1861,1864,1865,1868,1912,1926,1989" Public Function HenkanYear(arg As Variant, Optional flgNen As Boolean = True)  '年号変換関数, flgNen オプションは、年を数値にする  v.2662865.01  Dim arNengo As Variant  Dim arHajime As Variant  Dim arOwari As Variant  Dim yFing As Integer  Dim i As Integer  Dim mYear As Integer  Dim gYear As String  Dim yFig As Integer  Dim buf As String  arNengo = Split(NENGO, ","):  arHajime = Split(HAJIME, ","): arOwari = _  Split(OWARI, ",")  If IsDate(arg) And Not (arg Like "[一-龝][一-龝]*") Then arg = CDate(arg)  Select Case VarType(arg)   Case vbString    If InStr(arg, "日") > 0 Then     arg = Replace(arg, "日", ""): arg = Replace(arg, "年", "/"): arg = Replace(arg, "月", "/")    End If    If InStr(1, arg, "m", 1) = 1 Or InStr(1, arg, "t", 1) = 1 Or InStr(1, arg, "s", 1) = 1 Or InStr(1, arg, "h", 1) = 1 Then     arg = Replace(arg, "m", "明治", , , 1): arg = Replace(arg, "t", "/", , , 1): _     arg = Replace(arg, "s", "昭和", , , 1): arg = Replace(arg, "h", "平成", , , 1)    End If    ReDim Preserve arOwari(UBound(arOwari) + 1)    arOwari(UBound(arOwari)) = Year(Date)    If Left(arg, 4) Like "[一-龝][一-龝]#*" Then     For i = LBound(arNengo) To UBound(arNengo)      If StrComp(arNengo(i), Left(arg, 2)) = 0 Then       yFig = i       Exit For      End If     Next i     mYear = CInt(arHajime(yFig)) + CInt(Val(Mid(arg, 3, 2))) - 1          If InStr(arg, "/") > 0 Then      buf = Mid$(arg, InStr(arg, "/"))     Else      buf = "年" & Mid$(arg, 5)     End If    End If    If flgNen = False Then      HenkanYear = mYear    Else     HenkanYear = mYear & buf    End If   Case vbDate    mYear = Year(arg)    For i = UBound(arHajime) To LBound(arHajime) Step -1     If mYear >= arHajime(i) Then      gYear = arNengo(i)      If mYear = arHajime(i) Then       gYear = gYear & "元年"      Else       gYear = gYear & CStr(mYear - arHajime(i) + 1)      End If      HenkanYear = gYear & "年" & Format(arg, "m月d日")      Exit For     End If    Next i  End Select End Function

bijoudebijou
質問者

お礼

とっても詳しく説明していただいてありがとうございます。 少しづつ理解していこうと思いますが・・・ またゆっくり確認して仕上げていきますね。 ありがとうございました。

その他の回答 (3)

  • redowl
  • ベストアンサー率43% (2140/4926)
回答No.3

>それ以前(文化や弘化など)も西暦になおせる関数があれば 【和暦を西暦に変換 関数】は、組み込まれていないので・・・ http://www.fct.co.jp/benri/nenrei/sei-gen.all.html を参考にしてみては? (データ取り込み後、配列変換出来る関数式を組めるのであれば、ゼロから入力するよりも楽ですが・・・)

bijoudebijou
質問者

補足

http://park2.wakwak.com/~fivesprings/books/age.html 上記のサイトで、簡単に(平成18年までですが・・・)年齢計算はできました。 BUT 職場のPCは、ネットはできないので、(専用のサイトしかいけない)使用できそうにもないです・・・

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

>文化や弘化など)も西暦になおせる関数があればおしえてください 今ではあまりそんな必要は、特殊な世界・業界以外は必要ないでしょう。 http://www.netz.co.jp/kenbun/kurasi/dentaku/koyomi.html のようなサイトが見つかりました。 年号と西暦年の対照表を作り、関数ならVLOOKUP関数でできそう。

bijoudebijou
質問者

補足

たしかに、簡単に和暦を西暦に変換できますね。 これを、年齢に変換する関数に組み込んでみますね。 でも、なかなかだな。

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

=DATEDIF(C3,C4,"Y") で、年齢が出ます。 この関数は、サポートされなくなる可能性がある関数です。 でも、まだ使えます。office2007では、どうなるか判りませんが…。 また、明治38年以前の年号には対応している関数はありません。 表示させるには、自分で年号と年を定義して表を作るしかありません。

bijoudebijou
質問者

補足

=DATEDIF(C3,C4"y") で、確かに簡単に年齢はでるんですが、 問題は、M38以前なんですよね。 古い戸籍の人はたいていが、明治初期か、弘化とか慶応とかでして、西暦だけで、単に満年齢で表示させるしかないですかね・・・

関連するQ&A