学前班算术练习~~~题很简单,每个人都会做,就看谁最短小~~~结贴~~~~ ...
看题目的要求,非常像学前班小孩的算术练习,找出各字符串中(A列)每1个是数字的字符(请注意:是每1个字符!),再比较大小,用最大值减最小值,算出结果。。需要注意的是,有的字符串中只有一个符号是数字(只有1个数字),这时候这个数字就是需要的结果!
预设公式82字符,欢迎大神们前来摩擦~~~~~~~
才两天,就被江山大佬破功了,所以是时候结贴了~~~最近跟江山大佬撞车比较多,真的是缘分哪~~~
预设公式就是:
=MAX(MMULT(IFERROR(AGGREGATE({14,15},6,-MID(A2,ROW($1:99),1),{1,1;2,1}),),{1;-1}))
跟50楼江山社稷大佬的答案几乎一毛一样~~~~
唯一的不同是AGGREGATE中的参数2,我用了6,江山大佬用的2。。。。
预设公式的思路:
1.利用AGGREGATE第1参数的14,15来一次性得到最大最小值
2.利用第2参数去除MID中的非数字字符产生的错误
3.第4参数设置成{1,1;2,1}——我觉得这是预设公式的重点!!!最大值都设置为1,而最小值,设置了两个,最小的那个和倒数第2小的那个。。
再用MMULT算出最大值分别与最小的两个值的差,最后用MAX得到差最大那个。。。就是我们题目要求的最大值减最小值。。
在字符串中只有1个数字时,由于第二个最小值会取不到,函数AGGREGATE会返回错误(所以最大值设了两个1,从而避免最大值也产生错误),这时用IFERROR使第2个最小值变成0,最终的差就是这个唯一的数字本身了~~~
我想这里可容易受惯性影响,最大值和最小值的设置要么都取一个,要么都取两个——如果都取两个,效果跟都取一个是一样的,在只有1个数字的时候,得到的结果是0,这样容易误导大家否定公式的这种写法~~~
而且可能对于惜字符如金的各位大佬来说,AGGREGATE这个函数名本身就太长了,不招人待见~~~~我猜这就是像JIVY1212大佬和小书生大佬在刚刚我发出贴就想到了这个函数,但也没有去更进一步深挖的的重要原因吧~~~
没错,预设公式的主角就是江山大佬----江山大佬前后一共写了4个非常精妙的公式~~~哦,不,为了避免让大家误以为我跟江山大佬都是有激情的有志青年。。
还是来简单说下AGGREGATE吧
AGGREGATE其实我用的很少,要不是为了这个题,我还真的基本没有了解。。在我看来,这个函数的主要特点有:
1.跟SUBTOTAL非常相似,支持各种求和、计数、最大、最小值、平均值、中值、乘积等等。多种计算方式也可以以数组方式出现。。。。
2.AGGREGATE还支持各种容错---忽略错误、忽略空值、忽略隐藏行。。。
3.AGGREGATE不但支持对引用的各种计算,还支持对数组进行以上各种操作——第3参既可以是引用,也可以是数组----这个弥补了SUBTOTAL只能对引用进行各种计算的缺憾!
4.还有很重要的一点,第4参数也可以是数组,当然,配合参数1的14、15两个取值,第4参数可以是数组也很好理解。。
以上4个特性,使得AGGREGATE给我的感觉是非常非常的强大。。。
AGGREGATE还有一些其它特性,
1.1参是4和5——相当于MAX和MIN的时候,3参不能是数组,而必须是引用,否则会返回错误,这个在36楼xlllw203问过,我37楼也答过。。。
而1参使用14、15的时候,3参既可以是引用,也可以是数组。
2.和SUBTOTAL不同,AGGREGATE好像不支持多维引用,我试了一些情况的多维引用,都失败了
本人比较懒,水平也很低,以上仅仅做了初步测试,错漏之处还请大佬们指教~~~~
A9的3-0是咋来的? 因为只有1个数字,结果就是这个唯一的数字,所以也可以按最小值是0来计算! 理解了。 没说限制版本,先来凑个热闹,A列没有数字的情况怎么处理还没想到
=SUM(AGGREGATE({14,15},2,-MID(A2&REPT(0,COUNT(-MID(A2,ROW($1:$50),1))=1),ROW($1:$50),1),1)*{1,-1})
抛砖等神奇思路。 =IF(COUNT(MID(A2,ROW($1:$99),1)/1)=1,LOOKUP(9,MID(A2,ROW($1:$99),1)/1),MMULT(LARGE(IFERROR(MID(A2,ROW($1:$99),1)/1,),COUNT(MID(A2,ROW($1:$99),1)/1)^{0,1}),{1;-1})) 非常佩服PQ玩的熘的大神,只是目前没时间学习~~~ 应该和我的思路是一样的,只不过我是用365版的函数,他是用M函数。说实话,我更佩服你们用低版本函数解决的大神(虽然佩服,但是我还是倾向于用新版本解决,毕竟头发宝贵,能省一点是一点)