Jednoduché makro pro výpočet RPSN standardní půjčky – tj. jistina půjčena na začátku a poté anuitní splácení.
Funkce RPSN bere tři parametry: výše půjčky (jistiny), počet měsíců splácení, výše měsíční splátky. Funkce vrací RPSN v procentech.
Pokud jsou na začátku nějaké poplatky spojené s půjčkou, je třeba je odečíst od výše půjčky. Pokud jsou pravidelné měsíční poplatky spojené s půjčkou, je třeba přičíst je k výši měsíční splátky. S nepravidelnými poplatky si funkce neporadí.
Funkce hledá řešení metodou půlení intervalu s počátečním intervalem -100 % až 99 999 %, pokud výsledek spadá mimo tento interval, vypíše chybu. Výsledek v procentech spočte s přesností na 2 desetinná místa.
Nejprve pomocná funkce pro výpočet sumy zlomků ze vzorce RPSN – SUMA 1/(1+i)^(1..n/12)
Function SumaZlomku(RPSN, obdobi) Dim i As Integer For i = 1 To obdobi SumaZlomku = SumaZlomku + 1 / (1 + RPSN) ^ (i / obdobi) Next i End Function
A nyní již samotná funkce pro výpočet RPSN:
Function RPSN(principal, per, pmt) I1 = -1 I2 = 999 Counter = 0 Do OneHalf = I1 + (I2 - I1) / 2 S = SumaZlomku(OneHalf, per) * pmt If S <= principal Then I2 = OneHalf Else I1 = OneHalf End If Counter = Counter + 1 If Counter > 9999 Then GoTo ErrorCycling End If Loop While Abs(I1 - I2) > 0.00001 RPSN = OneHalf Exit Function ErrorCycling: RPSN = "#PRILIS VYSOKE RPSN#" Exit Function End Function
Podotýkám, že nejsem ve VBA příliš kovaný, takže je možné, že by šla funkce napsat lépe. Ale funguje, a to je nejdůležitější.
Vzorecek bohuzel nefunguje. Napr. nedava stejne vysledky jako kalkulacka na https://www.pujcka.co/vypocet-rpsn ani jako oficialni priklady na https://www.coi.cz/userdata/files/tiskove-zpravy/modelove-priklady-vypoctu-rpsn.pdf
Pokusil jsem se to opravit a tady je vysledek (bez zaruky! ale uz aspon dava stejne vysledky jako ty kalkulacky)
Function SumaZlomku(RPSN, obdobi, splatka)
Dim i As Integer
For i = 1 To obdobi
SumaZlomku = SumaZlomku + splatka / (1 + RPSN) ^ (i / (12))
Next i
End Function
Function RPSN(jistina, pocetSplatek, vyseSplatky)
I1 = -1
I2 = 999
Counter = 0
Do
OneHalf = I1 + (I2 – I1) / 2
S = SumaZlomku(OneHalf, pocetSplatek, vyseSplatky)
If S 9999 Then
GoTo ErrorCycling
End If
Loop While Abs(I1 – I2) > 0.00001
RPSN = OneHalf
Exit Function
ErrorCycling:
RPSN = „#PRILIS VYSOKE RPSN#“
Exit Function
End Function