网站首页 > 技术文章 正文
各位朋友,你们好。今天和你们分享一个高级函数。
先看一个题目:需要计算区域中最后一个非空单元格的和(黄色填充单元格的和)。
一、常规的方法
用【Lookup】函数分别提取所有列的最后一个非空单元格数据,然后再求和,如下图:
=LOOKUP(9E+307,C2:C9)
然后我们可以用4个LOOKUP函数得到结果:
=LOOKUP(E9+307,B2:B9)+LOOKUP(9E+307,C2:C9)+LOOKUP(9E+307,D2:D9)+LOOKUP(9E+307,E2:E9)
现在这里只有四列,但是,如果有很多很多列呢?这个简单方法写出的公式是不是就很长很长呢?所以,我们需要更高级的方法。
二、高级方法
1、解题思路
使用Offset函数,参照A1单元格,分别偏移{5,6,7,8}行、偏移{1,2,3,4}列,可得到每列最后一个非空单元格的值,然后用SUM函数直接求和(这里需要在OFFSET函数外面嵌套一个N函数,才能进行求和)。于是得到一个公式:=SUM(N(OFFSET(A1,{5,6,7,8},{1,2,3,4})))
2、构建数组
由于数据内容是不断变化的,需要根据题中的数据,构建出{5,6,7,8}、{1,2,3,4}这两个数组。结果如下(后面有公式的详细解释):
{5,6,7,8}=LEFT(MMULT(TRANSPOSE(IF(B2:E9<>"",ROW(1:8),)),10^(ROW(1:8))))
{1,2,3,4}=ROW(1:4)
然后将这两组公式代入上面的求和公式中,得到本题的高级解法公式(见下图):
=SUM(N(OFFSET(A1,LEFT(MMULT(TRANSPOSE(IF(B2:E9<>"",ROW(1:8),)),10^(ROW(1:8)))),ROW(1:4))))
三、MMULT函数
这里用到了一个高级函数:MMULT,它就是今天的主角;
在数组公式中,非常重要的一个高级函数;
下面遇到看不懂的内容,可以先跳过,先浏览一遍再回头看。
1、函数说明
这是一个非常烧脑的函数,今天做一个基础讲解,我们先看看官方提供的函数帮助:
关于行数、列数的描述,是不是有点晕了呢?先别晕,要记住下面这两个重点:
1、结果矩阵的行数与 array1 的行数相同,矩阵的列数与 array2 的列数相同;
2、Array1 的列数必须与 array2 的行数相同,而且两个数组中都只能包含数值。
2、函数作用
说实话,是不是有一种感觉:即使看了说明和帮助,还是不知道这个函数能做什么?
接下来,我用大家能听得懂的文字来说下,这个函数的作用:
①数组降维:将二维数组转变为一维数组(上面的题目用到的就是这个);
②数组升维:将一维数组转变为二维数组。
有没有联想到《三体》中的二向箔呢?
3、数组类型
三种数组类型:一维横向数组、一维纵向数组、二维数组。(见下图)
4、应用案例:数组降维
结果数组行数:9行 = Array1行数:9行
结果数组列数:1列 = Array2列数:1列
Array1列数:3列 = Array2行数:3行
结果数组第一行的数据=1×1+9×2+4*3=31(即Array1的第n列 × Array2的第n行的和)
5、应用案例:数组升维
结果数组行数:3行 = Array1行数:3行
结果数组列数:2列 = Array2列数:2列
Array1列数:1列 = Array2行数:1行
结果数组第一个的数据=1×3=3(即Array1的第n行 × Array2的第m列)
四、本题中公式解释
{5,6,7,8}=LEFT(MMULT(TRANSPOSE(IF(B2:E9<>"",ROW(1:8),)),10^(ROW(1:8))))
1、【标记有数据的行】IF(B2:E9<>"",ROW(1:8),)
2、数组转置TRANSPOSE
这里为什么要转置呢?
我需要把每列中标记的行数组合起来,比如张三要得到543210、李四要得到6503010、王五要得到70500200、赵六要得到800500010。
然后再把每个数据的左边第一个数值提取出来,就可以得到{5,6,7,8}这个数组。
所以要利用MMULT的数组降维对列数据求和,故需要将求和的列转换成行。
3、【数组降维】MMULT
这里用【10^(ROW(1:8))】生成了一个1列8行的一维纵向数组。
4、【提取结果】LEFT
到此,成功将区域中最后一个非空单元格的行位置提取了出来。
好了,这就是今天的分享内容。
今天的这个函数有点难,希望你们收藏文章,多练习下这个函数。
如果你喜欢我分享的文章,请记得关注我,以便第一时间收到文章推送。
猜你喜欢
- 2024-10-12 Excel查找重复次数最多的项目 excell查找重复数据
- 2024-10-12 经典动态规划题——打家劫舍 打家劫舍猜一肖
- 2024-10-12 函数公式的左膀右臂:ROW、COLUMN函数知多少
- 2024-10-12 C|二维数组做函数参数求矩阵乘积 c二维数组作为函数参数
- 2024-10-12 sum() 函数性能堪忧,列表降维有何良方?
- 2024-10-12 【译】Vue 何以对 React“降维打击”?
- 2024-10-12 奇异值分解与主成分分析,一文带你理解Spark分布式降维方法
- 2024-10-12 收下这波 JS 技巧,从此少加班 js怎么做加法
- 2024-10-12 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法
- 2024-10-12 盘ES6、ES7、ES8、ES9、ES10 es6解构赋值
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)