2017-02-18 68 views
1

我需要一個更靈活的前端XIRR可以組合任意數量的現金流和日期範圍,所以我開始了與Excel VBA中的ParamArray不很像-A1:A10

Public Function vbIRR(ParamArray args())... 

和所有下面的作品就好了,這樣,當我打電話像

=vbIRR(A1:A10,B1:B10) 

我得到一個很好的答案。麻煩的是,我的A1:A10的佈局可能與執行有效的XIRR計算所需的符號相反。現在我可以調整我的VBA,當然,但我更普遍的應該可以簡單地寫

=vbIRR(-A1:A10,B1:B10) 

它不工作。調試VBA,我可以看到參數(0)是「錯誤2015」。 (我也注意到,標準的XIRR類似地出錯了。)

這很奇怪,因爲當我看着「fx」(單擊函數嚮導)驗證函數的輸入時,我無法區分one和另一個(超出期望的符號變化到第一範圍的值)。兩個調用都顯示一個範圍作爲第一個參數。

任何指針讚賞。謝謝閱讀。

編輯:這個問題似乎涉及到控制移輸入(CSE)。過去我多次注意到,「fx」似乎對CSE v E.更爲無動於衷。如果與CSE一起輸入,XIRR將返回結果。奇怪的是(和不快),args來類型名(0)在這個調用變爲(而不是「範圍」)「變體()」。所以我需要一個額外的案例。

+0

你指的陣列式蓋下,使用CSE告知Excel公式是被視爲一個arary,那麼這允許Excel以更改整個範圍 –

+0

我的符號,另外,具有myXIRR功能,允許非連續範圍。該參數是類型爲變的,我包括檢查'TypeOf運算X是Range'做是爲了二維數組穿過'XIRR'轉換成一維數組processingit之前。而且,通過CSE,它可以像工作表函數一樣處理取反範圍。 –

+0

有趣的是,羅恩,我們都覺得有必要做同樣的事情。 XIRR功能有一些根本性的缺陷。我剛剛發佈了我的MMULT解決方案來回答Leviathan。但是,我注意到一些古怪的東西:我的最終答案來自簡單的vbIRR = WorksheetFunction.XIRR(現金流,日期)。這在我開發的測試表中無條件地工作。在製作表中,它拒絕工作。最後,我設法通過將Cashflows()和Dates()定義爲「Double」來實現它。任何想法可能是關於什麼? – Ollie2893

回答

1

你總是可以其他參數(使用ParamArray之前)添加到指示是否值應該被否定的功能。在VBA功能中,您可以完全控制數據,並可以根據該參數進行更改。

參數可能是一個指示Boolean如果值應該被否定,或者它可能是一個LongDouble代表乘數(這將是你的情況-1)。

+1

請注意,在ParamArray之前的所有參數都是必需的。所以你不得不爲這個函數的每一個調用輸入這個參數,而不僅僅是那個負面的調用。 –

+1

是的,我認爲這個解決方案並且憎恨Ron給出的含義。但是,我發現了一個更簡單的解決方案:如果不是-A1:A10,我寫MMULT(A1:A10,-1),我發現它全部解決。 – Ollie2893

1

當您傳遞-A1:A10作爲參數時,您要求Excel將範圍乘以-1,並返回一個數組作爲參數而不是範圍。

所以您請求數組運算,因此需要CSE條目。

結果是一個數組,因此它的一個變種,而不是一個範圍:您的VBA需要處理這兩種情況下:我通常會做一個If TypeOF arg is Range then arg=arg.value2的範圍轉換成一個變種。

函數嚮導使用評估的參數,以便它處理這兩種情況下透明地

+0

arg = arg.value2是一個很棒的詭計,查爾斯!謝謝。 – Ollie2893

相關問題