UDF从返回数据计算CAGR

时间:2016-08-22 13:58:02

标签: excel vba excel-vba

我想制作一个UDF来计算给定范围的CAGR。

给予该功能的数据通常是月度返回数据,因此我需要:

  • 为范围
  • 中的每个单元格添加1
  • 将所有细胞相乘
  • 取(1 /(范围内的数字/ 12))
  • 的力量

如果我手动操作,我会输入公式 = 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>

我已经将这个问题困扰了好几个小时,所以任何帮助都会受到极大的关注!

非常感谢

2 个答案:

答案 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}}累积了每个单元格的乘积。一旦产品完全积累,我们就把它带到正确的指数。我不确定,但你可能需要在完成所有这些之后减去一个。