计算机系统应用教程网站

网站首页 > 技术文章 正文

如何计算区域中所有列最后一个非空单元格的和「函数」

btikc 2024-10-12 10:49:18 技术文章 2 ℃ 0 评论

各位朋友,你们好。今天和你们分享一个高级函数。

先看一个题目:需要计算区域中最后一个非空单元格的和(黄色填充单元格的和)。


一、常规的方法

用【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

到此,成功将区域中最后一个非空单元格的行位置提取了出来。


好了,这就是今天的分享内容。

今天的这个函数有点难,希望你们收藏文章,多练习下这个函数。

如果你喜欢我分享的文章,请记得关注我,以便第一时间收到文章推送。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表