在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) 

rank_latest

修改百分比范围,使用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))) 

rank_latest_two

根据需要填写。