Excel数组公式

需要注意的:


  1. 虽然 + * 有时可以和 orand 互换,但是他们是有区别的,例如:
    =sum(if(and(A1:A2>0,A1:A2<8),B1:B2))
    VS
    =sum(if((A1:A2>0)*(A1:A2<8),B1:B2))

前者只有当 A1:A2 都介于0和8之间时才返回 B1:B2 的和,否则得到的结果是 0
后者则分开了,比如A1介于0和8之间,A2不介于0和8之间,那么求得的结果是B1的和,而不是0。
AND(logical1,logical2, ...) --详见 and 函数帮助:当所有的logical们都为True时返回True --这是1个单值
OR(logical1,logical2, ...) --详见 or 函数帮助:当所有的logical们只要有一个为True时返回True --这是1个单值
(A1:A2>0)*(A1:A2<8) -- 返回的是{True;False}*{True;True}类型的数组相乘的结果{1;0}——这是一个数组
(A1:A2>0)+(A1:A2<8) -- 返回的是{True;False}+{True;True}类型的数组相加的结果{2;1}——这是一个数组
就是说And、OR计算出来的总是单值,不是数组。

  1. -- 用于把文本转换成数字,也可以用 *1 代替,(或者 N("xx"+0) ?)

  2. 应用: 将文本中的数字取出,例如:"收取32.0元"
    =LOOKUP(9E+307,--MID(A1,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A1&1234567890) ),ROW(INDIRECT("1:"&LEN(A1)))))

还可以再加上对 MIN(FIND...) 的值与 LEN(A1) 的比较,以免出现 #N/A

