数组索引必须为正整数或逻辑值_Office 365函数新世界——动态数组

革新一个旧的函数体系,无外乎从这么几个方面入手,函数的运行效率、函数的编写方式以及扩展新的函数功能。今天咱们就学习一下,看看365新函数是如何通过这三个方面打破旧函数条条框框的。

365函数系列推出了一个新的概念,叫做动态数组。它打破了旧数组的概念,不需要按组合键即可执行数组运算,不需要选中范围即可返回多项结果,且结果区域会动态调整,在保持运算高效的同时,灵活性也不差。那么……什么是动态数组?

谈到函数,很多朋友的第一印象是这家伙只适合小数据的腾挪躲闪,数据量一大,就沦落为卡德斯基先生。比如VLOOKUP函数,大概处理个2万左右的数据就有点儿卡顿了——但这印象应该被打破。

事实上,从Excel 2016版开始,微软就对VLOOKUP、HLOOKUP、MATCH等函数的运算机制进行了强力优化,从相同表区域查找多个列时,将为所搜索的列范围创建内部缓存索引,后续查找中,将重用这一缓存的索引——打个响指,365版本中的VLOOKUP函数即便是计算十几万行数据也不是什么大问题。

而在365版本中,绝大部分参数涉及到单元格引用类的函数都采用了相同的优化措施,比如我们所熟悉的SUMIF(S)、AVERAGEIF(S)、COUNTIF(S)、XLOOKUP等等。

此外还涉及到LAA 内存改进、完整列引用情况下减少所占内存和CPU等——也就是说,通常情况下,365版本函数的运算效率远远优于普通版本的。

再说一下365函数新功能。

这个是重点,照例点杯82年的雪碧先。

80bd9fe3547b7683c35b4040017e57ee.png

365函数新功能主要表现在两方面,一个是新函数,比如排序函数SORT/SORTBY;去重函数UNIQUE;高效查询筛选FILTER以及号称灭霸的XLOOKUP函数等等。另外一个就是动态数组功能。

"数组公式返回的是一组元素;但是Excel一个单元格只能显示数组元素中的一个结果(默认为数组中的首个元素)。

如果需要显示数组公式的全部元素呢?——可以使用区域数组公式。

举个简单的例子

87cd85805c82f86e7c2674a4ff0e7055.png

如上图所示的表格,选中D2:D5单元格区域,在编辑栏编写公式=B2:B5*C2:C5,然后按Ctrl+Shift+Enter数组三键结束公式输入,也就在D2:D5区域内输入了同一条数组公式,这就是区域数组公式。

该公式返回一个内存数组{12;70;30;15},系统会将数组的每个元素依次显示在D2:D5区域中。

在一个单元格中输入的公式被称为数组公式,而所谓区域数组公式,也就是在多个单元格中输入同一数组公式,它可以有序返回结果数组中的每个元素。"

在365中,这一规则也被打破了。

在普通Excel版本,数组公式需要按Ctrl+Shift+Enter三键结束才能启用多项运算;365版本抛弃了这个键,绝大部分数组公式都被默认执行数组运算,也就不再需要摁三贱。

更重要的是,如果一个函数公式返回的是多项结果,365会将多个结果自动填充到相关单元格区域,前提是这些区域不存在数据。

依然以上图所示数据为例,不需要选中D2:D5区域,只需要在D2单元格输入公式=B2:B5*C2:C5,系统就会自动将该公式的计算结果,也就是将内存数组{12;70;30;15}中的元素依次显示在D2:D5区域中。

3d94b0b1c194bf8aa6d8ac5fa2ee04c7.gif

这有什么好处呢?

我们以前一直给函数新人讲,数组的运算效率是优于大批量普通函数的,但一直被打脸,数组公式用多了Excel都卡的很——

事实上,数组运算的效率当然是高于大批量普通函数公式。之所以效率低下,是由于在实际运用时,大家总是在每个单元格都输入数组公式,每个单元格都在做重复的数组运算,这不卡就见鬼了不是?

如果一个数组公式只运算一次就可以获取全部结果了,那只需要将计算结果写入相关单元格区域就OK,为什么还需要每个单元格都去做重复的数组运算呢?

——因为区域数组公式不好用呗。它需要提前选中结果区域,这个区域还不会随计算结果自动扩展,即僵硬又麻烦。

而动态数组的出现则打破了这一切,它只需要计算一次,就可以返回全部计算结果,它还会根据计算结果,动态扩展相应存放结果的单元格区域,所以它效率很高,灵活性也不差。

在365中,能用动态数组解决的问题,就尽量不使用大批量普通函数公式——这两者的计算效率实在是天差地别。非常不认真的说,动态数组用的好,函数的计算效率甚至不弱于VBA编程,简洁性当然是完胜。

