You are on page 1of 7

数组公式从入门到精通

入门篇

  本主题包含三部分:入门篇、提高篇、应用篇(分中级和高级)

  对于刚接触 Excel 数组公式的人来说,总是会感觉到它的一份神秘。又 Excel 的 Online Help 中只有很


少关于它的主题,所以这种神秘感就更强了。不要紧,只要跟着我的思路走,你很快就会看清数组公式的
真面目!

  数组概念
对于数组概念,大家都会很熟悉,其就是一个具有维度的集合。比如:一维数组、二维数组、多维数组。
数组的表示一般为“{}”所包括(一维和二维数组)。Excel 中也不例外,如果你想直接表示一个数组,也
必须用“{}”括起来。

数组与数组公式
在 Excel 中,凡是以半角符号“=”开始的单元格内容都被 Excel 认为是公式,其只能返回一个结果。而
数组公式可以返回一个或者是多 个 结果,而返回的结果又可以是一维 或 二 维 的,换句话说,Excel 中的
数组公式返回的是一个一维或二维的数组集合。
在 Excel 中需要按下 “Ctrl+Shift+Enter”组合键结束数组公式的输入。

为什么要用数组公式?
如果你的需要满足以下条件之一,那么采用数组公式技术可能会是你很好的选择方案。
• 你的运算结果会返回一个集合吗?
• 你是否希望用户不会有意或无意的破坏某一相关公式集合的完整性?
• 你的运算中是否存在着一些只有通过复杂的中间运算过程才会等到结果的运算?
看到这些另人费解的问题,你可能会摸不着头绪。不要紧,看了以下内容你也许就会明白了。

什么情况下会返回一个集合?
看一个简单的例子,选中 C1:E3,输入“={"Name", "Sex", "Age"; "John", "Male", 21; "Mary", "Female",
20}”,按“Ctrl+Enter”组合键。

图 1-1 (ArrayFormula_A01.bmp)
结果在 C1:E3 中看到的结果全是“Name”,而实际真正返回的结果应该是一个包含三行三列的二维数
组,如何办?答案就是用数组公式。选中 C1:E3,输入“={"Name", "Sex", "Age"; "John", "Male", 21; "Mary",
"Female", 20}”,按“Ctrl+Shift+Enter”组合键。
图 1-2 (ArrayFormula_A02.bmp)
可能你又会问,这有何用?为何不在单元格中直接输入内容,反而要这么麻烦?
这仅仅是一个例子,说明的是如何通过数组公式返回一个结果集。给你个问题,如果存在这样一个工
作表:包含字段{"ID", "Name", "Sex", "Age"},如何将“Sex”为“Female”的记录抽取出来 (为了打印报表,
抽取的记录需要连续存放) ?这个问题将在“应用篇”里进行解答。

什么情况下会用到相关公式完整性?
什么是相关公式完整性?这仅仅是我给出的一个定义,请再回到“图 1-2”,请选择 C1:E3 中任意一单
元格,然后做随意的修改(哪怕和原先的公式一样),按“Enter”键结束输入。结果如何?修改未成功!提示
“不能更改数组的某一部分”。

图 1-3 (ArrayFormula_A03.bmp)
为 什 么 会 是 这 样 呢 ? 因 为 你 正 企 图 破 坏 相 关 公 式 的 完 整 性 。 由 于 C1:E3 中 公 式 的 数 据 源 均 为
“{"Name", "Sex", "Age"; "John", "Male", 21; "Mary", "Female", 20}”,而 C1:E3 共用的一个公式(这与每个单
元格都有相同的公式是有区别的,因为这仅仅是 C1:E3 拥有 9 个相同的公式,而不是一个!),因此,当你
要单独更改其中一个单元格时,系统会认为你正在更改部分单元格的数据源,如此会导致数据源不一致
的现象,从而导致与其它相关单元格脱离关系,这样数组公式就失去作用,所以系统不又允许你更改数
组公式的部分内容。这样的好处是可以维护数据的完整性,做到与数据源总是有一致的对应关系。

你的公式复杂吗?
如果有如下数据,在 D6 单元格中求出对所购物品需要付多少费用。你会如何做?在 D6 中输入
“=(C2*D2+C3*D3+C4*D4)”?结果正确,如果中间某个单元格地址输入错误你的结果会正确吗?如果记
录不只 3 条,而是成千上万条,你是否会感觉到力不从心(如果不考虑单元格内字符数的限制)?如果用
“图 1-5”中的方法,你的感觉又会如何?(在 D6 中输入“ =SUM(C2:C4*D2:D4)”,按“ Ctrl+Shift+Enter”键
结束输入。其中涉及到的技巧会在“提高篇”中讨论。)

图 1-4 (ArrayFormula_A04.bmp) 图 1-5 (ArrayFormula_A05.bmp)

怎么样?是否了解了数组公式?是否学会了如何使用数组公式?是否感觉到了它的一点点威力?
请继续关注“数组公式从入门到精通”之“提高篇”,让我们继续深入数组公式!
数组公式从入门到精通

