2016-08-22 57 views
1

我想製作一個UDF來計算給定範圍的CAGR。UDF根據回報數據計算CAGR

賦予功能的數據將典型地每月返回數據,所以我需要:

  • 添加1至每個小區在範圍
  • 乘法所有細胞一起
  • 採取的功率( )

如果我做手工我想鍵入式 =產物(RNG + 1)^(1 /(計數器(RNG)/ 12))1 /(在範圍/ 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功能失常

無法工作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%等上)。

我一直在爲這個問題苦苦掙扎幾個小時,所以任何幫助將大大appriciated!

非常感謝

+0

'「=產品(rng + 1)」'這不會給你你的期望。如果你想使用一個像這樣的變量中間字符串,就必須像「」= Product(「&rng&」+1)「一樣分解它」'更不用說'FormulaArray'是範圍object,not Application ... – Mikegrann

+0

我認爲這是因爲'total'是一個'double',但是你寫它的方式,它是一個字符串。你甚至可以在VB中執行'X = Y = Z'嗎?您可能需要將其分成兩行。但是,爲什麼你使用公式數組來代替'Total *'而不是僅僅使用'product *(rng + 1)'?你需要「評估」。編輯:哦,我明白你在想什麼,'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

我很喜歡你的循環的想法,並認爲你是在正確的軌道上。建立了你的第二一段代碼

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。一旦產品完全積累起來,我們就會把它帶到正確的指數。我不確定,但在完成所有的說明和完成後,您可能需要減去一個。

+0

'rngCount'沒有聲明(或使用)。指數應該可能進入循環內部 - 在所有單元值相乘之後,大數組會失去精度。 – Comintern

+0

對不起。我的意思是'n'。我編輯過。 –

+0

這工作完美,併爲我節省了很多時間!非常感謝您花時間幫助我。 –