2016-08-22 4 views
1

与えられた範囲のCAGRを計算するUDFを作成したいと思います。戻り値からCAGRを計算するUDF

関数に与えられたデータは、通常、月次リターンデータとなりますので、私がする必要がある:

  • は一緒にすべてのセル
  • は(の電源を取る乗算
  • 範囲内の各セルに1を追加します。 )

私はそれを手動で行う場合、私は式 =製品に入力し(RNG + 1)^(1 /(COUNT(RNG)/ 12))1 /(範囲/ 12で数) - 1配列にはCTRL + Shift + Enterを入力してください

私はこれを行うには2つの異なる方法を試しました。最初は基本的に前述の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 

私はformulaArray機能が間違って使用していますので、ライン

Total=Application.formulaArray="=Product(rng+1)" 

がpresumebly動作しません...しかし

私が試した他のアプローチが持つ関数を作ることです私は範囲内の各セルの値に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%を計算し、そうすべきであることを強調したいと思いますに)。

私は何時間もこの問題に苦しんでいますので、どんな助けでも大いに助かりました!

感謝

+0

'" = Product(rng + 1) "'これはあなたが期待しているものを与えません。 '' = Product( "&rng&" +1) "'のように分割しなければならないでしょう。 'FormulaArray'はRangeのメソッドですオブジェクトではなく、アプリケーションです... – Mikegrann

+0

'total'は' double'だからだと思いますが、あなたが書いたやり方は文字列です。あなたはVBで 'X = Y = Z'をすることもできますか?それを2行に分散する必要があるかもしれません。しかしなぜ 'product *(rng + 1)'の代わりに 'Total'の式配列を使っていますか? 'evaluate'が必要です。編集:ああ、私はあなたが何をしようとしていた参照してください、 'rng'はあなたの数式の変数です....他の人はそれを持っています。 – BruceWayne

+1

@BruceWayneあなたはそうです、あなたはそのように割り当てることはできません。 「Xを(YはZと等しい)ブール値に設定する」と評価されます。いったん私は最終的にVBAのドキュメントを完成させるために取り組んでいます。私たちはこの種の問題にリンクする場所を用意しています。 – Mikegrann

答えて

2

は、評価関数を使用する:

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

ありがとうございました!私は製品機能の終わりに+1を加えて、それは完全に動作しています!多くのappriciated。 –

+0

@ T.Jensenごめんなさい。答えのチェックマークをクリックして正しいと印を付けることを検討してください。それは疑問を提起するものだけです。 –

0

私はあなたのループのアイデアが好きで、あなたは正しい軌道に乗っていると思います。私はnで範囲内のセルの数を追跡し、私達はちょうどCAGR2と、各セルの製品を蓄積

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 

通知は、コードの2番目の部分のオフ構築します。製品が完全に蓄積されたら、正しい指数にします。私は確信していませんが、すべてのことが終わってから1を引く必要があるかもしれません。

+0

'rngCount'は宣言されていない(または使用されていません)。べき乗はおそらくループの中に入るべきです - すべてのセルの値を乗算した後に行うと、大規模な配列の精度が失われます。 – Comintern

+0

申し訳ありません。私は 'n'を意味しました。私は編集しました。 –

+0

これは完全に機能し、私に多くの時間を節約しました!私を助けるために時間をとってくれてありがとう。 –