我举个例子。

如下图所示,A:D是数据源,需要根据F2单元格指定的班级和G2单元格指定的性别,筛选符合条件的名单,并统计总人数和成绩之和。

蓝色区域是模拟结果。

54ab3b88a847a1ec6abb6f26bb2b7969.png

F5单元格输入以下公式,即可获取符合条件的明细记录。

动态数组▼

=FILTER(A2:D8,(A2:A8=F2)*(C2:C8=G2),"")

FILTER是365中的一个新函数,语法格式如下▼

=FILTER(数据源,筛选条件,容错值)

该函数第2参数是筛选条件,返回的结果须为逻辑值,如果为True则保留相应数据源记录,为False则删除相应记录。

本例中(A2:A8=F2)*(C2:C8=G2)判断A2:A8的班级是否等于F2单元格指定的班级,同时判断C2:C8的性别是否等于G2单元格指定的性别。返回一个内存数组{1;1;1;0;0;0;0},其中0为False,非0数值为True。

如果该函数查无符合条件的结果,会返回错误值#CALC!,通过第3参数指定一个值,可以避免返回该错误值,本例第3参数指定值为假空。

该函数支持数组运算,可以返回符合条件的一组结果。本例中一班男性一共有三条记录,那么只需要在F5一个单元格输入公式,即可获取全部结果。

系统会自动根据计算结果动态扩展结果区域▼

6680d64dbd8462bcd35388435eb18232.gif

是不是很酷?

5c92ad4111ce62fea2c6f9da8d44cb90.png

……

很明显,动态数组的计算结果是一个动态区域,那么如何智能引用这个动态区域呢?难道需要使用OFFSET函数去搭建?

当然不用这么麻烦。

可以使用以下语法格式。

动态区域首个单元格#

比如,我们需要在I2单元格计算符合条件的人数,可以使用公式▼

=COUNT(F5#)&"人"

同样的道理,J2单元格计算总成绩,可以使用公式▼

=SUM(F5#)

两个函数的运算效果参见上面的动图。

最后补两个小贴士:

1)如果需要取消动态数组的溢出功能,可以在等号后输入符号@。比如输入以下公式,就只会返回数组的首个元素。

=@FILTER(A2:D8,(A2:A8=F2)*(C2:C8=G2),"")

49ba7987f736813a80429d2ddbf0007b.png

2)前面讲过,动态数组功能会将结果自动填充到相关单元格区域,但前提是这些区域不存在数据,如果这些区域存在数据,动态数组会返回一个错误值#SPILL!,提示无法填充数据。

0538112e13a5af71a89a7bb4d64756fa.png

(未完待续)

图文制作:看见星光

原载:Excel星球

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android OpenGL ES 开发 (零)】创建一个新的工程

创建符合要求的AndroidApp 使用Android Studio开发,Android Studio下载地址 1.先创建Native C 2.项目相关添加 3.使用C11标准 学习使用JNI为Java提供API 1.在cpp中定义相关接口,格式如下 2.外部调用这个API 把so改成自己想要的名字 1.需要在cmake文件…

java方法参数类型不确定_一个Java方法能有多少个参数类型?这个好奇coder做了个实验...

选自 justinblank机器之心编译参与:李志伟、张倩在 JVM 中,一个 Java 方法,最多能定义多少参数呢?这是一个很无聊的问题,即使能定义一万个,十万个,谁又会真的去这么做呢。但是作为一个 coder&am…

lagom的微服务框架_您的第一个Lagom服务– Java Microservices入门

lagom的微服务框架在撰写我的下一份OReilly报告时,我一直很沮丧,并且一段时间内没有足够的时间来撰写博客。 是时候赶快来这里,让您真正快速地开始使用名为Lagom的新微服务框架。 它与您从Java EE或其他应用程序框架中可能了解到的有所不同。…

【Android OpenGL ES 开发 (一)】使用c++开发opengles 与 日志功能 及 加载assets

创建OpenGLES视口 1.App窗口改成OpenGL窗口,是通过java调用C,在以下位置修改如下内容 package com.example.learnogles;import androidx.appcompat.app.AppCompatActivity;import android.content.Context; import android.opengl.GLSurfaceView; import android.o…

水印相机定位不准确怎么办_禄来的广角双反相机(2020版)

点击上方胶卷迷俱乐部快速关注,胶卷迷们坚实的阵地内容主要原创,配图来自群友和网络,所有水印保留最下方为微信自带广告,支持请点击(本号可获微量收入)4.0德国禄来公司以双反相机名震天下,其中的2.8,3.5两个…

【Android OpenGL ES 开发 (二)】渲染管线与Shader

