Excel 令和対応の日付表示ユーザー定義関数
Excelのユーザー定義関数です。明治~令和対応の日付関数で、日付を渡すと、指定の書式に変換して返してくれます。また、「元年」表示、年度表示などにも対応しています。
主な特徴
Excel標準の日付書式設定に対応
年度表示対応
「元年」表示対応

関数の構成
DateEX([日付], [書式], [元号初年を「元」と表示するか否か], [年度の初日] )
(入力例1) =DateEX("2019/5/1", "gggee年mm月dd日") (結果) 令和01年05月01日 (入力例2) =DateEX("2019/5/1", "gggee年mm月dd日", TRUE) (結果) 令和元年05月01日
以下のソースコードを標準モジュールに貼り付けて使って下さい。
もともとは、ソースを書き直さなくても元号を追加できるよう、元号の情報を一行にまとめたテキストファイル(INIファイル)から読み込む仕様だったので、年号を判定する箇所は少し変わった書き方をしています。 気に入らない場合はSelect Caseに書き直してもいいかもしれません。
ソースコード
'************************************************************** '日付を指定の書式にして返すユーザー定義関数 '-------------------------------------------------------------- ' 明治から令和まで対応 ' 和暦の「元年」表示対応 ' 年度表示対応 '-------------------------------------------------------------- ' (引数) ' srcDate 基準になる日付 ' dateFormat 日付の書式 ' gannnen 和暦の初年を元年と表示する(TRUE)しない(FALSE) ' nendo 年度の開始日(例)4/1(その日を基準に年度を返す) '**************************************************************
Public Function DateEX(srcDate As Date, _ dateFormat As String, _ Optional gannen As Boolean = False, _ Optional nendo As String) As String
'-------------------------------------------------------------- '年度の開始日が設定されている場合は、基準日の年を切り替える '-------------------------------------------------------------- Dim srcDate_ As Date If nendo = "" Then srcDate_ = srcDate Else Dim firstDay As Date '年度の初日 (例)4/1 firstDay = Year(srcDate) & "/" & nendo '(例)4/1~12/31 => 本年度 If srcDate >= firstDay Then srcDate_ = firstDay Else '(例)~3/30 => 前年度 srcDate_ = _ Year(firstDay) - 1 & "/" & _ Month(srcDate) & "/" & _ Day(srcDate) End If End If
'-------------------------------------------------------------- '元号の情報を;で区切った元号マスタを配列として変数にセットする '-------------------------------------------------------------- 'この部分は外部のテキストファイルから読み込む仕様を '想定しています Dim gengoSource As String gengoSource = _ "明治,M,1868/01/25,1912/07/30;" & _ "大正,T,1912/07/30,1926/12/25;" & _ "昭和,S,1926/12/25,1989/01/07;" & _ "平成,H,1989/01/08,2019/04/30;" & _ "令和,R,2019/05/01,2119/04/30" _ Dim gengoMaster As Variant gengoMaster = Split(gengoSource, ";") '------------------------------------------------------------ '元号マスターの中から、引数の西暦が属する元号を探す '------------------------------------------------------------ Dim wareki As String For i = LBound(gengoMaster) To UBound(gengoMaster) '行全体 Dim gengoRow As String: gengoRow = gengoMaster(i) 'その行の元号の情報を,で区切った配列として変数にセットする Dim gengoDat As Variant: gengoDat = Split(gengoRow, ",") '各項目を変数にセットする Dim gengo As String: gengo = gengoDat(0) '元号 Dim gengoChar As String: gengoChar = gengoDat(1) '英頭文字 Dim startDate As Date: startDate = gengoDat(2) '開始日 Dim endDate As Date: endDate = gengoDat(3) '終了日 '対象の日付がその元号の開始日と終了日の間にある場合 If srcDate_ >= startDate And srcDate_ <= endDate Then '和暦 '引数の西暦から新元号の初年度の西暦を引いたものに1を足す wareki = Year(srcDate_) - Year(startDate) + 1 If wareki = 1 And gannen Then wareki = "元" End If Exit For End If Next '------------------------------------------------------------ 'フォーマットに基づいて文字列を構成する (日付の例)2019/5/1 '------------------------------------------------------------ '西暦年 dateFormat = _ Replace(dateFormat, "yyyy", _ Year(srcDate_), , , vbTextCompare) '4桁 2019 dateFormat = _ Replace(dateFormat, "yy", _ Format(Right(Year(srcDate_), 2), "00"), _ , , vbTextCompare) '2桁 19 '和暦年 dateFormat = _ Replace(dateFormat, "ee", _ Format(wareki, "00"), , , vbTextCompare) '2桁 01 dateFormat = _ Replace(dateFormat, "e", _ wareki, , , vbTextCompare) '2桁 1 '元号 dateFormat = _ Replace(dateFormat, "ggg", _ gengo, , , vbTextCompare) '令和 dateFormat = _ Replace(dateFormat, "gg", _ Left(gengo, 1), , , vbTextCompare) '令 dateFormat = _ Replace(dateFormat, "g", _ gengoChar, , , vbTextCompare) 'R '月 dateFormat = _ Replace(dateFormat, "mm", _ Format(Month(srcDate), "00"), _ , , vbTextCompare) '05 dateFormat = _ Replace(dateFormat, "m", _ Month(srcDate), , , vbTextCompare) '5 dateFormat = _ Replace(dateFormat, "dd", _ Format(Day(srcDate), "00"), _ , , vbTextCompare) '01 dateFormat = _ Replace(dateFormat, "d", Day(srcDate), _ , , vbTextCompare) '1
DateEX = dateFormat
End Function