将 VLOOKUP 与多个 criteria/multidimensional Vlookup 结合使用

Using VLOOKUP with multiple criteria/multidimensional Vlookup

我正在尝试创建一个摊销 table,其中利率取决于用户提供的两个输入。

X 代表行,Y 代表列。 X、Y 和利率的值已经设置在 4 X 6 table 中。例如,如果用户输入 X=2 和 Y=3,则利率将确定为 5%。

IF 函数可以,但会占用大量时间且效率不高。

我考虑过使用数组,我认为 Vlookup 是最有效的。在 Excel 中,我将 Vlookup 与 Match 一起使用,它起作用了,但我很难将它翻译成 VBA 代码。

Option Explicit

Sub Amortisation()

    Dim intRate, loanLife, initLoanAmt
    Dim yrBegBal, intComp, prinComp, yrEndBal, annualPmt
    Dim outRow, rowNum, outsheet

    outRow = 3 'output table begins from row 4

    outsheet = "loan amort"
    Worksheets(outsheet).ActivateDo

    loanLife = InputBox("Enter loan life." _
      & " Loan life must be a whole number")

    If loanLife < 0 Or (loanLife - Round(loanLife) <> 0) Then
        MsgBox ("Loan life must be a whole number.")
        End
    End If

    initLoanAmt = InputBox("Enter loan amount." _
      & " Loan amount must be a positive whole number")

    If initLoanAmt < 0 Or (initLoanAmt - Round(initLoanAmt) <> 0) Then
        MsgBox ("Loan amount must be a positive whole number.")
        End
    End If

End Sub

我希望 VBA 使用给定的输入从下面的 table 中选择利率,而不是像我对其他输入所做的那样提示利率。

所以如果 X(贷款期限)是 5,Y(初始贷款金额)是 700,那么我希望 VBA 使用 10 作为利率。

在此之后,我可以使用 PMT 函数继续摊销 table。

只需将您的 table 命名为 "InterestRates" 的范围即可。然后你可以这样访问 VBA 中的命名范围:

Option Explicit

Sub Amortisation()

Dim intRate As Double, loanLife As Long, initLoanAmt As Long
Dim yrBegBal, intComp, prinComp, yrEndBal, annualPmt
Dim outRow, rowNum
Dim outsheet As Worksheet
Dim rng As Range

outRow = 3 'output table begins from row 4

Set outsheet = Worksheets("loan amort")
outsheet.ActivateDo

loanLife = InputBox("Enter loan life." _
  & " Loan life must be a whole number")

If loanLife < 0 Or (loanLife - Round(loanLife) <> 0) Then
    MsgBox ("Loan life must be a whole number.")
End If

initLoanAmt = InputBox("Enter loan amount." _
  & " Loan amount must be a positive whole number")

If initLoanAmt < 0 Or (initLoanAmt - Round(initLoanAmt) _
  <> 0) Then
    MsgBox ("Loan amount must be a positive whole number.")
End If

Set rng = outsheet.Range("InterestRates")

loanLife = Evaluate("MATCH(" & loanLife & ",INDEX(InterestRates,,1),0)")
initLoanAmt = Evaluate("MATCH(" & initLoanAmt & ",INDEX(InterestRates,1,),0)")

intRate = rng.Cells(loanLife, initLoanAmt).Value

End Sub

假设您已将整个 table(包括 headers 和行名称)命名为 "InterestRates",这应该对您有用。这还假设您的利率范围在 "loan amort" sheet 上。所需的利率将分配给变量 intRate,您可以在最后添加代码以使用它。

顺便说一句,我用变量类型声明了你的一些变量。您应该考虑将变量类型添加到其余部分。我还删除了两条 End 行,因为它们不是必需的。