最近圈子里很多朋友在讨论WPS正式发布的动态数组功能,后台也有朋友留言让我们分享一篇。其实关于动态数组,在WPS发布测试版的时候我们已经很详细的分享过了,所以,摊手,这篇属于旧文重发,不过,耸肩,认真脸来说,这篇旧文依然是圈里关于动态数组最好的推文,加不加之一看你心情。
主要说明以下几个大家应该了解的事儿。
1,什么是动态数组
2,动态数组的优点是什么
3,使用时有哪些注意事项
4,从此改变编写函数的习惯
什么是动态数组
所谓动态数组,通俗的理解,就是将数组公式返回的多个结果,动态溢出到对应大小的单元格区域。它包含了两个要素,其一是数组公式,其二是结果动态溢出,所以叫动态数组。
最大的优点有两个:一个是简化函数公式的输入方式,另外一个是极大提高函数公式的计算效率。
◆ 简化了数组公式的输入方式
=SUM((A2:B10="二班")*(C2:C10))
=IFERROR(
INDEX(
FILTER($A$2:$D$10,$A$2:$A$10="二班"),
ROW(A1),
COLUMN(A1)
),"")
公式先使用FILTER函数筛选A列班级为二班的数据明细,返回的是3行4列的内存数组,然后使用INDEX函数按行列索引将数据一个一个提取出来,最后使用IFERROR函数将错误值屏蔽为假空。
=FILTER(A2:D10,
A2:A10="二班","查无")
我们以前一直给函数新人讲,数组的运算效率是优于大批量普通函数公式的,但一直被打脸,数组公式用多了不论WPS还是Excel都卡德斯基。
事实上,数组运算的效率确实是高于大批量普通函数公式,之所以在实际应用中效率低下,是由于大家总是在每个单元格都输入数组公式,以至于每个单元格都在做重复的数组运算。
以查询”二班”数据明细的案例来说,以下公式它在F2:I7的区域中,重复做了N次运算,每次都使用FILTER函数遍历数据源提取相关数据,然后再使用INDEX函数逐个取值。
=IFERROR(
INDEX(
FILTER($A$2:$D$10,$A$2:$A$10="二班"),
ROW(A1),
COLUMN(A1)
),"")
如果一个数组公式只运算一次就可以获取全部结果,那就应该只计算一次,然后将结果写入相关单元格区域就可以了,为什么还要每个单元格都去做重复的数组运算呢?这样的表格功能岂不是很呆?
有朋友可能会讲,传统的区域数组公式可以避免重复运算。
是的,区域数组可以将公式返回的多个结果一次性写入到单元格区域中,但它需要提前选中结果区域,而且这个区域是静态的,并不会随计算结果的大小自动扩展——所以区域数组公式的用法一直很冷门,属于空心大萝卜,中看不中用。
区域数组公式不会自动扩展▲
使用动态数组,则可以避免区域数组公式的局限。它不但可以只计算一次就返回全部计算结果,而且可以根据结果数组的大小,动态扩展范围,将结果溢出到公式相邻单元格区域中,所以它不但计算效率很高,操作也很灵活。
打个响指,认真脸,当你拥有动态数组,能用动态数组解决的问题,就尽量不使用大批量普通函数公式——这两者的计算效率有云泥之别。非常不认真的说,动态数组用的好,函数的计算效率不弱于VBA/JSA编程,简洁性当然是完胜。
使用动态数组注意事项
◆ 结果区域需要保持空白
歪兔苏芮,看我手指的方向👆,上面讲过,动态数组功能会将多个结果自动溢出到相邻的单元格区域,但前提是这些区域不存在数据,而且不属于【超级表】。如果存在非空值,动态数组会返回一个错误值#SPILL!,提示溢出区域不是空白区域——换句话说,它会动态扩张地盘,但不会强拆别人的房子。
◆ 智能引用动态区域的方式
很明显,动态数组的计算结果是一个动态区域,那么,如何智能引用这个动态区域呢?难道需要使用OFFSET函数去搭建?
当然不用这么麻烦。
可以使用以下语法格式:
动态区域首个单元格#
比如,上图所示的表格,需要在G1单元格统计F3单元格动态数组查询结果的人数,可以使用公式:
=ROWS(F3#)
同样的道理,I1单元格计算总成绩,可以使用公式:
=SUM(F3#)
◆ 取消动态数组的溢出功能
如果需要取消动态数组的溢出功能,只需要获取多个结果的首个值,可以在等号后输入运算符@
举个例子,如上图所示,输入以下公式可以返回全校总分倒数第1名的人名——大名鼎鼎小名随风小妞的罗子阳同志。
擒贼只擒王▼
=@SORTBY(B2:B10,C2:C10+D2:D10)
改变你编写函数的习惯吧
看我真诚的小眼神,动态数组会彻底改变人们编写函数的方式,骗你娶你不论男女。
关于这事,除了上面举过的典型的FILTER函数的案例,我再举一个同样常见的数据查询的例子,你可能就会多一点相信了。
如上图所示,需要根据A~E列的明细,查询G列人名对应的各科成绩。
以前,你需要考虑单元格各种引用的方式,先在H2单元格输入以下公式,再向右向下复制填充:
=XLOOKUP($G2,$B:$B,C:C,"")
查找值需要混合引用,查找范围列需要绝对引用,查找结果列需要相对引用↑
现在,不需要过多的考虑单元格的引用方式,在H2单元格输入以下动态数组,向下复制填充即可:
=XLOOKUP(G2,B:B,C:E,"")
但注意不能使用以下动态数组,XLOOKUP函数患有和VLOOKUP相同的毛病,不支持查找值和返回区域同时多项的情况。
=XLOOKUP(G2:G5,B:B,C:E,"")
……
啪~打个响指,正如一些朋友所了解的,动态数组并非WPS独创,微软Excel在3年前就发布了该功能——但是,在国内,由于低版本Excel充斥行业、又缺乏直接向后升级兼容的特性,以及高版本Office高昂的价格,就导致微软虽然是开创者,却不是很好的普及者,3年过去了,动态数组应用者寥寥依然。
而微软的缺点恰恰是WPS的长处(软件免费,可直接快速升级向后兼容),这也是为什么Excel圈里热烈的期待WPS即将到来的更新。我们目前确实有理由相信凭借WPS的力量可以将动态数组真正普及化,进而真正改变表格函数的编写方式和计算效率等等…
……今就聊到这吧,不知不觉字数渐涨篇幅又很长了,能看到这儿的都是爱学习的E家人呐。有啥问题咱们后续补充吧,当然,如果你是VIP会员,也可以随时在会员微信群中提问交流。来,伸出你的小手,右下角轻轻点一个赞。挥挥手,咱们下期再见了,拜拜
|
|
打开微信扫一扫,Office自学网
专注分享软件安装和视频教程,让你一号在手,办公无忧!