Excel小课堂:动态数组(Dynamic Arrays)的解析和应用

来源:澳洲会计师公会 时间:2022-08-29 作者:澳洲会计师公会编辑:无忧草
打印 RSS |
导读:动态数据组求和的解决办法。

在刚刚引入动态数组功能时遇到了一个问题,那就是无法对动态数组中的各列或各行运用SUM函数进行简单求和。不过,最新版本的Excel(订阅版)已经通过新引入的LAMBDA函数解决了这个问题。

您可以点击这里收听播客,边听边学。

样例分析

我们来看一个简单的销售预算示例。如图1所示,工作表上方是数据录入表格,表名称为tblSales,下方是一个简单的销售预算表。

Excel小课堂:动态数组(Dynamic Arrays)的解析和应用

图1

为了看起来更简洁明了,老师隐藏了中间月份(“Nov-22”至“Mar-23”)。

利用动态数组功能,可以通过单个公式横向、纵向或同时横纵向填充单元格区域。图1中使用的公式涵盖了这三种填充方式。

表1显示了6个动态数组公式及其说明,下面会进行详细介绍。

Excel小课堂:动态数组(Dynamic Arrays)的解析和应用

表1

B9单元格中的SEQUENCE函数可生成数字1到12,它还决定了后续公式填充的列数。SEQUENCE函数会向右“溢出”,将所有12个数字填充到单元格中。

“溢出”行为与动态数组有关,它会向右、向下或同时向右向下溢出。一个公式填充一个区域。在溢出区域中,公式仅在该区域左上角的单元格中。

若将B6单元格改为10,SEQUENCE函数将在K9单元格停止溢出。其他月度公式也将在K列停止。L列和M列将保持空白。

EDATE函数返回与指定的起始日期相隔指定月数的日期。第一个参数是指定的起始日期,第二个是要在起始日期上加上的月数。

在B10单元格中,使用B7单元格中的日期作为起始日期,B9单元格中的数字减去1作为要加上的月数,从而确保从2022年7月开始。引用的B9#是指溢出区域。

在引用的溢出区域左上角单元格的末尾加上符号#(井号),会使B10单元格中的公式向右溢出,与第9行中的输入值相对应,从而创建其他的月份标题。

B11单元格中的DAY函数返回指定日期的天数,EOMONTH函数返回指定月份最后一天的日期,这个函数组合返回指定月份的日历天数。

B11单元格中公式中的“+0”可修复当前动态数组中的日期错误。有时,动态数组生成的日期未被识别为日期,通过执行一次基本运算(如加上0)可将其转换为日期。理论上,只需要引用B10#,但有时会返回错误,而使用B10#+0就能修复错误。

EOMONTH函数末尾的参数“0”表示在B10中的起始日期上加上零个月。

A14单元格中的公式称为结构化引用,引用的是格式化表格。在本示例中,它引用的是工作表上方的数据录入表格中的产品列,返回两个产品名称。该公式会根据需要向下溢出以显示所有产品。

O11单元格中的SUM函数根据从B11开始的溢出区域将日历天数相加。

O18单元格中的SUM函数根据从B14开始的溢出区域将所有分配的销售额相加。

B14单元格中的公式用于根据产品和月份分配销售预算,结果向下向右溢出,公式如下:

=tblSales[SalesPrice]*tblSales[Sales units per day]*B11#

此处使用了两次结构化引用,一个用于从表格中提取“售价”(Sales Price),另一个用于提取“每日销量”(Salesunits per day),结果向下溢出,与表格中的数据行数相一致。

该公式将两次引用的值相乘,然后再乘以B11单元格中的天数。通过引用B11#,可使公式同时向右溢出,从而能够通过单个公式生成一个二维区域。

求和问题

我们需要将销售额分配区域B14:M14的各列和各行相加。在旧版Excel中,动态数组缺少这项功能,而相应的解决方案较为复杂,不容易解释或理解。

你可能会认为可以在B18单元格中使用以下公式来计算7月份的销售总额并向右溢出至其他月份。

=SUM(B17#)

但是,这个公式并不对。它会对整个二维区域求和,而不是该区域中的B列部分。此外,它也不会向右溢出。O18单元格中的公式会将整个区域的销售额相加。

新推出的BYL函数提供了一种新的解决方案,它可以获取二维区域中每一列的值。BYL需要使用LAMBDA函数作为第二个参数来执行计算。

B18单元格中的公式可以向右溢出并对所有列求和:

=BYL(B14#,LAMBDA(x,SUM(x)))

BYL可提取区域中每一列的值并传递给LAMBDA函数中的变量x。LAMBDA函数中的SUM函数使用x区域作为参数并将该列的值相加。通过引用B14#,公式会向右溢出,与溢出区域的每一列相对应,每一列单独相加。

新函数BYROW与之类似,同样需要使用LAMBDA函数作为第二个参数。O14单元格中的公式如下:

=BYROW(B14#,LAMBDA(x,SUM(x)))

它会向下溢出并将二维溢出区域中的行区域相加。溢出区域中的每一行都会传递给LAMBDA和SUM函数来执行计算。

动态性质

动态数组的妙处在于,可根据需要自动扩展。如果在工作表上方的数据录入表格中添加一项产品Gizmo,动态数组公式会随数据自动扩展,如图2示。

Excel小课堂:动态数组(Dynamic Arrays)的解析和应用

图2

过去,整个动态数组解决方案中缺少SUM求和部分,如今这一问题已经得到解决。如果需要添加更多产品,只需在该表格下方插入空白行即可,简单又方便。

点击这里,阅读微信原文。

点击这里,阅读英文原文。

沪公网安备 31011802001002号