Excel - Amortization w/ variable interest rate
Asked By Betty K
21-Nov-09 09:37 AM
Need to create a spreadsheet where the interest rate is variable and can be
entered each month. Payments are being made in varying amounts also in order
to pay off earlier than the minimum payment would achieve. Example: $10,000
original loan amount dated 10/25/09; monthly payments of varying amounts
starting 11/25/09; current interest rate is 3.25%. Would like to enter the
interest rate, payment amount and date of payment and have it calculate the
interest paid for that period, cumulative interest, and the declining
balance. Are there too many variables to make this happen?
NextDate
(1)
PrevDate
(1)
PrevBal
(1)
Particulars
(1)
Joeu2004
(1)
Months
(1)
Loans
(1)
Years
(1)
Joe User replied to Betty K

No. it is "no problem" at all, except that I am not aware of any existing
templates that will do this. Then again, templates are not my thing.
Perhaps someone else can give you a pointer.
For each line of the amortization schedule (or payment record, if you
prefer), generally the interest due for the period is always
prevBal*rate/12, where "rate" is the current annual interest rate.
At least, that is the case for so-called "closed-end" loans like mortgages.
For "open-end" loans like a HELOC, the interest due for the period might be
based on a daily balance. So the interest due for the period is
(nextDate-prevDate)*rate/365, where "nextDate" and "prevDate" refer to the
payment dates.
(Note: I am writing from the perspective of the US. I suspect the same
general principles apply to other countries. But some details in the
calculations might differ. Also, some computation details might vary
depending on the terms of the loan.)
In either case, the remaining balance is always prevBal - payment - intPaid.
This is true for any amortization schedule. In your case, the difference
is: you will want to determine the amount of "payment" and "rate" from
entries in the current line instead of from values calculated one time in
individual cells.
You might also want to have a column to calculate the minimum payment. For
a "closed-end" loan, that would be based on the remaining number of months
for the loan. For an "open-end" loan, you could chose an arbitrary term
(e.g. 5 years), unless the loan has a time limit.
If you would like some hands-on assistance with this, I would not mind
helping you construct a bare-bones spreadsheet (nothing fancy). Since I
might need some particulars, it would be best if you sent me email. If you
are interested, send email to joeu2004 "at" hotmail.com.
----- original message ----

Errata. . . . I meant to write the paradigm: IF(OR(A1 = 3D{"V", " = BDV", "i", " = BDi"}), . . .) joeu2004 was thinking very hard : That was my bad due to having an overload day. Everything AF$17, $B$21:$AF$32 and $B$36:$AF$47 are edited. Right? Hi Joeu2004 I feel bad not being able to explain it better, English is not my native 47 are edited. Right? I have got to go, will be back tomorrow. Cimjet Hi Joeu2004 I appreciate your patient with me and will start over with one code. It gets edited. Right? Hi Garry Thanks for your patient and this is what I posted to Joeu2004. Hi Joeu2004 I appreciate your patient with me and will start over with one code. It gets two unfamiliar languages at the same time: English *and* VBA. If you noticed, Javed and joeu2004 both mentioned that using the WorksheetChange event is causing you trouble. I encourage you to work your way through joeu2004's list of questions (I included them below) and answer them in-line. When you 47? [ ] - - Clif McIrvin (clare reads his mail with moe, nomail feeds the bit bucket :-) Hi Joeu2004 To answer your questions. ranges $B$6:$AF$17, $B$21:$AF$32 and $B
LastRow Then If LookupDate > = CellDate Then ReturnDateIndex = Cells(RowCount, Target.Column + 1) End If Else NextDate = DateValue(Cells(RowCount + 1, Target.Column)) 'convert date to same year as lookup date If FoundNewYear = True Then 'move date to next year NextDate = DateSerial(StartYear + 1, _ Month(NextDate), _ Day NextDate)) Else NextDate = DateSerial(StartYear, _ Month(NextDate), _ Day(NextDate)) End If If LookupDate > = CellDate And _ LookupDate < = NextDate Then ReturnDateIndex = Cells(RowCount, Target.Column + 1) Exit For End If End If Next RowCount
2 decimal places* * ColI: PeriodTotal (Month in this case; contains the following formula) = IF(AND(NextDate = "", This_ET<> ""), ProjectTime-SUM($I$19:LastCell), IF(AND(NextDate<> "", Next_ET = "", MONTH(ThisDate) = MONTH(NextDate)), ProjectTime-SUM($I$19:LastCell), IF(AND(NextDate<> "", Next_ET<> "", MONTH(ThisDate) = MONTH(NextDate)), "", IF(AND(NextDate<> "", MONTH NextDate)<> MONTH(ThisDate)), ProjectTime-SUM($I$19:LastCell), "")))) * *This formula determines the period (day, month)* * * *Only ColAbsolute (B), RowRelative (n); RefersTo: = $Bn Next_ET ColAbsolute (H), RowRelative (n+1); RefersTo: = $Hn+1 NextDate ColAbsolute (B), RowRelative (n+1); RefersTo: = $Bn+1 ProjectTime ColAbsolute (J), RowRelative (n); RefersTo: = $Jn
www.eternal-september.org ClassicVB Users Regroup! comp.lang.basic.visual.misc It happens that joeu2004 formulated : Since the 2 cells containing the taxes have been processed using the ROUND() function see the problem with the unrounded SUM formula. The result is actually 332, 069.180000001. joeu2004 formulated the question : I guess you still do not understand my point as stated, BUT decimal places. Rounding to 2 decimal places returns the same binary representation as the constants. joeu2004 brought next idea : I am not disputing any of this! You seem to have invented _ _and_ _ their intermediate sums and their final sum are integers no greater than 2^53. joeu2004 presented the following explanation : This example did not use ROUND() to calc the taxes, and access at http: / / www.eternal-september.org ClassicVB Users Regroup! comp.lang.basic.visual.misc joeu2004 brought next idea : I know what you meant. . . - - Garry Free usenet access at http: / / www.eternal-september.org ClassicVB Users Regroup! comp.lang.basic.visual.misc joeu2004 laid this down on his screen : I also see your point for using ROUND() with that might trip up Mondou later on. I really cannot say that any more clearly. joeu2004 was thinking very hard : I gathered that! I just saw no point in creating a
Next_V = .Range("B" & (R + 1)).Value If V = Next_V Then ThisDate = .Range("J" & R).Value NextDate = .Range("J" & (R + 1)).Value If ThisDate < NextDate Then .Rows(R + 1).Delete ''? here Else .Rows(R).Delete End If Else R = R any ideas on this one. . Many thanks Eddie Excel Programming Discussions Range J R .Value NextDate (1) Workbooks (1) Len .Cells (1) Worksheet (1) FieldInfo (1) DataType (1) Macro (1) Date Next_V = .Range("B" & (R + 1)).Value If V = Next_V Then ThisDate = .Range("J" & R).Value NextDate = .Range("J" & (R + 1)).Value If ThisDate < NextDate Then .Rows(R + 1).Delete ''? here Else .Rows(R).Delete End If Else R = R clear and again thank you for looking at this for me. Eddie Maybe. . . If ThisDate < NextDate Then 'Column M cell must be blank If Len(.Cells(R + 1, 13)) = 0 Then