簡體   English   中英

如何將值列表傳遞給 Excel 中的用戶定義函數 (UDF)

[英]How to pass list of values to user defined function (UDF) in Excel

---------------------------------------
A                   B       C   D
---------------------------------------
Timestamp           Stock   Qty Price
---------------------------------------
01 February 2011    ST1     100 10
02 March 2013       ST1     900 11
01 February 2011    ST2     200 121
04 May 2014         ST1     250 15
02 March 2016       ST2     150 130
04 May 2018         ST2     250 140
08 September 2016   ST1     300 19
01 February 2012    ST3     400 190
11 November 2017    ST1    -400 20

我希望在 excel 中創建一個名為 MyXIRR 的函數(日期為范圍,值為范圍,平衡為雙精度,BalanceAsOn 日期)

對於此函數,我需要將時間戳列中的數據作為日期、數量 X 價格作為每個股票的值傳遞。 Balance 和 BalanceAsOn 是我將分別確定的。

例如對於 ST1

日期將在下面

01 February 2011    
02 March 2013       
04 May 2014     
08 September 2016
11 November 2017

值將低於

100
900
250
300
-400

我面臨的問題是如何根據股票代碼過濾器傳遞值列表。

我不是 INDEX 或 MATCH 等方面的專家,但是當我嘗試類似

=MyXIRR(INDEX(A1:A9,MATCH("ST1",B1:B9,0)), INDEX(C1:C9*D1:D9,MATCH("ST1",B1:B9,0)), 100.00, TODAY())

或按 Ctrl + Shift + Enter 將其用作數組,即

{=MyXIRR(INDEX(A1:A9,MATCH("ST1",B1:B9,0)), INDEX(C1:C9*D1:D9,MATCH("ST1",B1:B9,0)), 100.00, TODAY())}

然后在調試 MyXIRR 時,我在 Dates 中只得到一個值,在 Values 中得到一個值,即 2011 年 2 月 1 日和 100。我希望 MyXIRR 獲取列表而不僅僅是第一個值。

懷疑我誤用了 INDEX 我嘗試了 IF 和 SUMPRODUCT 但我得到了 #VALUE! 以下兩種情況均出錯

=MyXIRR(IF(B1:B9="ST1",A1:A9,0), IF(B1:B9="ST1",C1:C9*D1:D9,0), 100.00, TODAY())

或者

= MyXIRR(SUMPRODUCT((B1:B9="ST1"),A1:A9), SUMPRODUCT((B1:B9="ST1"),C1:C9*D1:D9), 100.00, TODAY() )

有人可以建議我做錯了什么和/或建議前進的方向嗎?

我使用的是 Excel for Mac 版本 16.16.2

下面是我的函數的樣子

Public Function MyXIRR(Dates As Range, Trans As Range, Balance As Double,  BalanceAsOn As Date) As Double

Dim Cell As Range
 For Each Cell In Dates
    MsgBox Cell.Value
 Next Cell

MyXIRR = Dates.Count
End Function

當我為 ST1 調用它時,它只循環一次並顯示 01/02/2011

[請注意,以下解決方案尚未在 Mac 版本的 Excel 上進行測試。]

要僅傳遞對應於“ST1”的值,首先您需要將 Dates 和 Trans 聲明為 Variant,正如 Scott 已經提到的,然后相應地更改您的函數體...

Public Function MyXIRR(Dates As Variant, Trans As Variant, Balance As Double, BalanceAsOn As Date) As Double

     Dim currentDate As Variant

     For Each currentDate In Dates
         MsgBox currentDate
     Next currentDate

     MyXIRR = UBound(Dates)

End Function

然后就可以用下面的公式了,需要用CONTROL+SHIFT+ENTER來確認,不能只用ENTER...

=MyXIRR(INDEX(A2:A10,N(IF(1,SMALL(IF(B2:B10="ST1",ROW(B2:B10)-ROW(B2)+1),ROW(INDIRECT("1:"&COUNTIF(B2:B10,"ST1"))))))),INDEX(C2:C10*D2:D10,N(IF(1,SMALL(IF(B2:B10="ST1",ROW(B2:B10)-ROW(B2)+1),ROW(INDIRECT("1:"&COUNTIF(B2:B10,"ST1"))))))),100,TODAY())

如果操作正確,Excel 將自動在公式周圍放置花括號 {...}。

嘗試這個:

Public Function MyXIRR(Dates As Range, Trans As Range, Balance As Double, BalanceAsOn As Date) As Double

    Dim Area as Range    
    Dim Cell As Range

    For Each Area in Dates.Areas
        For Each Cell In Area
            MsgBox Cell.Value
        Next Cell
    Next Area

    MyXIRR = Dates.Count
End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM