Excel数组公式的神奇妙用

发布 2019-05-01 09:03:15 阅读 2750

数组公式从入门到精通。

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

对于刚接触excel数组公式的人来说,总是会感觉到它的一份神秘。又excel的online help中只有很少关于它的主题,所以这种神秘感就更强了。不要紧,只要跟着我的思路走,你很快就会看清数组公式的真面目!

数组概念。对于数组概念,大家都会很熟悉,其就是一个具有维度的集合。比如:

一维数组、二维数组、多维数组。数组的表示一般为“{}所包括(一维和二维数组)。excel中也不例外,如果你想直接表示一个数组,也必须用“{}括起来。

数组与数组公式。

在excel中,凡是以半角符号“=”开始的单元格内容都被excel认为是公式,其只能返回一个结果。而数组公式可以返回一个或者是多个结果,而返回的结果又可以是一维或二维的,换句话说,excel中的数组公式返回的是一个一维或二维的数组集合。

在excel中需要按下 “ctrl+shift+enter”组合键结束数组公式的输入。

为什么要用数组公式?

如果你的需要满足以下条件之一,那么采用数组公式技术可能会是你很好的选择方案。

你的运算结果会返回一个集合吗?

你是否希望用户不会有意或无意的破坏某一相关公式集合的完整性?

你的运算中是否存在着一些只有通过复杂的中间运算过程才会等到结果的运算?

看到这些另人费解的问题,你可能会摸不着头绪。不要紧,看了以下内容你也许就会明白了。

什么情况下会返回一个集合?

看一个简单的例子,选中c1:e3,输入“=”按“ctrl+enter”组合键。

图1-1 (arrayformula_

结果在c1:e3中看到的结果全是“name”,而实际真正返回的结果应该是一个包含三行三列的二维数组,如何办?答案就是用数组公式。

选中c1:e3,输入“=”按“ctrl+shift+enter”组合键。

图1-2 (arrayformula_

可能你又会问,这有何用?为何不在单元格中直接输入内容,反而要这么麻烦?

这仅仅是一个例子,说明的是如何通过数组公式返回一个结果集。给你个问题,如果存在这样一个工作表:包含字段,如何将“***”为“female”的记录抽取出来 (为了打印报表,抽取的记录需要连续存放) ?

这个问题将在“应用篇”里进行解答。

什么情况下会用到相关公式完整性?

什么是相关公式完整性?这仅仅是我给出的一个定义,请再回到“图1-2”,请选择c1:e3中任意一单元格,然后做随意的修改(哪怕和原先的公式一样),按“enter”键结束输入。

结果如何?修改未成功!提示“不能更改数组的某一部分”。

图1-3 (arrayformula_

为什么会是这样呢?因为你正企图破坏相关公式的完整性。由于c1:

e3中公式的数据源均为“”,而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”键结束输入。

其中涉及到的技巧会在“提高篇”中讨论。)

怎么样?是否了解了数组公式?是否学会了如何使用数组公式?是否感觉到了它的一点点威力?

请继续关注“数组公式从入门到精通”之“提高篇”,让我们继续深入数组公式!

数组公式从入门到精通。

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

相信你在“入门篇”中已经学会了如何建立数组公式,同时也大致了解在什么情况下适合使用数组公式解决问题。需要说明的是,在“入门篇”中提到的使用数组公式的三种情况并不是绝对的,要视具体情况而定。

在接下来的讨论中,你将会了解数组公式的一些工作原理。

在进行正式讨论之前,先跟着我做一些准备工作。

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_

之所以创建以上公式,是因为我想对满足“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”。

怎么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_

图2-4”中的结果说明:将true和false转换为整型后的值分别为1和0。

建立如下图中的工作表,选中d2:e3,输入“=d$1*$c2”,按“ctrl+enter”;同样选中d6:e7,输入“=d$5+$c6”,按“ctrl+enter”。

图2-5 (arrayformula_

从上图中很容易看出,对于“乘”操作,只有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_

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”。

结果如何?