從簡單範例談談Excel的陣列公式(6)

沒有MAXIFS也沒關係,使用陣列公式依然可行

大家頗為熟悉的單一條件式加總函數SUMIF以及後來在Excel 2007以後才新增的多重條件式加總函數SUMIFS,都是職場上大家經常使用的函數。例如:下圖的資料記錄著60筆咖啡豆交易,三個資料欄位分別為:訂單日期、品名與銷售量。也針對了儲存格範圍事先進行了命名,儲存格範圍A2:A61命名為「訂單日期」;B2:B61命名為「品名」;C2:C61命名為「銷售量」。
 

因此,若要計算「古巴藍山」咖啡(儲存格F2)的銷售量,則以下的單一條件加總函數,將可輕鬆達陣!

=SUMIF(品名,F2,銷售量)

如果是想要知道2019/2/1以前,「古巴藍山」咖啡(儲存格F2)的銷售量,則以下的雙重條件加總函數,也不難達成:

=SUMIFS(銷售量,訂單日期, "<2019/2/1",品名,F2)

要特別注意的是,SUMIF函數的語法是:

=SUMIF(比對準則範圍, 比對準則, 想要加總的範圍)

此SUMIF函數裡只要三個參數,其中,想要加總的數據資料範圍是第3個參數。

而SUMIFS函數的語法是:

=SUMIF(想要加總的範圍, 比對準則範圍1, 比對準則1, 比對準則範圍2, 比對準則2,….)

此SUMIFS函數裡至少要三個以上的參數,其中,想要加總的數據資料範圍是第1個參數,而各組比對準則範圍與比對準則,則分別描述在後。

再舉一個實例,如果是想要知道2019/2/16~2019/3/15這段期間,「哥倫比亞」咖啡(儲存格F2)的銷售量,要如何計算呢?以下的範例設計便是描述著合乎指定開始日期(G5)「2019/1/16」與指定結束日期(G6) 「2019/2/15」和指定產品(G7)「哥倫比亞」等三個準則下,針對銷售量欄位進行加總的運算:

=SUMIFS(銷售量,訂單日期,">="&G5,訂單日期,"<="&G6,品名,G7)

在日期性資料的邏輯描述上,是使用大於、小於、等於的符號字串,串接儲存格位址,例如:

“>=” & G5 以及“<=” & G6

當儲存格G5與G6的內容有所變動,猶如變數的值有了變化,整個關係判斷的比對也就調整了。

想想,有了SUMIFS,也就可以不需要SUMIF函數了嘛!兩者差別只是在於範圍準則描述的組數多寡,SUMIFS自然也可以做到SUMIF,但是SUMIF就做不到SUMIFS了。當然,重要的是,Excel 2007的版本以後才支援SUMIFS函數喔!而類似語法與功能也反映在AVERAGEIF、AVERAGEIFS、COUNTIF、COUNTIFS等等條件式平均值的計算,或者條件式計數的函數,在實務的工作領域裡,這些函數的重要性也都不遑多讓喔!但是,關於條件式最大值與最小值的相關函數,一直到Excel 2019才發現其蹤跡。例如:透過MAXIFS函數,可以得知古巴藍山咖啡豆的最大銷售量為何:

=MAXIFS(銷售量,品名,F2)

其語法為:

=MAXIFS(最大值範圍, 比對準則範圍1, 比對準則1, 比對準則範圍2, 比對準則2,…)

但是實在無奈!若不是使用的Excel版本並不是最新版的Excel 2019或是Office 365呢?Excel 2016以前並不支援MAXIFS函數,那麼,使用舊版本的Excel開啟含有MAXIFS函數的活頁簿檔時,會發生什麼事呢?例如:您目前所使用的Excel應用程式版本是Excel 2013,而所開啟的活頁簿檔案是Excel 2019版本所編輯並含有較新的MAXIFS函數,由於在Excel 2013裡並不支援此函數,因此,開啟後這個含有MAXIFS函數的儲存格公式,仍可以在工作表上顯示著運算結果,但是,資料編輯列上顯示著:

=_xlfn.MAXIFS(銷售量,品名,F2)

所顯示的_xlfn.這個字眼,正代表著所開啟的Excel活頁簿檔案裡包含了您目前正在執行的Excel應用程式版本並不支援的函數。只要不修改與編輯此儲存格,仍能順利顯示公式的運算結果,只是一旦企圖編輯此儲存格,最後將變成「#NAME?」的顯示了:
 

當然,我們並不鼓吹一定非得使用最新版本的Excel不可,尤其是公司、單位裡的應用程式版本尚未統一與普及時。其實,使用IF函數與MAX函數的搭配,要達到MAXIFS的功效也不難喔!例如:以陣列的形式來看待以下的函數寫法:

=IF(B2:B61="古巴藍山",C2:C61,"")

正意味著:
若B2="古巴藍山"則傳回C2否則傳回空字串
若B3="古巴藍山"則傳回C3否則傳回空字串
若B4="古巴藍山"則傳回C4否則傳回空字串
….
直到
若B61="古巴藍山"則傳回C61否則傳回空字串

因此,

=IF(B2:B61="古巴藍山",C2:C61,"")

傳回的便是:
{239,,,,,,,11,,,,425,,,,,626,38,,607,,,915,727,,,,,478,,,,,,,,,607,,,,,,,,,,955,786,,,,,557,,,,,,,}

或者,省略了IF條件裡不成立時為空字串的設定,讓不成立時便傳回False邏輯值,因此,可以改寫為更簡潔的:

=IF(B2:B61="古巴藍山",C2:C61)

如此,傳回的陣列便是:
{239,False,False,False,False,False,False,11,False,False,False,425,False,False,False,False,626,38,False,607,False,False,915,727,False,False,False,False,478,False,False,False,False,False,False,False,False,607,False,False,False,False,False,False,False,False,False,955,786,False,False,False,False,557,False,False,False,False,False,False}

若針對上述陣列進行MAX運算,就可以傳回該陣列裡的最大值,不就是「古巴藍山」咖啡的最大銷售量了嗎?因此,在儲存格裡輸入:

=MAX(IF(B2:B61="古巴藍山",C2:C61))

並按下Ctrl+Shift+Enter按鍵,以陣列的形式來完成這個陣列公式,就可以順利達成原本MAXIFS的效果了~

同樣的道理,使用MIN與IF函數的組合,藉由陣列公式的原理,加上事先已經針對範圍名稱做了相關的命名,以下的陣列公式,就可以傳回古巴藍山的最低銷售量了:

{=MIN(IF(品名=F2,銷售量))}

因此,要了解每一種咖啡豆產品的最大銷售量與最小銷售量,那還有什麼問題呢!

註:此Excel陣列函數系列文章內文實作活頁簿檔案載點