购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.7 数组构造

在学习数组技术之后,就要有用数组解决问题的思维。前文的数组均是通过常规数组或者直接引用单元格区域计算之后产生的数组来解决问题的。除了这两种获得数组的方法,还可以通过函数来构造数组。

2.7.1 用ROW函数构造垂直序列数组

如果需要构造垂直数组,则可以使用ROW函数,此函数可以获取单元格或单元格区域的行号。下面介绍一下此函数的用法。

函数语法说明:

ROW([reference])

● reference:可选参数。需要得到其行号的单元格或单元格区域。如果省略 reference,则假定是对ROW函数所在单元格的引用,reference不能引用多个区域。

例如,公式为=ROW(A1),则返回={1};公式为=ROW(A1:C4),则返回={1;2;3;4};公式为=ROW(1:4),则返回={1;2;3;4}。由此可以看出,ROW函数中的单元格区域无论怎么变化都有以下两条规律。

(1)获取的值都是一个垂直数组。

(2)返回的是行的序号,不受列变化的影响。

因为reference是一个可选参数,也可以写作ROW(),返回的值则是ROW函数所在单元格的行号。比如,在D5单元格中输入=ROW(),返回的值是={5}。

利用ROW函数产生的序列数组,能够更灵活地构造更多的数组样式,在实际应用中更便利。

实例24 求每个员工上半年获得最高工资的月份

问题描述: 图1-44所示的表中列出了每个员工从1月到6月的工资数据,现在要查询出每个员工最高工资所在的月份。

图2-44

解决思路: 首先求出每个员工的最高工资,再将每个员工的最高工资与所有员工的工资做等于比较,乘以{1,2,3,4,5,6}数组形式的月份,这样条件成立的最高分就可以获得其对应的月份。此案例暂不考虑同一个人有多个最高工资的情况。

操作步骤: 如图 2-45 所示,首先将鼠标光标定位在 B9 单元格,输入数组公式=MAX((MAX (B3:B8)=B3:B8)*ROW(1:6))&〝月〝,然后按Ctrl+Shift+Enter组合键,再向右填充公式,完成计算。

图2-45

步骤1: 计算MAX(B3:B8)=B3:B8部分,先求得员工(罗娟)的最高工资是14750,再将其最高工资与当前员工的所有工资做等于比较,结果为{FALSE;FALSE;TRUE;FALSE;FALSE;FALSE},相当于定位到该员工最高工资在所有员工工资中的位置。

步骤2: 将步骤1结果乘以ROW(1:6),相当于定位到最高工资的月份。公式为{FALSE;FALSE;TRUE;FALSE;FALSE;FALSE}*ROW(1:6),运算结果为{0;0;3;0;0;0}。

步骤3: 提取步骤2结果的最大值,相当于提取月份数,公式为MAX({0;0;3;0;0;0}),提取结果为3,也可以用SUM函数来获取月份。

步骤4: 将步骤3的结果连接“月”字符,公式为3&〝月〝,结果为3月。

2.7.2 用COLUMN函数构造水平序列数组

如果需要构造水平数组,则可以使用COLUMN函数,此函数可以获取单元格或单元格区域的列号,下面介绍一下此函数的用法。

函数语法说明:

COLUMN([reference])

● reference:可选参数。需要得到其列号的单元格或单元格区域。如果省略reference,则假定是对COLUMN函数所在单元格的引用,reference 不能引用多个区域。

COLUMN函数和ROW函数的语法结构、特性相同,唯一不同的是获取的数组方向不同。例如,公式为=COLUMN(A1),返回={1};公式为=COLUMN(A1:C4),返回={1,2,3};公式为=ROW(A:C),返回={1,2,3}。

实例25 求各班学生的最高分

问题描述: 图2-46所示的表中列出了各班学生的分数,现在要求统计出每个班的最高分。

解决思路: 先用“班级”列的数据与指定班级做等于比较,得到一个由逻辑值构成的数组,再乘以“分数”列数据,形成一个如果是该班则显示分数,如果不是则显示为0的数组,相当于筛选出了该班的分数。最后用MAX函数获取该班的最高分数。

操作步骤: 如图2-47所示,首先将鼠标光标定位在E9单元格,输入数组公式=MAX(($A3:$A14=COLUMN(A1)&〝班〝)*$C3:$C14),然后按Ctrl+Shift+Enter组合键,再向右填充公式,完成计算。

图2-46

图2-47

步骤1: 首先利用COLUMN(A1)函数来构造一个序列值,再连接“班”字符,即COLUMN(A1)&〝班〝,结果为{〝1 班〝}。这样做的目的有两个:一是为了构造与“各班成绩表”中“班级”列相同的班级名称写法,方便后续比较;二是向右填充公式时,班级名称能够变化。

步骤2: 将班级区域与步骤1的结果做等于比较,公式为$A3:$A14={〝1班〝},目的是定位条件成立的记录,结果为{FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE}。

步骤3: 将步骤2的结果乘以分数区域,公式为{FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE}*$C3:$C14。如果条件成立则返回对应分数;如果条件不成立则返回0,结果为{0;0;99;0;0;0;0;0;0;0;89;0}。

步骤4: 提取步骤3的结果的最大值,公式为MAX({0;0;99;0;0;0;0;0;0;0;89;0}),结果为99。

以上两个关于ROW函数和COLUMN函数的实例,只是进行了简单应用,后续内容将会有更多、更妙的应用。

2.7.3 获取行、列数:ROWS函数与COLUMNS函数

如果要获取指定单元格区域或者数组的行数或列数,则可以使用ROWS函数和COLUMNS函数,返回的结果不是数组,而是单值。

函数语法说明:

ROWS(array)

● array:必需参数。需要得到其行数的数组、数组公式或对单元格区域的引用。

例如,=ROWS(B3:E5),返回3,表示这个区域的行数是3;=ROWS({〝a〝,〝b〝,〝c〝;〝d〝,〝e〝,〝f〝}),返回2,表示这个数组中有2行。

COLUMNS(array)

● array:必需参数。需要得到其列数的数组、数组公式或对单元格区域的引用。

例如,=COLUMNS(B3:E5),返回 4,表示这个区域的列数是 4;=COLUMNS({〝a〝,〝b〝,〝c〝;〝d〝,〝e〝,〝f〝}),返回3,表示这个数组中有3列。 bgd0KReEpQFvp8SGItImmRTU+T7F9kfd7xFzEb9h4v7dNCLsWNGOlEl6fdEqj7si

点击中间区域
呼出菜单
上一章
目录
下一章
×