Я пытаюсь изменить текущий способ работы моих циклов. В настоящее время у меня есть набор ссуд, и цикл выполняет вычисления для каждого ссуды за k периодов, прежде чем перейти к следующему ссуде. Мне нужно отменить это и для каждого периода выполнить все вычисления для всех ссуд, а затем перейти к следующему периоду.
Я прикрепил текущий код ниже. вместо того, чтобы перебирать каждый кредит (как это происходит сейчас). Мне нужен код, чтобы сначала выполнить цикл по каждому периоду, и в каждом периоде выполнять вычисления.
Я попытался поменять местами циклы, выполнив следующие действия, но мне кажется, что я что-то упустил. проблема в том, что оригинальным способом мне не пришлось смотреть на стоимость других кредитов для каждого периода. но по-новому, для каждого займа мне нужно иметь возможность ссылаться на значения предыдущего периода, и я не знаю, будет ли работать что-то простое, например, NotionalEndBal (z, k - 1)?
Есть мысли / подсказки? / ссылки приветствуются. Заранее спасибо.
' Loop through each loan
For k = 0 To TotalPeriods
' Clear the notional amort arrays
For q = 0 To TotalLoans1
NotionalBegBal(q, 0) = 0
NotionalPMT(q, 0) = 0
NotionalInt(q, 0) = 0
NotionalPrin(q, 0) = 0
NotionalEndBal(q, 0) = 0
NotionalAmortFact(q, 0) = 0
CurRateArray(q, 0) = 0
Next q
' Begin the notional amortization with the zero period balance and the amort factor set to
' one
For z = 1 To TotalLoans1
If k = 0 Then
NotionalEndBal(z, 0) = gp1CurBalArray(z, 0)
NotionalAmortFact(z, 0) = 1
Else
NotionalBegBal(z, 0) = NotionalEndBal(z, k - 1)
' original code below
' Loop through each loan
For k = 1 To TotalLoans1
' Clear the notional amort arrays
For q = 0 To TotalPeriods
NotionalBegBal(q, 0) = 0
NotionalPMT(q, 0) = 0
NotionalInt(q, 0) = 0
NotionalPrin(q, 0) = 0
NotionalEndBal(q, 0) = 0
NotionalAmortFact(q, 0) = 0
CurRateArray(q, 0) = 0
Next q
' Begin the notional amortization with the zero period balance and the amort factor set to
' one
For z = 0 To TotalPeriods
If z = 0 Then
NotionalEndBal(z, 0) = gp1CurBalArray(k, 0)
NotionalAmortFact(z, 0) = 1
Else
NotionalBegBal(z, 0) = NotionalEndBal(z - 1, 0)
' Determine the current period interest rate. If fixed rate use given rate, otherwise
' variable tests need to be run
If FixedFloat = "Fixed" Then
CurRateArray(z, 0) = gp1FxdRateArray(k, 0)
Else
' Floating rate assets in the first period use the introductory interest rate
If z = 1 Then
CurRateArray(z, 0) = gp1IntroRateArray(k, 0)
Else
' Floating rate assets at their first reset are bound by the initial cap
If z = gp1ResetFreqArray(k, 0) Then
CurRateArray(z, 0) = min(gp1AssetFloatArray(z, _
gp1IndexArray(k, 0)) + gp1MarginArray(k, 0), _
CurRateArray(z - 1, 0) + gp1InitCapArray(k, 0), _
gp1CeilingArray(k, 0))
Else
' Otherwise the assets are bound by the subsequent cap and the ceiling
If z Mod gp1ResetFreqArray(k, 0) = 0 Then
CurRateArray(z, 0) = min(gp1AssetFloatArray(z, _
gp1IndexArray(k, 0)) + gp1MarginArray(k, 0), _
CurRateArray(z - 1, 0) + gp1SubCapArray(k, 0), _
gp1CeilingArray(k, 0))
Else
CurRateArray(z, 0) = CurRateArray(z - 1, 0)
End If
End If
End If
End If
' If the payment is already provided then use it, otherwise calculate it based on
' Original Term, Rate, and Balance
If gp1ProvPmtArray(k, 0) > 0 Then
NotionalPMT(z, 0) = min(gp1ProvPmtArray(k, 0), _
NotionalBegBal(z, 0) + (CurRateArray(z, 0) * _
DayFactorArray(z, 0)) * NotionalBegBal(z, 0))
Else
NotionalPMT(z, 0) = min(VBA.Pmt(CurRateArray(z, 0) * _
DayFactorArray(z, 0), gp1OrgTermArray(k, 0), gp1OrgBalArray(k, 0) * -1), _
NotionalBegBal(z, 0) + (CurRateArray(z, 0) * _
DayFactorArray(z, 0)) * NotionalBegBal(z, 0))
End If
' Pay notional interest
NotionalInt(z, 0) = (CurRateArray(z, 0) * DayFactorArray(z, 0)) _
* NotionalBegBal(z, 0)
' Check if loan is in an interest only period, if so do not pay principal. Otherwise
' principal is payment less interest
If z <= gp1IOPdsArray(k, 0) Then
NotionalPrin(z, 0) = 0
Else
NotionalPrin(z, 0) = NotionalPMT(z, 0) - _
NotionalInt(z, 0)
End If
' Calculate ending balance and amortization factor
NotionalEndBal(z, 0) = NotionalBegBal(z, 0) - _
NotionalPrin(z, 0)
NotionalAmortFact(z, 0) = NotionalEndBal(z, 0) / _
NotionalEndBal(0, 0)
End If
Next z
next k