(Excel用)月割計算による利息計算を行う自作関数 INTCALM

月割計算による利息計算を行うユーザー定義関数 INTCALM を作りました。1か月に満たない端数部分は年365日日割計算をします。
(Excel用)裁判所における計算方法に従った利息計算を行う自作関数 INTCAL - 法律事務雑記帳と併せて、住宅ローンの利息計算などにお使いください。
なお、INTCAL と同じく、ktDATEDIF(http://addinbox.sakura.ne.jp/Excel_Tips05.htm#ktDATEDIF2)が必要です。

使い方

=INTCALM(元金, 年利, 期間開始日, 期間終了日, [初日算入の指定, ][一円未満の端数処理の指定])

「初日算入の指定」以下は省略可です。省略した場合、「初日不算入(片端入れ)」「一円未満切捨」で計算します。

「初日算入の指定」には、0又は1を入力してください。0は「初日不算入(片端入れ)」、1は「初日算入(両端入れ)」です。何も入力しなければ「初日不算入(片端入れ)」となります。
「一円未満の端数処理の指定」には、0又は1又は2を入力してください。0は「切捨」、1は「四捨五入」、2は「切上」です。何も入力しなければ「切捨」となります。

使用例

H25.1.10融資実行のローン(元金6,000,000円)を元利均等払で毎月10日限り返済する場合を想定
(1) 元金6,000,000円、年利2.2%、期間H25.1.10~H25.2.10、初日不算入、切捨
(融資実行日から最初の約定弁済日までの1か月間の利息を計算する)

=INTCALM(6000000, 0.022, "2013/1/10", "2013/2/10", 0, 0) → 11000

(2) 元金5,503,240円、年利2.2%、期間H25.12.10~H25.12.25、初日不算入、切捨
(繰上返済する場合に直近の約定弁済日H25.12.10から繰上返済日H25.12.25まで15日間の利息を計算する)

=INTCALM(5503240, 0.022, "2013/12/10", "2013/12/25", 0, 0) → 4975

INTCALM のコード本体

'利息の月割計算 (interest calculation <month>)
Function INTCALM(元金 As Currency, 年利 As Double, 期間開始日 As Date, 期間終了日 As Date, _
                    Optional 初日算入の指定 As Integer = 0, Optional 一円未満の端数処理の指定 As Integer = 0)

    amount = 元金
    i = 年利
    date_begin = 期間開始日
    date_end = 期間終了日
    opt2 = 初日算入の指定
    opt3 = 一円未満の端数処理の指定

    'opt2 初日算入の指定
    '       0(default)  初日不算入(片端入れ)
    '       1           初日算入(両端入れ)
    'opt3 一円未満の端数処理の指定
    '       0(default)  切捨
    '       1           四捨五入
    '       2           切上
    
    '初日算入の処理
    date_begin = date_begin - opt2
    
    Dim ans As Currency
    
    m = ktDATEDIF(date_begin, date_end, "M")
    d = ktDATEDIF(date_begin, date_end, "MD")
    
    ans = amount * i / 12 * m + amount * i * d / 365 '1か月未満の端日数は年365日日割計算
    
    '一円未満の端数処理
    Select Case opt3
    Case 1 '四捨五入
        ans = Application.WorksheetFunction.Round(ans, 0)
    Case 2 '切上
        ans = Application.WorksheetFunction.RoundUp(ans, 0)
    Case Else '切捨
        ans = Application.WorksheetFunction.RoundDown(ans, 0)
    End Select
    
    If ((opt2 = 0) Or (opt2 = 1)) And ((opt3 = 0) Or (opt3 = 1) Or (opt3 = 2)) Then
        INTCALM = ans
    Else 'optが指定の数字以外の場合にエラーを出す
        INTCALM = CVErr(xlErrValue)
    End If
    
End Function

「関数ライブラリ」からダイアログボックスにより INTCALM 関数を利用する

Sub RegisterINTCALM()
  
    Application.MacroOptions Macro:="INTCALM", _
    Description:="月利による利息計算をします。1か月に満たない端数は年365日日割計算をします。", _
    Category:="財務", _
    ArgumentDescriptions:=Array( _
        "には利息計算の対象となる元金を指定します。", _
        "には年利を指定します。", _
        "には利息計算の対象となる期間の開始日を指定します。", _
        "には利息計算の対象となる期間の終了日を指定します。", _
        "0: 初日不算入(片端入れ)(default)" & vbCrLf & "1: 初日算入(両端入れ)", _
        "0: 切捨(default)" & vbCrLf & "1: 四捨五入" & vbCrLf & "2: 切上"), _
    HelpFile:=""
    
End Sub