Обратные размеры в петле - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь изменить текущий способ работы моих циклов. В настоящее время у меня есть набор ссуд, и цикл выполняет вычисления для каждого ссуды за 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

1 Ответ

0 голосов
/ 28 октября 2019

Алехандро.

Если бы я мог понять вас, и вам нужно просто инвертировать циклы for, взгляните на приведенный ниже код, думаю, он может вам помочь.

Sub Macro3()
    Dim total As Integer

    total = 3

    ' NORMAL FOR
    For i = 1 To total
        MsgBox i
    Next

    ' INVERTED FOR
    For i = total To 1 Step -1
        MsgBox i
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...