![](/img/trans.png)
[英]UDF (user-defined function) to identify the format pattern for an Excel cell
[英]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.