利息計算を行うExcel関数(マクロ不使用)

MicrosoftiOS用のExcelを提供していますが、マクロを使うことはできません。そこで、(Excel用)裁判所における計算方法に従った利息計算を行う自作関数 INTCAL - 法律事務雑記帳(Excel用)1年に満たない端数期間の日数を平年日と閏年日に分けて計算する自作関数 FRACDAYS - 法律事務雑記帳と同じ機能の計算をマクロを使わずにできないかと思い、下記の関数を作りました。異様に複雑な計算式になっており、構造を理解するのは骨が折れますが、不思議と計算できます。
なお、関数中、「始」は期間開始日のセル、「終」は期間終了日のセルに置き換えてください。「パラ」は初日参入の有無のパラメータであり、「0」を代入すれば初日不算入(片端入れ)、「1」を代入すれば初日参入(両端入れ)となります。

関数

ステップ1:年

まず「年」を計算します。Excel一般機能:DATEDIF関数のバグ対策を参考にしています。

=INT((YEAR(終)*12+MONTH(終)-YEAR(始-パラ)*12-MONTH(始-パラ)-IF(DAY(始-パラ+1)=1,IF(DAY(終+1)>1,1),IF(AND(DAY(終+1)>1,DAY(終)<DAY(始-パラ)),1)))/12)
ステップ2:平年日

次に1年に満たない端数期間のうち平年に属する日数(以下「平年日」といいます)を計算します。ここが山場です。
「YEAR(EDATE(始-パラ,年*12))=YEAR(終)」の部分は、1年に満たない端数期間が同じ年に属するか否かの判定部分です。
「DAY(DATE(YEAR(終),3,0))=29」の部分は閏年か否かの判定部分です。2月の末日が29日か否かで閏年か否かを判定しています。

=IF(YEAR(EDATE(始-パラ,年*12))=YEAR(終),IF(DAY(DATE(YEAR(終),3,0))=29,0,DATEDIF(EDATE(始-パラ,年*12),終,"d")),IF(DAY(DATE(YEAR(EDATE(始-パラ,年*12)),3,0))=29,DATEDIF(DATE(YEAR(EDATE(始-パラ,年*12)),12,31),終,"d"),IF(DAY(DATE(YEAR(終),3,0))=29,DATEDIF(EDATE(始-パラ,年*12),DATE(YEAR(EDATE(始-パラ,年*12)),12,31),"d"),DATEDIF(EDATE(始-パラ,年*12),終,"d"))))
ステップ3:閏年

1年に満たない端数期間のうち閏年に属する日数(以下「閏年日」といいます)を計算します。閏年日の計算は、1年に満たない端数期間の日数から平年日を引くだけです。

=DATEDIF(EDATE(始-パラ,年*12),終,"d")-平年日
ステップ4:利息計算

最後は、上記の年、平年日、閏年日を裁判所の計算式に代入するだけです。一円未満の端数は切り捨てです。

=ROUNDDOWN(元金*年利*(年+(平年日/365+閏年日/366)),0)