提高篇

  本主题包含三部分:入门篇、提高篇、应用篇(分中级和高级)

相信你在“入门篇”中已经学会了如何建立数组公式,同时也大致了解在什么情况下适合使用数组公
式解决问题。需要说明的是,在“入门篇”中提到的使用数组公式的三种情况并不是绝对的,要视具体情况
而定。
在接下来的讨论中,你将会了解数组公式的一些工作原理。
在进行正式讨论之前,先跟着我做一些准备工作。
Excel 的主要功能就是数据的分析和处理,我们现在只关心的是数据处理中的数据抽取。所谓数据抽
取就是对源数据按照一定的条件筛选后所得到的结果。如何定制条件筛选呢?方法很多,这里介绍“ IF()”
函数和模拟 AND、OR 的原理和用法。

模拟 AND、OR
让我们先来看看为什么要模拟 AND、OR,而不用 Excel 的工作表函数 AND()、OR()?
建 立 如 下 图 的 工 作 表 , 分 别 在 D11 、 D12 中 输 入
“=SUM(IF(AND(C2:C7=D9,D2:D7=D10),E2:E7))” 、“=SUM(IF((C2:C7=D9)*(D2:D7=D10),E2:E7))”,并分别
按“Ctrl+Shift+Enter”结束公式输入。

图 2-1 (ArrayFormula_B01.bmp)
之所以创建以上公式,是因为我想对满足“ Product ID”为 D9,“City”为 D10 的记录进行汇总,很明显,
从上面的返回结果表明 D11 中的结果是正确的,而 D10 中的结果是错误的。为什么会是这样呢?
在接下来的演示中通过讲述 AND()和 OR()函数的工作原理来解释为什么 D10 中的公式返回了错误的
结果,以及演示为什么 D11 中的公式可以神奇般的得到结果。
选中在上面工作表的 G2:G7,输入“=OR(C2:C7=D9,D2:D7=D10)”,按“Ctrl+Shift+Enter”;选中
H2:H7,输入“=AND(C2:C7=D9,D2:D7=D10)”,按“Ctrl+Shift+Enter”。
图 2-3 (ArrayFormula_B03.bmp)
图 2-2 (ArrayFormula_B02.bmp)

怎么 G2:G7 都是 TRUE;而 H2:H7 都是 FALSE?实际我们想要的是“图 2-3”中的结果。


为了节省篇幅,我直接把答案告诉你,G2:G7 中的公式相当于
“=OR(C2=D9,C3=D9,C4=D9,C5=D9,C6=D9,C7=D9,D2=D10,D3=D10,D4=D10,D5=D10,D6=D10,D7=D10”,
这回知道原因了吧?“=OR(C2:C7=D9,D2:D7=D10)”返回的结果只有一个,而不是七个!同理,AND()函
数类似。不信,你可以更改数据表中的一些数据来进行验证。
现在你该知道 D10 返回错误值的原因了吧?那为什么 D11 能够返回正确的结果?这正是我们要解决
AND()和 OR()函数在数组公式中存在问题的出发点。先看看下面这个说法:“*”相当于 AND,“+”相当于
OR。这是一些论坛中常见的回答,我到如今为止也这样解答了不少朋友的疑问。结论正确么?难道 Excel
中的“*”和“+”有两层含义?――严格的说,这是不正确的!因此,我已经误导了很多朋友,如果你曾经
在某论坛中得到过我这样的解答,我在这里说声抱歉!为什么“*”和“+”可以模拟 AND 和 OR 呢?就像“图
2-1”中 D12 的公式“=SUM(IF((C2:C7=D9)*(D2:D7=D10),E2:E7))”。
要了解其原理,就要揭开 FALSE 和 TRUE 的面纱。在一新工作表的 C2 中输入“=TRUE+0”,按回车键;
在 D2 中输入“=FALSE+0”,按回车键。

图 2-4 (ArrayFormula_B04.bmp)
“图 2-4”中的结果说明:将 TRUE 和 FALSE 转换为整型后的值分别为 1 和 0。
建立如下图中的工作表,选中 D2:E3 ,输入 “ =D$1*$C2” ,按 “ Ctrl+Enter”;同样选中 D6:E7,输入
“=D$5+$C6”,按“Ctrl+Enter”。

图 2-5 (ArrayFormula_B05.bmp)
从上图中很容易看出,对于 “ 乘 ” 操作,只有 TRUE*TRUE 才会返回 1(TRUE ),因此 “ *”模拟了
AND 的效果;对于“加”操作,只有 FALSE+FALSE 才会返回 0(FALSE),因此“+”模拟了 OR 的效果。
技术说明:
1) Excel 中的 IF()工作表函数对条件真假的判断是这样,当条件的值为 0 时,认为是假;否则,全部认为是真。条
件的数据类型一定是数值。比如“=IF(-3,1,0)”返回 1。因此“+”的操作做到了模拟 OR 的效果。

理解 IF()
IF()还用理解?Excel Online Help 中不是已经表达的很清楚了吗?也许你会这样问。
我并非是想文字充数,请看下图:

图 2-6 (ArrayFormula_B06.bmp)
C5 中的公式为 “ =IF(C2:C3="Mary",ROW(D2:D3))”(为数组公式),你知道它的值为什么是 FALSE
而不是三么?
聪明的你可能已经想到这种类型的数组公式返回的是一个结果集,这个结果集的大小与操作对象的
大小是一致的,在这里操作对象为 C2:C3 和 D2:D3,因此返回值为两个元素。
就是这样,由于 C2=”John”,不满足条件,因此应该返回 IF()函数的第三个参数值,但这里无第三个
参数,所以系统返回 FALSE;由于 C3=”Mary”,满足条件,因此返回第二个参数值,即 ROW(D2:D3),
而 C3 对应的是 D3,所以返回值应该为 3。为了验证结果,请选择 C5:C6,输入
“=IF(C2:C3="Mary",ROW(D2:D3))”,按“Ctrl+Shift+Enter”。结果如何?

图 2-7 (ArrayFormula_B07.bmp)

聪明的 Excel
先看看这个,知道“ =MIN(FALSE,3)”的返回值么?结果返回 0,从上面论述的知识不难理解,因为
FALSE 转换为整型的值为 0 。我们已经知道 “ 图 2-7” 中 “ =IF(C2:C3="Mary",ROW(D2:D3))”的结果集为
“ {FALSE,3}” , 那 么 , 请 选 择 “ 图 2-7” 中 的 D5 , 输 入 “ =MIN(IF(C2:C3="Mary",ROW(D2:D3)))” , 按
“Ctrl+Shift+Enter”,看结果。

图 2-8 (ArrayFormula_B08.bmp)
结果竟然是 3,而不是 0!这就是 Excel 聪明之处!为什么说聪明呢?因为在绝大部分情况下我们想
要的结果是满足条件的部分,而舍弃非满足条件的部分。这对筛选数据非常有帮助!如果你坚持要将非满
足条件的部分包含进来,最简单的方法可以将公式变形为“ =MIN(IF(C2:C3="Mary",ROW(D2:D3),))”,简
简单单的一个逗号“,”,结果却截然不同。对于如何对筛选有帮助,将在“应用篇”中给予实例解答。

模拟 IF()
再来看看“图 2-1”中 D12 的公式“=SUM(IF((C2:C7=D9)*(D2:D7=D10),E2:E7))”,让我们换种形式。在
E12 中输入“”,按“Ctrl+Shift+Enter”。

图 2-9 (ArrayFormula_B09.bmp)
结果也是 30!所以“*”可以模拟 IF()!由于我们已经揭开了 TRUE 和 FALSE 的面纱,因此不难理解,
对 于 “ *” 操 作, 只有 TRUE*TRUE 才 会返 回 1 , 所以 结果 相当 于 “ =SUM(0*12.34, 0*13.34, 1*30, 0*29,
0*103.05, 0*113.05)”,当然结果为 30 了。
注意 :并非所有情况下“*”与 IF()效果都相同,要视具体情况而定,这就需要你灵活掌握了。

引用大小制约
此主题并非重要,不过为了使你更加深入数组公式,还是在这里介绍一下。
这里的引用大小制约指的是数组公式中各相关引用之间的大小制约或引用大小对结果集大小的制约。
1) 主关键区域决定数组函数返回值的大小(关键区域是指决定数组公式返回结果集大小的区
域)
看 “ 图 2-7”中的公式“=IF(C2:C3="Mary",ROW(D2:D3))”,这里的主关键区域为 C2:C3,那么
该公式的结果集大小为 2(即有两个元素)。
2) 有互依赖关系的引用之间大小要一致
互依赖就是共同决定某个结果。
看“图 2-9”的 D12“=SUM(IF((C2:C7=D9)*(D2:D7=D10),E2:E7))”,其中 C2:C7 与 D2:D7 就是互
依赖的引用,它们共同决定 IF()函数第一个参数的值,所以它们的大小必须一致,否则返回错误
值。
对于没有互依赖关系的引用大小有无限制?这就需要视具体情况而定了,再看“图 2-7”中的
公 式 “ =IF(C2:C3="Mary",ROW(D2:D3))” , 其 中 的 两 个 引 用 之 间 就 没 有 大 小 的 限 制 ; 而 公 式
“=MIN(IF(C2:C3="Mary",ROW(D2:D3)))”就不一样了,其中第一个引用的大小必须大于第二个引
用的大小。

到现在为止,你可以说已经掌握了 Excel 中的数组公式的工作原理以及一些中级技巧。学到现在你已


经足以可以应付一些工作中的需要了,当然前提是你真正已经掌握了这些技术。

不知道你现在的感觉如何?可能你还有一头雾水的感觉,这是正常的,Excel 中的数组公式确实不是
很好理解。不要紧!只要多做练习,将实践与理论结合,很快你就会体会到它的强大威力!

为了使你的工作效率更高,我又写了“应用篇”,内容主要是平时能够遇到问题的一些解决方案(包
括自己心得和网友一些问题的解答)。

因此请您继续关注“数组公式从入门到精通”之“应用篇”,让我们展示数组公式的威力!