VBA:计算错误#VALUE

时间:2018-07-23 15:23:31

标签: excel vba excel-vba excel-formula

我的任务是创建一个“风险价值”功能,该功能可以引用一个范围和几个单元格中的数据。代码是:

Option Explicit
Function VaR(returns As Range, days, confidenceinterval, portfoliovalue)

VaR = (Application.WorksheetFunction.Average(returns) * Application.WorksheetFunction.SQRT(days)) - (Application.WorksheetFunction.NormSDist(confidenceinterval) * (Application.WorksheetFunction.StDev_S(returns) * Application.WorksheetFunction.SQRT(days))) * portfoliovalue

End Function

Returns是一系列回报,而其他仅仅是单元格中的值。

您可以推断,我只是复制了我的excel测试公式,在每个参数之前添加了application.worksheet。但是,尽管我的测试公式有效,但以VBA应该识别的格式转换的相同代码却没有。

原始公式是

 =(AVERAGE(returns)*SQRT(days))-(NORMSDIST(confidenceinterval)*(STDEV.S(returns)*SQRT(days)))*portfoliovalue 

任何帮助都是非常棒的!

提前谢谢!

2 个答案:

答案 0 :(得分:2)

如果您希望VBA函数返回值,则格式为

'Function functionName(parameters As parameterType) As returnType

因此,您的(假设我选择的类型是正确的)应该解析为:

Function VaR(returns As Range, days As Integer, confidenceinterval as Double, portfoliovalue As Double) As Double

根据Scott的建议,您可以选择一种分解并“逐步完成”正在研究的公式的方法。如果在代码窗口中显示View > Locals Window,可以使用 F8 逐行浏览代码,则可以看到part1part2的值,因为它们每次操作更新。

Option Explicit

Function VaR(returns As Range, days As Integer, confidenceinterval As Double, portfoliovalue As Double) As Double

    Dim part1 As Double
    Dim part2 As Double

    With Application.WorksheetFunction
        part1 = .Average(returns) * .SQRT(days)
        part2 = .NormSDist(confidenceinterval) * (.StDev_S(returns) * .SQRT(days))

        VaR = part1 - part2 * portfoliovalue
    End With

End Function

因为您必须使用的测试公式是

 =(AVERAGE(returns)*SQRT(days))-(NORMSDIST(confidenceinterval)*(STDEV.S(returns)*SQRT(days)))*portfoliovalue 

我建议将每个部分分开,以便您可以比较例如我的part1=(AVERAGE(returns)*SQRT(days))

答案 1 :(得分:2)

您有两个问题。首先,您的函数名称VaR与Excel的内置VAR(方差)函数冲突。其次,没有Application.WorksheetFunction.SQRT函数;请改用VBA的Sqr。这应该起作用:

Function ValueAtRisk(returns As Range, days, confidenceinterval, portfoliovalue)
    With Application.WorksheetFunction
        ValueAtRisk = (.Average(returns) * Sqr(days)) - (.NormSDist(confidenceinterval) * (.StDev_S(returns) * Sqr(days))) * portfoliovalue
    End With
End Function

希望有帮助