У меня есть следующие три таблицы (заголовок таблицы в строке 01):
Таблица1: Подписки на основе дат
| A | B | C | D |
---|-----------|--------------|------------|---------------------|
01 | ID | Type | Start Date | End Date |
02 | ID1 | T1 | 17.4.1 | |
03 | ID2 | T2 | 17.9.1 | 18.5.15 |
04 | ID3 | T1 | 20.6.1 | |
...
Таблица2: Ежемесячная стоимость на тип подписки
| A | B
---|-------------|---------------
01 | Type | Yearly Cost
02 | T1 | 120
03 | T2 | 144
...
Таблица 3: Прогнозы расходов
| A | B
---|-----------|------------
01 | Year | Expense s
02 | 2017 | 138 (T1 9 months: 90 + T2 4 months: 48)
03 | 2018 | 180 (T1 12 months: 120 + T2 5 months 60)
04 | 2019 | 120 (T1 12 months)
05 | 2020 | 190 (T1 12 months + 7 months)
06 | 2021 | 1240 (T1 24 months)
...
Я хотел бы автоматически вычислить столбец B третьей таблицы (без использования вспомогательных столбцов, в настоящее время это делается с использованием вспомогательной таблицы ...)
Я знаю, что это невозможно сделать с помощью sumif (), но возможно ли этого добиться с помощью формулы массива?
У меня есть следующий псевдокод формулы для помещения в таблицу 3:
for each line of table 2
'
'
' case 1: start date in year, end date not in year
'
if and(table3[year]=year(table1[startdate]), or(isblank(year(table1[enddate]),table3[year] < year(table1[enddate]))) then
'
' count months from startdate to end of year then multiply with monthlyrate
'
addtosum (12-month(table1[startdate]))*index(Table2,match(Table1[@[Type]],Table2[Type],0),2)
'
'
' case 2: startdate in year, enddate in year
'
elseif and(table3[year]=year(table1[startdate]),table3[year] = year(table1[enddate])) then
'
' count months between startdate and enddate then multiply with monthlyrate
'
addtosum (month(table1[enddate])-month(table1[startdate]))*index(Table2,match(Table1[@[Type]],Table2[Type],0),2)
'
'
' case 3: year larger than startdate, enddate is not reached
'
elseif and(table3[year]>year(table1[startdate]), or(isblank(year(table1[enddate]),table3[year]<year(table1[enddate]))) then
'
' multiply 12 months with monthlyrate
'
addtosum 12*index(Table2,match(Table1[@[Type]],Table2[Type],0),2)
'
'
' case 4: year larger than startdate, enddate is reached
'
elseif and(table3[year]>year(table1[startdate]),table3[year]=year(table1[enddate])) then
'
' count months from begining of year to enddate then multiply with monthlyrate
'
addtosum (month(table1[enddate])) * index(Table2,match(Table1[@[Type]],Table2[Type],0),2)
end if
end for each
Вот вспомогательная таблица, которую я создал:
Таблица 3: Прогнозы расходов
| J | K | L | M | N ...
---|-------|----|------|-----| ----- ...
01 | Year | | ID1 | ID2 | ID3
02 | 2017 | | 90 | 48 |
03 | 2018 | | 120 | 60 |
04 | 2019 | | 120 | 0 |
05 | 2020 | | 190 | |
...
И эта формула у меня есть в ячейке L2 (этоскопировано в L2: U5):
' Note: when calling index, column 4 is the Type, 5 is startdate, 6 is enddate)
=IF(NOT(ISBLANK(INDEX(Table1,MATCH(L$1,Table1[ID],0),5))),
IF(AND($J2 = YEAR(INDEX(Table1,MATCH(L$1,Table1[ID],0),5)), OR(ISBLANK(INDEX(Table1,MATCH(L$1,Table1[ID],0),6)),$J2 < YEAR(INDEX(Table1,MATCH(L$1,Table1[ID],0),6)))),
(12+1-MONTH(INDEX(Table1,MATCH(L$1,Table1[ID],0),5))),
IF(AND($J2 = YEAR(INDEX(Table1,MATCH(L$1,Table1[ID],0),5)), $J2 = YEAR(INDEX(Table1,MATCH(L$1,Table1[ID],0),6))),
(MONTH(INDEX(Table1,MATCH(L$1,Table1[ID],0),6))-MONTH(INDEX(Table1,MATCH(L$1,Table1[ID],0),5))),
IF(AND($J2 > YEAR(INDEX(Table1,MATCH(L$1,Table1[ID],0),5)), OR(ISBLANK(INDEX(Table1,MATCH(L$1,Table1[ID],0),6)),$J2 < YEAR(INDEX(Table1,MATCH(L$1,Table1[ID],0),6)))),
12,
IF(AND($J2 > YEAR(INDEX(Table1,MATCH(L$1,Table1[ID],0),5)), $J2 = YEAR(INDEX(Table1,MATCH(L$1,Table1[ID],0),6))),
(MONTH(INDEX(Table1,MATCH(L$1,Table1[ID],0),6))),
0
)
)
)
)*INDEX(Table2,MATCH(INDEX(Table1,MATCH(L$1,Table1[ID],0),4),Table2[Type],0),2)/12,
0
)
Заранее спасибо за помощь,