[开_157]名单增加-小结 |
本期题目难度一般,做出来容易,减少字符数可能是部份坛友函数运用的一个盲点,以下先借用本期VIP公式做简单讲解。 |
- =INDEX(B:B,SMALL((COLUMN(A:H)>K1*(B1:B30<>B2:B31)+1)*30+ROW(),ROW()*7+COLUMN()-25))&""
复制代码 |
通常在遇到B列数据源的情况下,很多人的第一反应可能是使用MATCH。 但在名字有序排列的情况下,可以直接比较,第一次出现为真,否则假。
|
因为K1的最大值为7,而题目要求的重复数量是首次出现的人名增加,其后不变。
如上,最大8次,就有了COLUMN(A:H)的产生。需要保留为假,体会一下为什么+1。
|
*30+ROW(),将上一步结果为真的,需要剔除的值放大处理。
B列数据源只到31,而答题区行数是2起,所以放大值必定大于数据源产生的保留值。
|
用SMALL函数将上一步8列的结果转为7列。
ROW()*7+COLUMN()-25相当于ROW(1:30)*7-{6,5,4,3,2,1,0}针对行列的简写形式。
|
最后一步,用INDEX定位B列逐个按值取数,用&""去掉空单元返回的0。
|
![]()
|
接下来我们看看其它思路,这也是我的预设思路之一
- =LOOKUP(A2:A31*7+COLUMN(A:G)-8,MMULT(N(ROW(1:33)>COLUMN(A:AE)),(B2:B32<>B1:B31)*K1+1),B2:B3)&""
复制代码 |
(B2:B32<>B1:B31)*K1+1,仍然是同一种核心构成,但不同是的使用MMULT生成了累加的序列。
|
MMULT(N(ROW(1:33)>COLUMN(A:AE)),(B2:B32<>B1:B31)*K1+1)
{0;4;5;6;7;11;12;13;14;18;19;23;24;25;26;27;28;29;30;31;32;33;34;38;39;40;41;42;43;44;45;46;46}
|
LOOKUP一参生成的的序列也可以简化表达,然后对应二参一一落座。
最后一步,B2:B3,三参自动扩展,其它就毋庸赘述了。
|
![]()
|
最后必须要说说出题人梅州的预设,完全在我意料之外的脑洞,本期就三秋之叶同学一个人撞了,点个赞。 |
- =INDEX(B:B,SMALL(IF(B2:B398=B3:B399<=(OFFSET(A2,,,,K1+1)=A2),ROW(2:398)),COLUMN()+7*ROW()-25))&""
复制代码 |
充份利用的数据源特性,OFFSET生成自适应数组,后面有兴趣的小伙伴们请自行品味,定觉畅快。 |