Excel中有一類稱作數組公式的公式,有點難以理解,但很強大,能夠完成很多不可思議的任務。
然而,要想精通并熟練運用數組公式,需要大量的練習。本文只是簡單地介紹數組公式,讓感興趣的朋友對其有所了解,為進一步的研究和應用打下基礎。
為什么要學習和使用數組公式
既然數組公式比較復雜且難于理解,那為什么還要學習和使用數組公式呢?
使用數組公式,可以使Excel完成我們認為不可能的任務,或者說要使用VBA才能完成的任務,并且在有些情形下,數組公式可能是一個非常有效的解決方案。當然,好奇心也會驅使我們想要學習進階去創建更高級的公式,并且在學會數組公式的基本使用后想要創建更有效的數組公式。在掌握數組公式后,在面對創建Excel解決方案時又多了一份新的武器。我想,這可能是想要學習數組公式的一些原因。
在某些情形下,除非使用VBA,使用數組公式可能是實現目的的唯一辦法。在使用普通的公式時,我們可能需要輔助列或一些中間步驟,然而,數組公式可以提供一次性的解決方案,省掉中間步驟。當然,高級篩選、數據透視表、以及新增的一些數組函數能夠解決使用數組公式實現的任務,但是當輸入發生變化時它們不能自動更新或者有局限,然而數組公式能夠立即更新,這是其一大優勢。
我們可以使用數組公式來判斷數據是否與指定區域中的數據相匹配,可以統計單元格區域中不重復值的數量,可以提取單元格區域中的不重復數據,將列數據轉換為行數據,…,等等。
什么是數組公式
在認識數組公式之前,先看看通常對于下圖1所示的工作表求總銷售額的過程。
圖7
這個數組公式使用IF函數來測試多個單元格。比較單元格區域B2:B9中的數值是否大于60,返回一個包含布爾值的數組{TRUE;TRUE;TRUE;FALSE;TRUE;FALSE;TRUE;FALSE},然后IF函數根據該數組中的值,如果為TRUE則返回B2:B9中的值,為FALSE則返回FALSE。擴展后的公式如下:
=AVERAGE(IF({TRUE;TRUE;TRUE;FALSE;TRUE;FALSE;TRUE;FALSE},{89;92;78;56;88;58;95;55},{FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE}))
注意,在原公式最后的FALSE被擴展成一個與前面數組相匹配的適合大小的數組。
在IF函數測試完成后,得到下面的中間結果:
=AVERAGE({89;92;78;FALSE;88;FALSE;95;FALSE})
AVERAGE函數忽略布爾值(TRUE或FALSE),僅對數值求平均值。
示例2:計算排名前3的學生成績之和
仍以圖7所示的工作表為例,要求前3名的學生成績之和。
可以使用數組公式:
=SUM(LARGE(B2:B9,ROW(1:3)))
其中,ROW(1:3)返回數組{1;2;3}。LARGE函數依次取單元格區域B2:B9中的最大值、第2大及第3大值,返回數組{95;92;89},然后將其作為SUM函數的參數求和。
示例3:計算數值單元格中各數字之和
在單元格A1中的數值為12345,要通過公式得出1+2+3+4+5的值。
可以使用數組公式:
=SUM(1*MID(A1,ROW(INDIRECT(“1:”& LEN(A1))),1))
LEN函數計算單元格A1中字符的長度,因此上面的公式變為:
=SUM(1*MID(A1,ROW(INDIRECT(“1:6”)),1))
INDIRECT函數返回對第1至6行的引用:
=SUM(1*MID(A1,ROW(1:6),1))
然后擴展成為:
=SUM(1*MID(A1,{1;2;3;4;5;6},1))
MID函數依次取單元格A1中的字符,每次1個:
=SUM(1*{“1”;”2”;”3”;”4”;”5”;”6”})
將1與數字文本相乘將其轉換為數字:
=SUM({1;2;3;4;5;6})
最后,SUM函數對數字數組求和。