【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?

エクセルの関数で、出生年月日と死亡年月日(健在者は、契約年月日)は入力済みです。

別の列に死亡(契約)年月日から出生年月日をひいて、契約(もしくは現時点)時の年齢や死亡時の年齢を表示させる関数を教えてください。

また、明治38年以降が、自動的に計算されて西暦になおせますが、それ以前(文化や弘化など)も西暦になおせる関数があればおしえてください。

セルC4に死亡年月日(健在者は、契約年月日かまだ未契約の方はTODAY)
セルC3に出生年月日(死亡・健在問わず)

印刷範囲外で、セルJ4に死亡年月日の西暦表示
同様にセルJ3に出生年月日の西暦表示

セルK3とK4をあらかじめ結合させておいて、そのセルに年齢を表示させたいと思います。

アドバイスをお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

とっても詳しく説明していただいてありがとうございます。

少しづつ理解していこうと思いますが・・・

またゆっくり確認して仕上げていきますね。

ありがとうございました。

お礼日時:2007/01/14 11:28

>それ以前(文化や弘化など)も西暦になおせる関数があれば



【和暦を西暦に変換 関数】は、組み込まれていないので・・・

http://www.fct.co.jp/benri/nenrei/sei-gen.all.html
を参考にしてみては?
(データ取り込み後、配列変換出来る関数式を組めるのであれば、ゼロから入力するよりも楽ですが・・・)

この回答への補足

http://park2.wakwak.com/~fivesprings/books/age.h …
上記のサイトで、簡単に(平成18年までですが・・・)年齢計算はできました。

BUT 職場のPCは、ネットはできないので、(専用のサイトしかいけない)使用できそうにもないです・・・

補足日時:2007/01/13 20:38
    • good
    • 0

>文化や弘化など)も西暦になおせる関数があればおしえてください


今ではあまりそんな必要は、特殊な世界・業界以外は必要ないでしょう。
http://www.netz.co.jp/kenbun/kurasi/dentaku/koyo …
のようなサイトが見つかりました。
年号と西暦年の対照表を作り、関数ならVLOOKUP関数でできそう。

この回答への補足

たしかに、簡単に和暦を西暦に変換できますね。

これを、年齢に変換する関数に組み込んでみますね。

でも、なかなかだな。

補足日時:2007/01/13 15:59
    • good
    • 0

=DATEDIF(C3,C4,"Y")


で、年齢が出ます。
この関数は、サポートされなくなる可能性がある関数です。
でも、まだ使えます。office2007では、どうなるか判りませんが…。

また、明治38年以前の年号には対応している関数はありません。
表示させるには、自分で年号と年を定義して表を作るしかありません。

この回答への補足

=DATEDIF(C3,C4"y")
で、確かに簡単に年齢はでるんですが、
問題は、M38以前なんですよね。

古い戸籍の人はたいていが、明治初期か、弘化とか慶応とかでして、西暦だけで、単に満年齢で表示させるしかないですかね・・・

補足日時:2007/01/13 15:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報