我想制作一个UDF来计算给定范围的CAGR。
给予该功能的数据通常是月度返回数据,因此我需要:
如果我手动操作,我会输入公式 = product(rng + 1)^(1 /(Count(rng)/ 12)) - 1并且数组输入CTRL + Shift + Enter
我尝试了两种不同的方法来完成这项工作。第一个是基本上在vba中做前面提到的公式。
Option Explicit
Function CAGR(rng As Range) As Double
Dim total As Double
Dim n As Integer
Dim pwr As Double
Total = Application.FormulaArray="=Product(rng+1)"
n = Application.WorksheetFunction.Count(rng)
pwr = (1 / (n / 12))
CAGR = Application.WorksheetFunction.Power(total, pwr) - 1
End Function
但行
Total=Application.formulaArray="=Product(rng+1)"
因为我使用了formulaArray函数错误,所以不会工作......
我尝试的另一种方法是使用循环来创建函数,其中我想为范围中的每个单元格值添加1并将它们相乘。 (不是整个功能)。
Option Explicit
Function CAGR2(rng As Range) As Double
Dim cell As Variant
Dim k As Double
Dim n As Integer
For Each cell In rng
cell.Value = cell.Value + 1
Next cell
k = Application.WorksheetFunction.Product(rng)
CAGR2 = k
End Function
我在互联网上找到的所有CAGR功能似乎都在价格数据上,所以我想强调一下这个函数应该计算返回数据(1%, - 2%,3%等)。 / p>
我已经将这个问题困扰了好几个小时,所以任何帮助都会受到极大的关注!
非常感谢
答案 0 :(得分:2)
使用evaluate函数:
CAGR = ActiveSheet.Evaluate("Product(" & rng.address(1,1,xlA1,True) & "+ 1)^(1/(Count(" & rng.address(1,1,xlA1,True) & ")/12))-1")
答案 1 :(得分:0)
我喜欢你的循环理念,并认为你走在正确的轨道上。建立你的第二段代码
CAGR2
请注意,我会跟踪{{1}}范围内的单元格数量,我们只是使用{{1}}累积了每个单元格的乘积。一旦产品完全积累,我们就把它带到正确的指数。我不确定,但你可能需要在完成所有这些之后减去一个。