用途
- 残存期間が1年以上(償還日が受渡日の1年応当日以降)である債券の残存年数の算出
※残存期間が1年以上である債券の残存年数=閏日を除く残存日数(片端)÷365
Excelでの数式
SEQUENCE
関数を使うことができないExcel 2019以前でも使用可能な関数で構成する。
コメントいただいているとおり、SEQUENCE
関数を用いれば、簡素に構成可能。
前提
次のとおり日付が入力されているものとする。
- A1セル:受渡日
- B1セル:償還日
※A1<B1
閏日の日数を得る数式
次のとおり数式を設定すれば、両日付の間の閏日の数を得られる。
=SUMPRODUCT((DAY(DATE(ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1)))),2,29))=29)*1,(INT(A1)+1<=DATE(ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1)))),2,29))*1,(DATE(ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1)))),2,29)<INT(B1)+1)*1)
2つの年を与えた場合にその間の年を含む配列を返すための方法として
ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1))))
を用いている。
その外側にSUMPRODUCT
関数を用いているので、配列数式ではあるがCtrl+Shift+Enter
不要。
日付の比較においてINT(A1)+1<=
や<INT(B1)+1
としているのは、A1セル又はB1セルに時刻入りの日付が含まれている可能性を想定。
閏日を除く残存日数(片端)を得る数式
次のとおり数式を設定すれば、両日付の間の日数(片端)であって、閏日を除く日数を得られる。
=INT(B1)-INT(A1)-SUMPRODUCT((DAY(DATE(ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1)))),2,29))=29)*1,(INT(A1)+1<=DATE(ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1)))),2,29))*1,(DATE(ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1)))),2,29)<INT(B1)+1)*1)
残存期間が1年以上であるか1年未満であるかに応じて残存日数(片端)を得る数式
IF関数及びEDATE関数を組み合わせて
=IF(B1>=EDATE(A1,12),INT(B1)-INT(A1)-SUMPRODUCT((DAY(DATE(ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1)))),2,29))=29)*1,(INT(A1)+1<=DATE(ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1)))),2,29))*1,(DATE(ROW(INDIRECT(CONCAT(YEAR(A1),":",YEAR(B1)))),2,29)<INT(B1)+1)*1),INT(B1)-INT(A1))
とする。残存年数を得るには365で除すればよい。
補論
http://seesaawiki.jp/w/minus_alpha/d/%B4%FC%B4%D6%B7%D7%BB%BB
にて紹介されている修正ユリウス日を用いる方法では、起算日又は満了日が閏日である場合に不具合を生じる。