Bijzonder uitkomst For to Loops

Status
Niet open voor verdere reacties.

Jacob01

Gebruiker
Lid geworden
7 feb 2009
Berichten
65
Sinds lange tijd weer hobby'en en terug op dit fantastische forum.

Ben bezig met een loop ten behoeve van een financiële berekening.
Bereken een annuïteit en dan de totale betaalde rente over de hele looptijd. Dit is me gelukt in VBA waar ik blij mee ben.

Nu wil ik simuleren en een loop met meerdere hoofdsommen. Ook dit lukte verrassend.

Echter doet hij de berekening goed maar de bijbehorende hoofdsom geeft hij verkeerd weer. Dit is misschien wat financieel, maar even technisch, waarom gaat in onderstaande de loop in de PMT de berekende hoofdsom wel goed. (Hij pakt ondanks de "u" loop, waar de hoofdsom naar 0 gaat toch de oorspronkelijke hoofdsom + 500 telkens in de "h" loop) maar in de msgbox geeft hij niet de hoofdsom weer maar enkel 500.

Waarom pakt die in de formule wel de goede maar in de Msgbox niet!?

Code:
Sub Financiele_analyse()
    '=PMT(,,)
    '=PV()
    '=RATE()
    '=NPER()

  hoofdsom = [b2]
  rente = [c3]
  aantal_termijnen = [c4]
    
For h = 1 To 10
'Voor de berekening pakt hij de goede hoofdsom
'De msgbox niet dan pakt hij na de eerste juiste hoofdsom alleen de 500


termijn_bedrag = Pmt(rente, aantal_termijnen, [U][B]hoofdsom[/B][/U]) * -1
MsgBox [B][U]hoofdsom[/U][/B]

For u = 1 To aantal_termijnen
a = rente * hoofdsom
b = termijn_bedrag - a
hoofdsom = hoofdsom - b
x = a + x
Next u

hoofdsom = hoofdsom + 500

[g1].End(xlDown).Offset(1, 0) = x

Next h
 

Bijlagen

Laatst bewerkt:
Bijlage is toegevoegd. Maakt het inderdaad wat helderder denk ik ja.
 
Wat wil je nu precies precies bereiken met deze trage code? De for h = 1 to 100 lus doet niets. De for u = 1 to aantal_termijnen lus zorgt ervoor dat de hoofdsom 0 wordt. Vervolgens tel je er 500 bij op op en dan ben je verbaasd dat de msgbox 500 weergeeft?
 
Wat wil je nu precies precies bereiken met deze trage code? De for h = 1 to 100 lus doet niets. De for u = 1 to aantal_termijnen lus zorgt ervoor dat de hoofdsom 0 wordt. Vervolgens tel je er 500 bij op op en dan ben je verbaasd dat de msgbox 500 weergeeft?


De for h 1 to 100 doet wel degelijk iets, die zorgt er voor dat er 100 scenario's worden berekend met 100 verschillende hoofdsommen. (telkens 500 erbij)
For u lus zorgt er voor dat uit alle met de PMT berekende losse termijnen de rente berekend wordt, en het totaal over de 240 termijnen betaalde rente opgeteld.


De redenatie die je geeft dat de hoofdsom naar 0 gaat en deze derhalve in de msgbox (0+500) weergeeft volg ik volledig echter gaat het mij om de inconsistentie.
Maar wat ik niet begrijp is dat hij (gelukkig) wel goed gaat in de pmt formule qua hoofdsom.

Daar neemt die namelijk wel de juiste hoofdsom beginnend bij 88.500 en dan telkens 500 erbij, en daar berekent hij dan in de u lus weer alle rentes uit.

Ondanks dat deze telkens weer start na de "u-lus" en dus hoofdsom 0 maakt, telt hij in die formule wel met de juiste hoofdsom.

Dus eerst 88.500 dan 89.000 dan 89.500 als hoofdsom etc. etc.

Dus wat ik mij afvraag waarom gaat het in de geprogrammeerde PMT formule wel goed en in de MsgBox niet?
 
Ik zie wat er fout ging, en waarom het inconsistent leek.
Hij berekende de rente wel goed omdat hij telkens een nieuwe annuïteit berekende maar dan over €500 en daar dan de rente van voor de totale looptijd.
Dit telde die weer op bij x.

Heb hem nu aangepast, vergat x op 0 te zetten na de u-loop.


Nu wordt de hoofdsom telkens opgeplust met 500, daarna hernoemd, daarna bereken ik de annuïteit, daarna de totale rente (x) over de 240 termijnen.
Dan moet ik de totale rente weer op 0 zetten en begint het opnieuw.

Code:
Sub Financiele_analyse()
    '=PMT(,,)
    '=PV()
    '=RATE()
    '=NPER()

Application.ScreenUpdating = False

  hoofdsom = [b2]
  rente = [c3]
  aantal_termijnen = [c4]
    
For h = 1 To 10
'Voor de berekening pakt hij de goede hoofdsom
'De msgbox niet dan pakt hij na de eerste juiste hoofdsom alleen de 500


'1 optellen en msg box

'2 Hernoemen
'3 Pmt formule
'4 rente loop

'telkens 500 optellen bij de hoofdstom
hoofdsom = hoofdsom + 500

'de hoofdsom benoemen tbv de For U loop
hoofdsom2 = hoofdsom

   
termijn_bedrag = Pmt(rente, aantal_termijnen, hoofdsom2) * -1


For u = 1 To aantal_termijnen
a = rente * hoofdsom2
b = termijn_bedrag - a
hoofdsom2 = hoofdsom2 - b
x = a + x
Next u


[g1].End(xlDown).Offset(1, 0) = x
[g1].End(xlDown).Offset(0, 2) = termijn_bedrag
[g1].End(xlDown).Offset(0, 1) = hoofdsom

x = 0

Next h

Application.ScreenUpdating = True
    
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan