在dynamic范围内排列子组
我有这样的ROI比较表:
Month | ROI | 1 | 2 | 3 | Jul | A | 1% | Jul | B | 3% | Jul | C | 2% | Jun | A | 4% | 6% | Jun | B | 5% | 7% | Jun | C | 6% | 8% | May | A | 2% | 4% | 7% | May | C | 3% | 5% | 6% |
我想每个月对每个产品的投资回报率(A,B和C)进行排名 – 所以只列出给定月份中最正确的百分比。
但范围需要是dynamic的,因为每个产品可能有不同的发布date。 例如,5月份没有产品B.
所以输出将是:
Month | ROI | 1 | 2 | 3 | Rank Jul | A | 1% | | | 3 Jul | B | 3% | | | 1 Jul | C | 2% | | | 2 Jun | A | 4% | 6% | | 3 Jun | B | 5% | 7% | | 2 Jun | C | 6% | 8% | | 1 May | A | 2% | 4% | 7% | 1 May | C | 3% | 5% | 6% | 2
我正在考虑使用索引/匹配function:
=RANK(INDEX(G3:S3,MATCH(9^99,G3:S3,1)),G3:G5,0)
但我不确定如何使G3:G5dynamic。
我想我已经设法使用下列公式在排名栏中工作:
=RANK(OFFSET(G3,,SUM(--ISNUMBER(G3:S3))-1), OFFSET(G3,COUNTIF(E3:$E$999,E3)-COUNTIF($E$1:$E$999,E3), SUM(--ISNUMBER(G3:S3))-1,COUNTIF($E$1:$E$999,E3)))
(假设你的月份在E1:E999
)。
这样做是看G3
并使用OFFSET
移动到最右边的非空( ISNUMBER
)列,并认为该值将被排列在月份与当前行的月份匹配的OFFSET
数组中。
让我们分开第二个OFFSET
公式(假设我们正在考虑一个Jul
行):
- 从
G3
开始。 - 行偏移量:当前行以下的
Jul
行数(包括) –Jul
行的总数。 - 列偏移量:包含当前行中的数字的单元格的数量 – 1
- 高度:
Jul
行的总数。
这是一个数组公式,所以必须使用Ctrl + Shift + Enterinput 。
注:该公式假定如果月份相同,则最右边的值在同一列中。 这在你所举的例子中是成立的,但是我不知道它是否适用于你的全部数据集。 如果这通常不是真的,则可以使用公式的第一个OFFSET
片段创build一个帮助列
=OFFSET(G3,,SUM(--ISNUMBER(G3:S3))-1)
在每行中获得最右边的数字,然后在该帮助列上进行排名。
使用COUNTIFS函数从简单的子分组开始。
=COUNTIFS(A:A, A2, C:C, "<="&C2)
修改百分比范围,使用INDEX在近似MATCH的多列范围内从该行捕获最右边的数字。
=COUNTIFS(A:A, A2, INDEX(A:F, 0, MATCH(1E+99, A2:F2)), ">="&INDEX(A:F, ROW(2:2), MATCH(1E+99, A2:F2)))
根据需要填写。