解释:构造了一个搜索数组,从最先出现数字的位置开始取子字符串,然后将其转换为数字(不能转换为数字的为#N/A),然后用Lookup指定一个9E+307这样的大数,最后返回小于等于他的(实际上也就是最接近它的)数,也就是最长的可以转换为数字的子字符串。

  1. 应用:取出某列中非空不重复的单元格的内容:
Excel数组公式

这里加一个要求:返回B1:B20内不重复非空单元格。
步骤分解:
(1)首先取出非空不重复单元格所在的行号:
IF($B$1:$B$20<>"",IF(MATCH($B$1:$B$20,$B$1:$B$20,0)=ROW($B$1:$B$20),ROW($B$1:$B$20)))

因为MATCH函数不能使用空值作为第一个参数,所以先使用IF语句把空值排除出去。
然后由于MATCH函数返回搜索值中在整个区域第一次出现的位置,将其和自身所在行号进行比对,就可以判断是否重复。
为了方便将它定义为一个名称x,这是一个数组。

(2)然后使用 IF(ROW(1:1)>COUNT(x),"",INDEX(A:A,SMALL(x,ROW(1:1)))) 得到想要的结果,这是使用数组得到一个单值。

  1. 应用:返回B列内等于“A”的对应A列的记录:
Excel数组公式

步骤分解:
(1)首先使用 IF($B$1:$B$20="A",ROW($B$1:$B$20)) 实现判断B列等于"A"的记录的行号。
注意这个结果是一个数组,使其有了不同的用途,为了方便可以将其定义为名称 x
(2)使用 SMALL(x,ROW(1:1)) 把符合条件的行号按照从小到大的顺序列出来,这是使用数组得到一个单值。
(3)使用 INDEX($A$1:$A$20,SMALL(x,ROW(1:1))) ,把A列对应的记录取出来。
(4)为了不出现错误值,使用 SUM(($B$1:$B$20="A")*1)<ROW(1:1) 作为判断条件,一般使用SUM数组公式,可以组合多个条件,且的关系使用 *,或的关系使用 + ,只有一个条件时要加个常用条件,例如本例 *1
如果在增加一个条件,则在此主公式中加入 IF(($B$1:$B$20="A")*($C$1:$C$20="B"),ROW($B$1:$B$20)) , 然后相应地在 (SUM(($B$1:$B$20="A")*1)<ROW(1:1) 中加入相应的判断条件

(5)最终公式为:
=IF(SUM(($B$1:$B$20="A")*1)<ROW(1:1),"",INDEX($A$1:$A$20,SMALL(x,ROW(1:1))))

  1. 返回重复次数最多的值


    Excel数组公式

解题步骤:
(1)首先使用IF(COUNTIF($B$1:$B$20,$B$1:$B$20)=MAX(COUNTIF($B$1:$B$20,$B$1:$B$20)),ROW($B$1:$B$20))
得到一个数组,用于符合条件的行的行号,也就是G列所示的值,为了方便可以将其定义为名称 x
(2)使用 INDEX($C$1:$C$20,SMALL(x,ROW(1:1))),把C列中的内容取出来。
(3)为了不出现错误值,可以使用 IF(COUNTIF($B$1:$B$20,$B$1:$B$20)=MAX(COUNTIF($B$1:$B$20,$B$1:$B$20)),1) 得到另外一个数组,用于符合条件的行的计数,将其定义为名称y。然后使用 SUM(y)<ROW(1:1) 作为判断条件。
(4)最终公式为
=IF(SUM(y)<ROW(1:1),"",INDEX($C$1:$C$20,SMALL(x,ROW(1:1))))

  1. 按照重复次数的大小列示内容
Excel数组公式 - supershll - 记忆里

解题步骤:
(1)首先得到不重复单元格所在的行号数组:
IF(MATCH($B$1:$B$20,$B$1:$B$20,0)=ROW($B$1:$B$20),ROW($B$1:$B$20))
如E列所示。

(2)然后得到不重复单元格的重复次数数组:
IF(MATCH($B$1:$B$20,$B$1:$B$20,0)=ROW($B$1:$B$20),COUNTIF($B$1:$B$20,$B$1:$B$20))
如F列所示

(3)为了进行排序的同时又得到行号,所以综合E列和F列的数据,使用如下:
IF(MATCH($B$1:$B$20,$B$1:$B$20,0)=ROW($B$1:$B$20),COUNTIF($B$1:$B$20,$B$1:$B$20)+ROW($B$1:$B$20)/1000)

这样整数部分是重复次数,小数部分是行号。
如G列所示,这个数组符合我们的使用要求了,将其定义为名称 x

(4)使用LARGE函数进行排序。LARGE(x,ROW(1:1)) ,这是使用数组得到一个单值。

(5)然后使用MOD函数取出行号。MOD(LARGE(x,ROW(1:1))*1000,1000)

(6)然后在使用INDEX函数取出对应行的记录。INDEX($B$1:$B$20,MOD(LARGE(x,ROW(1:1))*1000,1000))

(7)最后屏蔽错误值,IF(ROW(1:1)>COUNT(x),"",INDEX($B$1:$B$20,MOD(LARGE(x,ROW(1:1))*1000,1000))), 也可以使用ROW(1:1)>SUM(1/COUNTIF($B$1:$B$20,$B$1:$B$20)) 作为判断条件, 这个SUM的意思就是说区域内去重后的单元格的个数(假设重复的单元格a的个数n,n个(n/1)相加最后变成1)。

  1. 返回区域内符合条件的值
Excel数组公式 - supershll - 记忆里

解题步骤:
(1)首先使用 IF($A$2:$H$12=1,ROW($A$2:$H$12)*10000+COLUMN($A$2:$H$12)) 找出符合条件的单元格行号和列号数组,这是一个2维数组。将其定义为名称 x

(2)如果想使用INDEX函数就需要找出相关的参数来,即INDEX(数据区,行数,列数) 。使用INT(SMALL(x,ROW(1:1))/10000) 获得行号, MOD(SMALL(x,ROW(1:1)),10000) 获得列号。

(3)最后使用INDEX获得结果,此公式是姓名列的公式(其中Column()-17是根据公式所在列设置的) INDEX($A$1:$H$12,INT(SMALL(x,ROW(1:1))/10000),MOD(SMALL(x,ROW(1:1)),10000)+COLUMN()-17)

(4)最后就是屏蔽错误值的问题。使用IF(SUM(IF($A$2:$H$12=1,1))<ROW(1:1),"","原公式")

  1. 按顺序返回不重复值


    Excel数组公式 - supershll - 记忆里

解题步骤:
(1)使用MATCH函数获取不重复行的行号和值的数组,将其定义为名称x
IF(MATCH($B$1:$B$6,$B$1:$B$6,0)=ROW($B$1:$B$6),ROW($B$1:$B$6)*100+$B$1:$B$6)

(2)使用SMALL函数:
SMALL(MOD(SMALL(x),{1;2;3}),100),ROW(1:1))

  1. 返回数字中不重复的前3位数。
Excel数组公式 - supershll - 记忆里

解题步骤:
(1)使用 ROW(INDIRECT("1:"&LEN(A1*B1))) 求出乘积结果的位数序号数组,如F列所示,定义为名称 x

(2)使用 MID(A1*B1,x,1) 把乘积的结果按照原有顺序组成内存数组,如G列所示,定义为名称 y

(3)然后使用MATCH函数获取不重复行的行号和值的数组,定义为名称 m ,如J列所示 IF(MATCH(y,y,0)=x,x*100+y)

(4)使用SMALL函数,SMALL(MOD(SMALL(m),{1;2;3}),ROW(1:1)) ,如M列所示,这是由数组得到的单值

(5)将结果串起来 TEXT(SUM(SMALL(MOD(SMALL(m),{1;2;3}),{1;2;3})*10^{2,1,0}),"000") 再次使用数组得到一个单值。

  1. 总结:使用数组公式,一定要时刻明白,何时结果是数组,何时结果是单值。然后再根据结果参与计算,例如送数组中取出单值或把单值组合成数组
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,333评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,812评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,016评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,293评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,650评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,788评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,003评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,741评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,462评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,681评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,168评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,528评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,169评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,119评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,846评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,719评论 2 274

推荐阅读更多精彩内容