【问题标题】:How to use IF statement inside a built in function如何在内置函数中使用 IF 语句
【发布时间】:2021-01-13 21:43:19
【问题描述】:

我正在尝试创建一个 VBA 内置函数,如果根据要求,可以完成一种计算。这是我试图做的,但它不起作用。有谁有这种功能的例子吗?

Public Function FRPV(ratey As Double, ratet0 As Double, maturity As Date, asof As Date, amount As Double, testif As Double)

If testif = 123 Then
    FRPV = ((1 + (ratey / 100) * (maturity - asof) / 360) * amount) / (1 + (ratet0 / 100) * (maturity - asof) / 360)
    
Else
    FRNPV = (((1 + ratey / 200) ^ ((maturity - asof) / 180)) * amount) / (1 + (ratet0 / 100) * (maturity - asof) / 360)
    
End If

End Function

【问题讨论】:

  • “FRNPV”。始终使用 Option Explicit。
  • 将 UDF(用户定义函数)称为“内置函数”是令人困惑的。除非您为 Microsoft 的 Excel 团队工作,否则您可能无法编写任何内置函数。另外,我支持始终使用Option Explicit 的建议。通过在 VBA 编辑器选项中启用“始终要求变量声明”一劳永逸地做这件事并不是一个坏主意。

标签: excel vba function if-statement


【解决方案1】:

错误是您的返回变量是“FRPV”,并且在“Else”块中您设置了不同的值 FRNPV。

并声明返回类型。然后该函数的用户将了解它可能返回的内容。

除此之外,将函数中的 testif 参数声明为 Long,或者如果您只有一个是/否选项,则可能是一个布尔值。或者可能是一个整数(因为您可能正在查看息票支付的频率,1 = 年度,2 = 半年度,4 = 每季度等)。

用整数测试双精度(有很多小数位)的值可能会遇到很多问题。

Public Function FRPV(ratey As Double, ratet0 As Double, maturity As Date, asof As 
        Date, amount As Double, freq As Integer, simple as Boolean) as Double

    If simple Then
        FRPV = ((1 + (ratey / 100) * (maturity - asof) / 360) * amount) / (1 + (ratet0 
               / 100) * (maturity - asof) / 360)
    Else 'Compound
        FRPV = (((1 + ratey / (freq *100)) ^ (freq * (maturity - asof) / 360)) * amount) / (1 + 
              (ratet0 / 100) * (maturity - asof) / 360) 
    End If

End Function

【讨论】:

  • 当您在 VB-Editor -> Tools -> Options 中设置“Require Variable Declaration”复选框时,它会自动将“Option Explicit”添加到所有新模块。它会避免犯这样的错误。
猜你喜欢
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多