Excel VBA例程到UDF

我正在为我的财务课做练习,我在Excel VBA中编写了一个例程,可以在不使用MMULT或TRANSPOSE的情况下按预期工作。 我想通过调整例程作为UDF在Excel工作表中实现结果,但不知何故,我只是得到一个值的错误。

我有点想念什么…任何提示?

这里的例程:

Option Explicit Public Sub CalcVola2() Dim WeightedVola As Variant, Weights As Variant, Volatilities As Variant, Correlations As Variant Dim i As Double, j As Double, CorrSum As Double, VarSum As Double Dim CalcVola2 As Double '=================================================================================================== ' Load data '=================================================================================================== Weights = ThisWorkbook.Worksheets("Stetig").Range("FR4:FR43") Volatilities = ThisWorkbook.Worksheets("Stetig").Range("FS4:FS43") Correlations = ThisWorkbook.Worksheets("Covar-Correl").Range("C13:AP52") '=================================================================================================== ' Resize weighted volatility array to fit the inputs and clean the data '=================================================================================================== ReDim WeightedVola(1 To UBound(Weights, 1), 1 To 1) For i = 1 To UBound(Weights, 1) If Weights(i, 1) = "" Then Weights(i, 1) = 0 End If Next i For i = 1 To UBound(Volatilities, 1) If Volatilities(i, 1) = "" Then Volatilities(i, 1) = 0 End If Next i '=================================================================================================== ' Perform weighted vola calculations '=================================================================================================== For i = 1 To UBound(Weights, 1) WeightedVola(i, 1) = Weights(i, 1) * Volatilities(i, 1) Next i '=================================================================================================== ' Calculate the first sum of the portfolio volatility function by adding the squared weighted volas '=================================================================================================== For i = 1 To UBound(Weights, 1) CorrSum = CorrSum + WeightedVola(i, 1) ^ 2 Next i '=================================================================================================== ' Calculate the second sum of the portfolio volatility function by the product of the weighted vola ' and the correlation '=================================================================================================== For i = 1 To UBound(Weights, 1) For j = i + 1 To UBound(Weights, 1) CorrSum = CorrSum + WeightedVola(i, 1) * 2 * WeightedVola(j, 1) * Correlations(i, j) Next j Next i CalcVola2 = Sqr(CorrSum) ThisWorkbook.Worksheets("Stetig").Range("FS46").Value = CorrSum ThisWorkbook.Worksheets("Stetig").Range("FS47").Value = CalcVola2 End Sub 

在这里UDF:

 Option Explicit Public Function CalcVola(Weights As Variant, Volatilities As Variant, Correlations As Variant) As Double Dim WeightedVola As Variant Dim i As Double, j As Double, CorrSum As Double, VarSum As Double '=================================================================================================== ' Resize weighted volatility array to fit the inputs and clean the data '=================================================================================================== ReDim WeightedVola(1 To UBound(Weights, 1), 1 To 1) For i = 1 To UBound(Weights, 1) If Weights(i, 1) = "" Then Weights(i, 1) = 0 End If Next i For i = 1 To UBound(Volatilities, 1) If Volatilities(i, 1) = "" Then Volatilities(i, 1) = 0 End If Next i '=================================================================================================== ' Perform weighted vola calculations '=================================================================================================== For i = 1 To UBound(Weights, 1) WeightedVola(i, 1) = Weights(i, 1) * Volatilities(i, 1) Next i '=================================================================================================== ' Calculate the first sum of the portfolio volatility function by adding the squared weighted volas '=================================================================================================== For i = 1 To UBound(Weights, 1) CorrSum = CorrSum + WeightedVola(i, 1) ^ 2 Next i '=================================================================================================== ' Calculate the second sum of the portfolio volatility function by the product of the weighted vola ' and the correlation '=================================================================================================== For i = 1 To UBound(Weights, 1) For j = i + 1 To UBound(Weights, 1) CorrSum = CorrSum + WeightedVola(i, 1) * 2 * WeightedVola(j, 1) * Correlations(i, j) Next j Next i CalcVola = Sqr(CorrSum) End Function 

您需要设置断点并查看#VALUE! 错误被返回。 经常这是因为一个variables没有正确的types,或者一个VBA函数得到不正确的参数。 例如,如果将Weights参数作为一维数组传递给函数,则例程将崩溃并返回#VALUE! 因为它正在寻找一个二维数组,所以在第一条Redim线上出错。

如果你的参数被作为范围传递,会出现类似的问题。

如果情况总是如此,请将参数作为范围传递,然后在代码中使用如下forms:

 Public Function CalcVola(rWeights As Range, rVolatilities As Range, rCorrelations As Range) As Double Dim Weights, Volatilities, Correlations Weights = rWeights Volatilities = rVolatilities Correlations = rCorrelations ... End Function 

如果参数可以作为范围或数组传递,那么在执行UDF的其余部分之前,需要将函数参数作为Varianttypes进行testing,然后testing以确定它们是什么,并进行相应的转换。