利用函数来重新构造数组在数组公式中用得越来越多,例如在生成工资条时的循环序列、利用行函数结合INDIRECT函数生成的自然数序列等,用户掌握相关的数组构建方法,对于数组公式的运用很有帮助。
一、行列函数生成数组
在数组运算中,经常会使用“自然数序列”来作为某些函数的参数,如INDEX函数的第2和第3个参数,OFFSET函数除第1个参数以外的其他参数等,如果手工输入常量数组则比较麻烦,而且容易出错,此时利用ROW/COLUMN函数结合INDIRECT函数来生成序列就非常方便实用。
例1产生1~10的自然数垂直序列和水平序列
下面的公式产生1~10的自然数垂直序列和水平序列,如图1所示。
垂直序列:
{=ROW(INDIRECT(“1:10”))}
水平序列:
{=CLUMN(INDIRECT(“A1:J1”))}
公式中使用INDIRECT函数来生成引用,再利用ROW函数或COLUMN函数根据引用返回对应的行列号,从而得到自然数序列。
同理,下面的公式利用INDIRECT函数生成“A-Z”的26个大写字母行数组:
{=CHAR(ROW(INDIRECT(“1:26”))+64)}
例2
INDIRECT函数根据RC1引用样式来生成水平数组
假设A9:J9单元格区域为非空单元格,下面的多单元格数组公式可以生成1~10的自然数水平序列,如图2所示。
{=COLUMN(INDIRECT(“RC1:RC”&COLUMNS(A9:J9),0))}
二、一维数组生成二维数组
1. 一维区域转变二维数组
利用引用函数来对学生考试进行随机排位,最终实现了将1列学员列表排放在指定的考室中,在该公式中就使用了利用ROW和COLUMN函数来转换二维区域的用法,但如果需要将其生成内存数组,原来也大致相同。
例3构造二维数组填充学员数据
在如图3所示的学员明细表中,下面的公式实现将B列的9名学员按顺序排列到3行3列的二维区域中。
D2:F4多单元格联合数组公式如下:
{=T(OFFSET($B$1,(ROW($A$1:$A$3)-1)*3+COLUMN($A$1:$C$1),0))}
公式主要利用ROW函数结合COLUMN函数分别生成{0;3;6}纵向数组和{1,2,3}横向数组,再利用数组运算的原理生成3行3列的二维数组,该结果作为OFFSET函数的引用参考,最终由T函数将取得的值转换为真正的文本填入D2:F4单元格区域中。
如果用户将该公式添加为命名公式,其结果即为存在于内存中的“命名数组”。
2. 两列数据互换生成二维数组
例4构造数组使VLOOKUP实现逆向查询
如图4所示,展示了一份人员信息表,下面将使用VLOOKUP函数实现通过查询人员姓名返回其对应的员工号数据。
B5单元格的逆向查询公式为:
=VLOOKUP(B2,IF({1,0},E2:E9,D2:D9),2,0)
该公式主要利用IF({1,0},E2:E9,D2:D9)核心公式段,利用{1,0}的横向数组,与两个纵向数组进行运算,将姓名列调整为左列,员工号调整为右列,其结果为:
{“叶知”,”A01048”;“陈佩亮”,”A02267” ; “李旭”,”A03236”; “黄思露”,”A05032” ; “潘贺明”,”A05241”; “李影欣”,”A07546” ; “蔡志”,”A08084”; “张博”,”A09095”}
最后,通过VLOOKUP函数进行按姓名查找返回员工编号:A05023。
三、提取子数组
在某些实际应用中,有时候需要用户从一些列数据中取出部分数据提供给其他应用进行数据再处理,例如从员工信息表中提取指定要求的员工列表,或者从成绩表中将总成绩大于平均成绩的人员列举出来,这里将重点介绍如何通过构造数组序列的方式来实现数据的提取。
例5取得奖牌榜中第4到第10名的国家名称
如图5所示,展示了一份2010年青奥会的奖牌榜列表,下面按要求将第4~10名的国家名称提取出来,并生成内存数组。
由于源数据为单列的文本数据,因此可以利用OFFSET函数结合ROW函数构造4~10名的自然序列进行数据提取,如在H3:H9单元格提取内存数组的公式如下:
{=T(OFFSET($B$2,ROW(INDIRECT(“4:10”)),0))}
该公式主要使用ROW函数与INDIRECT函数构造{4;5;6;7;8;9;10}的自然数序列,再利用OFFSET函数逐个提取出来,最终利用T函数将其转换为真正的内存数组。
如果奖牌榜的国家名称是由其他函数公式生成的数组,而针对常量数组(或内存数组)中提取指定的子数组,则需要使用LOOKUP函数来协助处理。
如定义一个名称为DataList,其结果为:
{“中国”;“俄罗斯”;“韩国”;“乌克兰”;“澳大利亚”;“日本”;“匈牙利”;“意大利”;“古巴”;“阿塞拜疆”;“法国”;“美国”;“德国”;“英国”;“加拿大”}
下面将从中提取第1~3名的国家名称,具体公式如下:
{=LOOKUP(ROW($1:$3),ROW(INDIRECT(“1:”&COUNTA(DataList))),DataList)}
该公式同样使用了ROW函数生成的自然序列,唯一的差别在于,该公式中分别生成了1~3的子序列和包括所有数据1~15的全序列,最后利用LOOKUP函数针对子序列进行查找,最终返回对应的前3名国家名称:{“中国”;“俄罗斯”;“韩国”}。
网友评论