计算出每一帧耗费的时间 1.在头文件中加入time.h,cpp中实现如下计算时间接口 float GetFrameTime(){static unsigned long long lastTime0,currentTime0;timeval current;gettimeofday(&current, nullptr);//取当前时间currentTime current.tv_sec * 1000 current.tv…

【Android OpenGL ES 开发 (三)】Shader 扩展

编译Shader代码 1.封装一个编译shader的接口 GLuint CompileShader(GLenum shaderType,const char *shaderCode){GLuint shaderglCreateShader(shaderType);glShaderSource(shader,1,&shaderCode,NULL);glCompileShader(shader);GLint compileResultGL_TRUE;glGetShaderi…

css阴影属性_第三场阴影场与属性访问器接口

css阴影属性这是“ 影子字段与属性访问器”界面的 第3轮 。 如果您是新手,但不确定要怎么做,请查看我以前的文章或关于开发JavaFX应用程序时节省内存的第一篇文章 。 作为Java开发人员,我主要关心的是在开发JavaFX域模型时在性能 &#xff0c…

js if判断多个条件_JS条件判断小技巧(一)

经常code review,我发现JS newbie很容易写出一堆冗长的代码。今天就列几个比较常见的“解决之道”,看看如何减少JS里的条件判断。提前返回,少用if...else“if...else是编程语言的精华。——鲁迅”但是过多的嵌套,还是挺令人抓狂的…

【Android OpenGL ES 开发 (四)】纹理相关(一)

纹理贴图的原理 1.作用:可以用来渲染视频。 2.纹理坐标 生成OpenGL中的纹理对象 1.像素数据想要绘制出来需要先变成纹理 2.创建纹理放在GPU上 GLuint CreateTexture2D(unsigned char *pixelData,int width,int height,GLenum type) {GLuint texture;glGenTextu…

jmx 替代_使用JMX作为Ganglia的现代替代品进行CLDB监视

jmx 替代有许多选项可用于监视MapR集群的性能和运行状况。 在本文中,我将介绍使用Java管理扩展(JMX)监视CLDB的鲜为人知的方法。 据最受尊敬的MapR数据工程师之一,Akihiko Kusanagi称,与使用Ganglia相比,使…

red hat安装宝塔_如何在几分钟内安装Red Hat Container Development Kit(CDK)

red hat安装宝塔作为负责开发容器化应用程序提供的可能性的应用程序开发人员或架构师,将所有工具组合在一起以帮助您入门时几乎没有帮助。 到现在。 红帽容器开发套件(CDK) 安装变得简单! 红帽提供了一个容器开发套件&#xf…

threejs 影子属性_影子场vs.属性访问器接口第2轮

threejs 影子属性如果你们还没有注意到Dirk Lemmerman和我之间的(轻松) 摊牌 ,那么让我快速提及一下我们是如何做到这一点的。 首先,Dirk创建了JavaFX技巧23:“ 为属性保存内存阴影字段 ”,以帮助应用程序开…

【OpenGL从入门到精通】Shader专题

详解GPU的工作流程 1.shader通常称为着色器,作用是把CPU上的点渲染出来。 2.shader是并行的。 3.流程:数据data (顶点数据) ----->VS(输入:data的顶点数据,输出:gl_Position的 vec4 顶点数据)----->光栅化处理…

【OpenGL从入门到精通(六)】纹理对象与纹理坐标

1.在OpenGL想要显示一张图片,需要先绘制一个自定义的几何体。 2.把图片加载到纹理对象中 3.当进行纹理贴图时候,使用纹理坐标来设置纹理对象。 2.

yeoman_具有Spring Boot和Yeoman的单页Angularjs应用程序

yeoman我非常感谢yeoman之类的工具,这些工具提供了一种非常快速的方法来将不同的javascript库组合在一起成为一个一致的应用程序。 Yeoman提供了UI层,如果您需要开发服务层和静态资产的Web层,则打包的一种好方法是使用Spring Boot 。 我知道有…

双向链表删除节点时间复杂度_「十分钟学算法」删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。题解…

netbeans连接数据库_NetBeans Java EE技巧3:数据库中的RESTful Web服务

netbeans连接数据库许多现代的Web应用程序正朝着使用HTTP使用无状态通信的方向发展。 REST(表示状态转移)体系结构样式通常用于设计网络应用程序,而使用Java EE 7,很容易开发用于数据库通信的RESTful后端。 使用简单的POJO&#x…

knn算法python代码_K-最近邻分类算法(KNN)及python实现

一、引入问题:确定绿色圆是属于红色三角形、还是蓝色正方形?KNN的思想:从上图中我们可以看到,图中的数据集是良好的数据,即都打好了label,一类是蓝色的正方形,一类是红色的三角形,那…