Excel VBA或公式:多帐户多年的XIRR

时间:2017-09-07 14:38:42

标签: excel-vba vba excel

我的数据表是:

我的输入是左表,包含多年的多个帐户的投资数据。我想为每个帐户计算每年的XIRR。

权限表是我想要的典型输出。但是,我无法弄清楚如何在Excel Formula的帮助下完成此操作。或者通过VBA。有人可以帮忙吗?

示例:

Example Stackoverflow不允许上传图片,因为没有像10或其他的声誉。

1 个答案:

答案 0 :(得分:1)

这是一种方法。这种方法要求数据按帐户和按年排序。策略是(1)为Acc#+ YEAR的每个组合找到正确的第一行数据; (2)从该行提取数据到表的末尾; (3)过滤掉与该Acc#+ YEAR无关的数据; (4)计算XIRR。

要确定每个帐户/年份组合的第一行数据,您可以通过将两者连接在一起来创建唯一标记。我创建了一个包含第一行的帮助表:

enter image description here

使用此公式(CTRL-SHIFT-ENTER):

=MATCH($F5&"_"&G$4,Account&"_"&Year,0)

其中$ F5是具有Acc#的单元格,G $ 4是具有年份##的单元格,Account是帐户名称列,而Year是年份列。我使用下划线来划分帐户名称和年份;如果您的帐户名称和年份不相互冲突,您可以跳过此步骤。

现在可以计算XIRR。结果如下:

enter image description here

这是公式(再次按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))

希望有所帮助。