例 各列最小值之和
如下图所示的6列数据,需要求得每一列的最小值,并计算6个最小值之和。
方法1在I3单元格中输入以下数组公式,按<Ctrl+Shift+Enter>组合键。
{=SUM(SUBTOTAL(5,OFFSET(A2,,COLUMN(A:F)-1,10)))}
公式中的“COLUMN(A:F)-1”生成一维横向数组{0,1,2,3,4,5},然后使用OFFSET函数生成以A2单元格为基点,依次向右偏移0~5列,高度为10个单元格,宽度为1个元格的横向三维引用,结果是以下6个单元格区域引用构成的数组。
A2:A11、B2:B11、C2:C11、..、F2:F11
使用SUBTOTAL函数分别统计OFFSET函数返回的各引用区域的最小值,返回各列的最小值组成的数组。
{227,201,244,348,288,255}
最后使用SUM函数汇总各列的最小值,得到各列最小值之和。
方法2 在I4单元格中输入以下数组公式,按< Ctrl+Shift+Enter >组合键。
{=SUM(MOD(SMALL (COLUMN(A:F) /1%%+A2:F11,COLUMN(A:F)*10-9),10^4))
公式使用COLUMN函数生成一维横向数组{1,2,3,4,5,6},通过“/1%%”将数组各元泰扩大10 000倍(此处的10 000是大于原始数据区域最大值的一个整十数),再与A2:F11单元格区域的原始数据进行对应位置的求和运算,并返回一个二维数组(一维数明与二维数组之间的直接运算),这样将原始数据区域按列划分在不同的数值区间,第一列大于10 000且小于20 000,第二列大于20 000且小于30 000,依此类推,第六列大于60 000且小于70 000。
再使用SMALL函数提取上述结果中每列的最小值,提取原理如下:第一列的最小值就是整个二维数组的最小值,因此SMALL函数的第二参数取1;第一列的10个值均小于第二列的值,因此第二列的最小值就是整个二维数组的第11小值,SMALL函数的第二参数取11;依此类推,第一、二、三、四、五列的所有值(共50个)均小于第六列的值,因此第六列的最小值就是整个二维数组的第51小值,SMALL函数的第二参数取51。通过“COLUMN(A:F)*10-9”构造了一维横向数组{1,11,21,31,41,51)作为SMALL函数的第二参数,可依次提取各列的最小值。
{10227,20201,30244,40348,50288,60255)
使用MOD函数计算以上内存数组除以10 000的余数,得到对应原始数据的最小值最后使用SUM函数汇总得到各列最小值之和。
使用不同维度的一维数组生成四维引用
在OFFSET函数的rows、cols、height、width参数中,两个或多个参数分别使用一维横向数组和一维纵向数组,将返回四维引用。
以下数组公式将返回四维引用。
{=OFESET(A2,{0;1;2},{2,3})}
公式表示在数据源表格中以A2单元格为基点,分别偏移0行2列、0行3列、1行2列、行3列、2行2列、2行3列的单元格引用。由于{0;1;2}是一维纵向数组,{2,3}是一维横向数组,因此最终取得对“{C2,D2;C3,D3;C4,D4}”共6个单元格的引用,并呈3行2列二维排列。
例 出现次数最多的数字
如下图所示,C3:H9单元格区域为数据区,均为0-9的整数,需要在J4单元格中统计出现次数最多的数字,统计条件为在同一行中重复出现的数字只计一次。如工作表第3行,虽然数字1重复出现,但统计时,数字1在第3行内只计1次。
在J4单元格中输入以下数组公式,按<Ctrl+Shift+Enter>组合键。
{=MODE(IF(COUNTIF(OFFSET (B2,ROW(1:7),,,COLUMN (A:F)),C3:H9)=0,C3:H9))}
公式使用ROW(1:7)生成垂直数组{1;2;3;4;5;6;7},使用COLUMN(A:F)生成横向数组{1,2,3,4,5,6},根据这两个不同维度的一维数组,使用OFFSET函数返回四维引用。
使用COUNTIF函数统计数据区内各个值在与之对应的四维引用中的出现次数,其对应关系如下图所示。
通过观察可以发现,COUNTIF函数统计的是数据区内各单元格在同一行之前单元格区域内的出现次数。如果出现次数为0,表示此数字在本行内首次出现,则通过IF函数返回该数字本身;如果出现次数非0,表示此数字在本行之前的单元格内已出现,该数字在本行内重复,则通过IF函数返回逻辑值FALSE,在后续统计时不计次数。
各行内去重后的数据如下。
{2,1,7,FALSE,0,5;6,5,2,1,4,FALSE;5,FALSE,3,0,8,6;4,1,FALSE,6,0,FALSE;1,3,4,8,FALSE,2;4,2,3,8,9,0;5,FALSE,7,2,4,FALSE}
最后使用MODE函数忽略逻辑值,返回数据的众数,即出现次数最多的数字。