我的数据表是:
我的输入是左表,包含多年的多个帐户的投资数据。我想为每个帐户计算每年的XIRR。
权限表是我想要的典型输出。但是,我无法弄清楚如何在Excel Formula的帮助下完成此操作。或者通过VBA。有人可以帮忙吗?
示例:
Stackoverflow不允许上传图片,因为没有像10或其他的声誉。
答案 0 :(得分:1)
这是一种方法。这种方法要求数据按帐户和按年排序。策略是(1)为Acc#+ YEAR的每个组合找到正确的第一行数据; (2)从该行提取数据到表的末尾; (3)过滤掉与该Acc#+ YEAR无关的数据; (4)计算XIRR。
要确定每个帐户/年份组合的第一行数据,您可以通过将两者连接在一起来创建唯一标记。我创建了一个包含第一行的帮助表:
使用此公式(CTRL-SHIFT-ENTER):
=MATCH($F5&"_"&G$4,Account&"_"&Year,0)
其中$ F5是具有Acc#的单元格,G $ 4是具有年份##的单元格,Account是帐户名称列,而Year是年份列。我使用下划线来划分帐户名称和年份;如果您的帐户名称和年份不相互冲突,您可以跳过此步骤。
现在可以计算XIRR。结果如下:
这是公式(再次按CTRL-SHIFT-ENTER):
=XIRR(IF(OFFSET($A$2,G5,0,23-G5+1,1)=$K5,IF(OFFSET($B$2,G5,0,23-G5+1,1)=L$4,OFFSET($D$2,G5,0,23-G5+1,1),0),0),OFFSET($C$2,G5,0,23-G5+1,1))
我使用OFFSET
提取从“第一行”开始(上面计算)并在数据表底部结束的子数组。 (请注意,这些子数组仍包含多个帐户/年的数据,因此我们将在稍后的步骤中进行过滤。)在OFFSET($A$2,G5,0,23-G5+1,1)
$A$2
是帐户名称上方的单元格; G5
行(G5
是帮助程序表中的第一行之一); 0
列; 23-G5+1
行(23应该被您拥有的总行替换);和1
列数据。除了列B(年份),C(日期)和D(金额)之外,其他OFFSET
的工作方式相同。
下一步是从错误的Acc#或YEAR过滤掉不需要的数据。这是使用两个嵌套的IF
语句完成的。基本逻辑是,只要我们有错误的Acc#或YEAR,就用Amount
替换0
:
=XIRR(IF(Account=TheAcct,IF(YEAR=TheYear,Amount,0),0),Date)
这是有效的,因为零现金流量不会影响XIRR计算。
您还可以计算每个Acc + YEAR的最后一行,而不是过滤步骤。然后你会得到一个像下面这样的公式:
=XIRR(OFFSET(Amount,FirstRow,0,LastRow-FirstRow+1,0),OFFSET(Date,FirstRow,0,LastRow-FirstRow+1,0))
希望有所帮助。