需要注意的:
- 雖然
+
*
有時(shí)可以和or
渐白、and
互換唱遭,但是他們是有區(qū)別的诈茧,例如:
=sum(if(and(A1:A2>0,A1:A2<8),B1:B2))
VS
=sum(if((A1:A2>0)*(A1:A2<8),B1:B2))
前者只有當(dāng)
A1:A2
都介于0和8之間時(shí)才返回B1:B2
的和泡垃,否則得到的結(jié)果是0
旨怠;
后者則分開了渠驼,比如A1介于0和8之間,A2不介于0和8之間鉴腻,那么求得的結(jié)果是B1的和迷扇,而不是0。
AND(logical1,logical2, ...) --詳見 and 函數(shù)幫助:當(dāng)所有的logical們都為True時(shí)返回True --這是1個(gè)單值爽哎;
OR(logical1,logical2, ...) --詳見 or 函數(shù)幫助:當(dāng)所有的logical們只要有一個(gè)為True時(shí)返回True --這是1個(gè)單值谋梭;
(A1:A2>0)*(A1:A2<8) -- 返回的是{True;False}*{True;True}類型的數(shù)組相乘的結(jié)果{1;0}——這是一個(gè)數(shù)組;
(A1:A2>0)+(A1:A2<8) -- 返回的是{True;False}+{True;True}類型的數(shù)組相加的結(jié)果{2;1}——這是一個(gè)數(shù)組倦青;
就是說And瓮床、OR計(jì)算出來的總是單值,不是數(shù)組。
--
用于把文本轉(zhuǎn)換成數(shù)字隘庄,也可以用*1
代替踢步,(或者N("xx"+0)
?)應(yīng)用: 將文本中的數(shù)字取出,例如:"收取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)))))
還可以再加上對(duì) MIN(FIND...)
的值與 LEN(A1)
的比較丑掺,以免出現(xiàn) #N/A
解釋:構(gòu)造了一個(gè)搜索數(shù)組获印,從最先出現(xiàn)數(shù)字的位置開始取子字符串,然后將其轉(zhuǎn)換為數(shù)字(不能轉(zhuǎn)換為數(shù)字的為#N/A)街州,然后用Lookup指定一個(gè)9E+307這樣的大數(shù)兼丰,最后返回小于等于他的(實(shí)際上也就是最接近它的)數(shù),也就是最長的可以轉(zhuǎn)換為數(shù)字的子字符串唆缴。
- 應(yīng)用:取出某列中非空不重復(fù)的單元格的內(nèi)容:
這里加一個(gè)要求:返回B1:B20內(nèi)不重復(fù)非空單元格鳍征。
步驟分解:
(1)首先取出非空不重復(fù)單元格所在的行號(hào):
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)))
因?yàn)镸ATCH函數(shù)不能使用空值作為第一個(gè)參數(shù),所以先使用IF語句把空值排除出去面徽。
然后由于MATCH函數(shù)返回搜索值中在整個(gè)區(qū)域第一次出現(xiàn)的位置艳丛,將其和自身所在行號(hào)進(jìn)行比對(duì),就可以判斷是否重復(fù)趟紊。
為了方便將它定義為一個(gè)名稱x氮双,這是一個(gè)數(shù)組。
(2)然后使用 IF(ROW(1:1)>COUNT(x),"",INDEX(A:A,SMALL(x,ROW(1:1))))
得到想要的結(jié)果霎匈,這是使用數(shù)組得到一個(gè)單值戴差。
- 應(yīng)用:返回B列內(nèi)等于“A”的對(duì)應(yīng)A列的記錄:
步驟分解:
(1)首先使用 IF($B$1:$B$20="A",ROW($B$1:$B$20))
實(shí)現(xiàn)判斷B列等于"A"的記錄的行號(hào)。
注意這個(gè)結(jié)果是一個(gè)數(shù)組铛嘱,使其有了不同的用途暖释,為了方便可以將其定義為名稱 x
。
(2)使用 SMALL(x,ROW(1:1))
把符合條件的行號(hào)按照從小到大的順序列出來弄痹,這是使用數(shù)組得到一個(gè)單值。
(3)使用 INDEX($A$1:$A$20,SMALL(x,ROW(1:1)))
嵌器,把A列對(duì)應(yīng)的記錄取出來肛真。
(4)為了不出現(xiàn)錯(cuò)誤值,使用 SUM(($B$1:$B$20="A")*1)<ROW(1:1)
作為判斷條件爽航,一般使用SUM數(shù)組公式蚓让,可以組合多個(gè)條件,且的關(guān)系使用 *
讥珍,或的關(guān)系使用 +
历极,只有一個(gè)條件時(shí)要加個(gè)常用條件,例如本例 *1
衷佃。
如果在增加一個(gè)條件趟卸,則在此主公式中加入 IF(($B$1:$B$20="A")*($C$1:$C$20="B"),ROW($B$1:$B$20))
, 然后相應(yīng)地在 (SUM(($B$1:$B$20="A")*1)<ROW(1:1)
中加入相應(yīng)的判斷條件
(5)最終公式為:
=IF(SUM(($B$1:$B$20="A")*1)<ROW(1:1),"",INDEX($A$1:$A$20,SMALL(x,ROW(1:1))))
-
返回重復(fù)次數(shù)最多的值
Excel數(shù)組公式
解題步驟:
(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è)數(shù)組,用于符合條件的行的行號(hào),也就是G列所示的值,為了方便可以將其定義為名稱 x
锄列。
(2)使用 INDEX($C$1:$C$20,SMALL(x,ROW(1:1)))
图云,把C列中的內(nèi)容取出來。
(3)為了不出現(xiàn)錯(cuò)誤值邻邮,可以使用 IF(COUNTIF($B$1:$B$20,$B$1:$B$20)=MAX(COUNTIF($B$1:$B$20,$B$1:$B$20)),1)
得到另外一個(gè)數(shù)組竣况,用于符合條件的行的計(jì)數(shù),將其定義為名稱y筒严。然后使用 SUM(y)<ROW(1:1)
作為判斷條件丹泉。
(4)最終公式為
=IF(SUM(y)<ROW(1:1),"",INDEX($C$1:$C$20,SMALL(x,ROW(1:1))))
- 按照重復(fù)次數(shù)的大小列示內(nèi)容
解題步驟:
(1)首先得到不重復(fù)單元格所在的行號(hào)數(shù)組:
IF(MATCH($B$1:$B$20,$B$1:$B$20,0)=ROW($B$1:$B$20),ROW($B$1:$B$20))
如E列所示。
(2)然后得到不重復(fù)單元格的重復(fù)次數(shù)數(shù)組:
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)為了進(jìn)行排序的同時(shí)又得到行號(hào)鸭蛙,所以綜合E列和F列的數(shù)據(jù)摹恨,使用如下:
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)
這樣整數(shù)部分是重復(fù)次數(shù),小數(shù)部分是行號(hào)规惰。
如G列所示睬塌,這個(gè)數(shù)組符合我們的使用要求了,將其定義為名稱 x
歇万。
(4)使用LARGE函數(shù)進(jìn)行排序揩晴。LARGE(x,ROW(1:1))
,這是使用數(shù)組得到一個(gè)單值贪磺。
(5)然后使用MOD函數(shù)取出行號(hào)硫兰。MOD(LARGE(x,ROW(1:1))*1000,1000)
(6)然后在使用INDEX函數(shù)取出對(duì)應(yīng)行的記錄。INDEX($B$1:$B$20,MOD(LARGE(x,ROW(1:1))*1000,1000))
(7)最后屏蔽錯(cuò)誤值寒锚,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))
作為判斷條件, 這個(gè)SUM的意思就是說區(qū)域內(nèi)去重后的單元格的個(gè)數(shù)(假設(shè)重復(fù)的單元格a的個(gè)數(shù)n,n個(gè)(n/1)相加最后變成1)劫映。
- 返回區(qū)域內(nèi)符合條件的值
解題步驟:
(1)首先使用 IF($A$2:$H$12=1,ROW($A$2:$H$12)*10000+COLUMN($A$2:$H$12))
找出符合條件的單元格行號(hào)和列號(hào)數(shù)組,這是一個(gè)2維數(shù)組刹前。將其定義為名稱 x
(2)如果想使用INDEX函數(shù)就需要找出相關(guān)的參數(shù)來泳赋,即INDEX(數(shù)據(jù)區(qū),行數(shù)喇喉,列數(shù))
祖今。使用INT(SMALL(x,ROW(1:1))/10000)
獲得行號(hào), MOD(SMALL(x,ROW(1:1)),10000)
獲得列號(hào)。
(3)最后使用INDEX獲得結(jié)果拣技,此公式是姓名列的公式(其中Column()-17是根據(jù)公式所在列設(shè)置的) INDEX($A$1:$H$12,INT(SMALL(x,ROW(1:1))/10000),MOD(SMALL(x,ROW(1:1)),10000)+COLUMN()-17)
(4)最后就是屏蔽錯(cuò)誤值的問題千诬。使用IF(SUM(IF($A$2:$H$12=1,1))<ROW(1:1),"","原公式")
-
按順序返回不重復(fù)值
Excel數(shù)組公式 - supershll - 記憶里
解題步驟:
(1)使用MATCH函數(shù)獲取不重復(fù)行的行號(hào)和值的數(shù)組,將其定義為名稱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函數(shù):
SMALL(MOD(SMALL(x),{1;2;3}),100),ROW(1:1))
- 返回?cái)?shù)字中不重復(fù)的前3位數(shù)徐绑。
解題步驟:
(1)使用 ROW(INDIRECT("1:"&LEN(A1*B1)))
求出乘積結(jié)果的位數(shù)序號(hào)數(shù)組,如F列所示莫辨,定義為名稱 x
(2)使用 MID(A1*B1,x,1)
把乘積的結(jié)果按照原有順序組成內(nèi)存數(shù)組,如G列所示傲茄,定義為名稱 y
(3)然后使用MATCH函數(shù)獲取不重復(fù)行的行號(hào)和值的數(shù)組毅访,定義為名稱 m
,如J列所示 IF(MATCH(y,y,0)=x,x*100+y)
(4)使用SMALL函數(shù)烫幕,SMALL(MOD(SMALL(m),{1;2;3}),ROW(1:1))
俺抽,如M列所示,這是由數(shù)組得到的單值
(5)將結(jié)果串起來 TEXT(SUM(SMALL(MOD(SMALL(m),{1;2;3}),{1;2;3})*10^{2,1,0}),"000")
再次使用數(shù)組得到一個(gè)單值。
- 總結(jié):使用數(shù)組公式较曼,一定要時(shí)刻明白磷斧,何時(shí)結(jié)果是數(shù)組,何時(shí)結(jié)果是單值捷犹。然后再根據(jù)結(jié)果參與計(jì)算弛饭,例如送數(shù)組中取出單值或把單值組合成數(shù)組