Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba UDF根据返回数据计算复合年增长率_Vba_Excel - Fatal编程技术网

Vba UDF根据返回数据计算复合年增长率

Vba UDF根据返回数据计算复合年增长率,vba,excel,Vba,Excel,我想做一个UDF,它将计算给定范围的复合年增长率 提供给函数的数据通常是月度返回数据,因此我需要: 向范围中的每个单元格添加1 将所有细胞相乘 取(1/(范围内的数字/12))的幂 如果我手动操作,我会输入公式 =产品(rng+1)^(1/(计数(rng)/12))-1并按CTRL+Shift+enter组合键 我尝试了两种不同的方法来完成这项工作。第一个是在vba中基本上完成前面提到的公式 Option Explicit Function CAGR(rng As Range) As Do

我想做一个UDF,它将计算给定范围的复合年增长率

提供给函数的数据通常是月度返回数据,因此我需要:

  • 向范围中的每个单元格添加1
  • 将所有细胞相乘
  • 取(1/(范围内的数字/12))的幂
如果我手动操作,我会输入公式 =产品(rng+1)^(1/(计数(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,然后将它们相乘。(不是整个函数)

我在互联网上找到的所有CAGR函数似乎都是基于价格数据的,因此我想强调的是,该函数应该根据回报数据(1%、-2%、3%等等)进行计算

我已经为这个问题绞尽脑汁好几个小时了,所以任何帮助都会非常感激


非常感谢使用评估功能:

CAGR = ActiveSheet.Evaluate("Product(" & rng.address(1,1,xlA1,True) & "+ 1)^(1/(Count(" & rng.address(1,1,xlA1,True) & ")/12))-1")

我喜欢你的循环想法,认为你走对了。构建第二段代码

Option Explicit

Function CAGR2(rng As Range) As Double

Dim cell As Variant
Dim n As Integer

CAGR2 = 1
n = 0
For Each cell In rng
    CAGR2 = CAGR2 * (cell.Value + 1)
    n = n + 1
Next cell

CAGR2 = CAGR2 ^ (1 / (n / 12))

End Function

请注意,我用
n
跟踪范围内的单元格数量,我们只是用
CAGR2
累积每个单元格的乘积。一旦产品完全累积,我们就将其取到正确的指数。我不确定,但你可能需要在说了这么多之后减去一。

“=Product(rng+1)”
这并不能满足你的期望。如果您想使用这样的变量中间字符串,您必须将其分解为
“=Product(&rng&“+1)”
更不用说
FormulaArray
是Range对象上的一种方法,而不是应用程序……我想这是因为
total
双精度的字符串,但按照您编写它的方式,它是一个字符串。你甚至能在VB中做'X=Y=Z'吗?您可能需要将其分为两行。但是为什么要使用公式数组来表示
Total
,而不只是执行
product*(rng+1)
?您需要
评估
。编辑:哦,我明白你的意思了,
rng
是你公式中的一个变量。。。。其他人明白了。@BruceWayne你是对的,你不能那样分配。其计算结果为“将X设置为布尔值(Y等于Z)”。一旦我最终着手完成我正在处理的VBA文档,我们将有一个地方可以链接此类问题。
rngCount
未声明(或使用)。求幂运算可能会进入循环内部-在将所有单元格值相乘后进行求幂运算会在大型数组中丢失精度。这非常有效,并为我节省了大量时间!非常感谢你花时间来帮助我。我很高兴。我在这个网站上也得到了很多帮助。当我能回馈社区的时候,我很高兴。非常感谢你的帮助!我在产品功能的末尾添加了+1,它工作得非常好!非常感谢。@T.Jensen抱歉错过了。请通过单击复选标记来正确地标记标记。只有提出问题的人才能做到这一点。
Option Explicit

Function CAGR2(rng As Range) As Double

Dim cell As Variant
Dim n As Integer

CAGR2 = 1
n = 0
For Each cell In rng
    CAGR2 = CAGR2 * (cell.Value + 1)
    n = n + 1
Next cell

CAGR2 = CAGR2 ^ (1 / (n / 12))

End Function