Why does a specific arrayformula not work in googl

2019-08-02 00:14发布

This is in continuation to how to calculate XIRR dynamically in excel and in google sheets

The proposed array formula** solution (mentioned below) works perfectly fine in excel

=XIRR(INDEX(F:G,N(IF(1,SMALL(IF(B$2:B$8=J2,ROW(B$2:B$8)),ROW(INDEX(A:A,1):INDEX(A:A,COUNTIF(B$2:B$8,J2)))))),N(IF(1,{1,2}))),CHOOSE({1,2},INDEX(A:A,N(IF(1,SMALL(IF(B$2:B$8=J2,ROW(B$2:B$8)),ROW(INDEX(A:A,1):INDEX(A:A,COUNTIF(B$2:B$8,J2))))))),TODAY()))

but the same solution refuses to work in google sheets with the error

In XIRR evaluation, the value array must include positive and negative numbers.

Any idea why this is not working in google sheets and how to make it work?

Source data

    PurchaseDate    Script  No.ofunits  PurchNAVrate    NetAmount            ForXIRR    TotalReturn
    17/11/2014          A   2241            33              75000           -75000          96000
    8/1/2015            B   53              649             35000           -35000          43000
    14/1/2015           B   75              658             50000           -50000          61500
    14/10/2014          C   2319            32              75000           -75000          108000
    8/1/2015            D   318             109             35000           -35000          40000
    14/1/2015           D   450             110             50000           -50000          57000
    8/6/2015            D   175             114             20000           -20000          22000



Values for Fund A should be around 14%  
Values for Fund B should be around 13%
Values for Fund C should be around 21%
Values for Fund D should be around 8%

1条回答
兄弟一词,经得起流年.
2楼-- · 2019-08-02 00:49

It appears that the the constructions which allow us to generate an array of returns from INDEX, i.e.:

N(IF(1,,,

or

N(INDEX(,,,

are valid in Excel but not in Google Sheets, in the latter both resolving to just a single (i.e. the first) element in the array passed.

For example, in Excel, the following:

=SUM(INDEX(A1:A10,N(IF(1,{1,2,7}))))

or:

=SUM(INDEX(A1:A10,N(INDEX({1,2,7},))))

will sum the values in A1, A2 and A7, though in Google Sheets both will sum only the value in A1.

I do not know enough about Google Sheets to know why this is the case. It may be possible to reconstruct my formula using the volatile OFFSET. I will have a look and get back to you.

Update: It appears that even an OFFSET-based solution, i.e.:

=XIRR(N(OFFSET(F2,SMALL(IF(B$2:B$8=J2,ROW(B$2:B$8)-MIN(ROW(B$2:B$8))),ROW(INDIRECT("1:"&COUNTIF(B$2:B$8,J2)))),{0,1})),CHOOSE({1,2},N(OFFSET(A2,SMALL(IF(B$2:B$8=J2,ROW(B$2:B$8)-MIN(ROW(B$2:B$8))),ROW(INDIRECT("1:"&COUNTIF(B$2:B$8,J2)))),{0,1})),TODAY()))

is not possible. Again, it works fine in Excel but not in Google Sheets, for reasons similar to those given above (the arrays passed to OFFSET do not resolve as required).

I think this requires an explanation by someone well-versed in Google Sheets.

References:

https://excelxor.com/2014/09/05/index-returning-an-array-of-values/

Regards

查看更多
登录 后发表回答