Function monthpmt(inidate As Date, strtpmt As Date, nper As Integer, brate As Single, cpv As Double, yrdays As Integer, Optional rdg As Variant) As Double
Dim pctr As Integer, marka As Integer
Dim rsulta As Double, rsultb As Double, ctrb As Double
Dim emi As Double, emib As Double
Dim ctr As Byte
If DateSerial(Year(strtpmt), Month(strtpmt) + 1, 0) = strtpmt Then ctr = 1
emi = -Pmt(brate / 12, nper, cpv)
Do
rsulta = Abs(cpv)
pctr = pctr + 1
For i = 1 To nper
If i = 1 Then
If Not IsMissing(rdg) Then
rsulta = rsulta + WorksheetFunction.Round(rsulta * brate * _
(strtpmt - inidate) / yrdays, rdg) - emi
Else
rsulta = rsulta + (rsulta * brate * (strtpmt - inidate) / yrdays) - emi
End If
per = strtpmt
sel = testdate(ctr, strtpmt, i)
Else
If Not IsMissing(rdg) Then
rsulta = rsulta + WorksheetFunction.Round(rsulta * brate * _
(sel - per) / yrdays, rdg) - emi
Else
rsulta = rsulta + (rsulta * brate * (sel - per) / yrdays) - emi
End If
per = sel
sel = testdate(ctr, strtpmt, i)
End If
Next i
If WorksheetFunction.Round(rsulta, 2) = 0 Then Exit Do
If rsulta > 0 Then
marka = 1
Else
marka = -1
End If
If pctr < 2 Then
ctrb = marka * emi * 0.1
Else
If rsultb - rsulta = 0 Then Exit Do
ctrb = rsulta / (rsultb - rsulta) * ctrb
End If
emib = emi
rsultb = rsulta
emi = emib + ctrb
If Not IsMissing(rdg) Then emi = WorksheetFunction.Round(emi, rdg)
Loop Until pctr > 500
monthpmt = emi
End Function
Function testdate(dta, dtb, dtc) As Date
If dta = 1 Then
testdate = DateSerial(Year(dtb), Month(dtb) + dtc + 1, 0)
Else
testdate = DateAdd("m", dtc, dtb)
End If
End Function
|