vba - 将预定义的 excel 函数应用于 VBA for 循环数组以创建新函数

标签 vba excel for-loop switch-statement

我曾使用过另一种编程语言,但 VBA 对我来说是一个相对较新的平台。我知道我想要执行的算法,但是我遇到了一些问题。

我一直在尝试为债券的市场 yield 创建一个财务模型,因为在事物的自然过程中,我需要使用求解器,所以我决定使用工作表函数 IRR,其数组定义为 FOR 循环和案例结构如图所示。我之前只是在 VBA 中使用 IRR 函数,它显示错误-“类型不匹配:需要数组或用户定义的类型”。

但是,现在我没有看到任何错误,但我的函数说其中一个参数是错误的数据类型。如果有人能告诉我我在这里做错了什么,我将不胜感激。

Function Market_Yield(Clean_Price As Variant, Number_of_Payments As Integer, Coupon As Variant, Face As Variant, AccIn As Variant) As Variant

    Dim Payment As Variant

    For i = 0 To Number_of_Payments

        Select Case i
        Case Is = 0
            Payment(i) = -Clean_Price

        Case Is = Number_of_Payments - 1
            Payment(i) = (AccIn / Coupon) + (Coupon * Face)

        Case Is = Number_of_Payments
            Payment(i) = ((Coupon * Face) - (AccIn)) + (((Coupon * Face) - (AccIn)) / Coupon)

        Case Else
            Payment(i) = Coupon * Face
        End Select

    Next i

    Market_Yield = Application.WorksheetFunction.IRR(Payment(), 0.1)

End Function

最佳答案

我对您的代码进行了一些更改,现在似乎可以使用?

Function Market_Yield(Clean_Price As Variant, Number_of_Payments As Integer, Coupon As Variant, Face As Variant, AccIn As Variant) As Variant
    Dim Payment() As Variant
    ReDim Payment(0 To Number_of_Payments) As Variant
    Dim i As Integer
    For i = 0 To Number_of_Payments
        Select Case i
            Case 0
            Payment(i) = -Clean_Price

            Case Number_of_Payments - 1
            Payment(i) = (AccIn / Coupon) + (Coupon * Face)

            Case Number_of_Payments
            Payment(i) = ((Coupon * Face) - (AccIn)) + (((Coupon * Face) - (AccIn)) / Coupon)

            Case Else
            Payment(i) = Coupon * Face
        End Select
    Next i
    Market_Yield = Application.WorksheetFunction.IRR(Payment(), 0.1)
End Function

好的,为什么这行得通而您的宏不起作用?
  • 您已声明 Payment()作为一个数组,但 Excel 不喜欢动态数组,它需要有一个上限。所以我在 ReDim 中添加了一行代码数组到必要的范围;
  • 你从未声明i ,您刚刚开始循环使用它。在大多数语言中,这很好,因为您会执行类似 for (int i = 0; i < Number_of_Payments; i++) 的操作。其中声明是循环的一部分。但是 Excel VBA 不是这样的,所以你必须显式添加 Dim i As Integer ;
  • 您的 Case语句不正确,因为您使用的是 Is声明,这不是它们在 VBA 中的工作方式。因为你使用 Case i在顶部你只需要Case和一个值或关键字Else在语句的其余部分,例如Case 1表示“i = 1 的情况”。

  • 我想这就是它?

    关于vba - 将预定义的 excel 函数应用于 VBA for 循环数组以创建新函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51890842/

    相关文章:

    vba - IF 范围未返回所需的值

    vba - 使用 VBA (Excel) 规范化数据的快速方法

    vba - 为什么 Application.Clean() 会删除可打印字符?

    excel - 列出 >3 个输入的所有可能的百分比分割

    c++ - 在C++中定义一个 'for'循环宏

    java网格/板for循环: what row is empty and nearest?

    python - 在 Python 中重试 for 循环

    excel - OptionButton 索引问题

    excel - 如何对不包含特定值的单元格求和

    excel - 使用 excel-VBA 操作 Ms Paint