動態陣列參照函數(6) - SORTBY

Excel 365新增動態參照函數SORTBY,多欄排序關鍵的神器。

SORTBY也是Excel 365新增的動態陣列參照函數,如同另一篇文章所提及的SORT函數,都是隸屬於可傳回資料排序結果的函數。微軟官方的說法是透過SORTBY函數可以將某個資料範圍或陣列裡的值,視為升冪或降冪的排序依據,對於相對應的另一個範圍或陣列進行排序。簡單的說就是根據B欄裡的順序,對A欄進行排序。例如:針對[成績]欄位由大到小的順序,對[姓名]欄位進行排並僅傳回[姓名]欄位的排序結果,甚至還具備了多欄位排序關鍵的特性。若對於這些說明還是有些模糊不清,稍後就透過實際範例的演練,並詳細解說與比較SORT與SORTBY的異同,相信一定會讓您有所領悟、一目了然。

語法:

=SORTBY (array, by_array, [sort_order], [array/order], ...)

參數: 

  • array - 要進行排序的資料範圍或陣列。
  • by_array – 作為排序依據的資料範圍或陣列。
  • [sort_order] – 排序的順序依據,1代表升冪;-1代表降冪。若未表明,此參數的預設值為1,進行升冪排序。
  • [array/order] – 額外的排序依據欄位與指定的排序的順序依據。

範例:

以下的實作範例是一個名為「年資表」的資料表格,包含了「姓名」、「英文名」、「部門」以及「年資」等欄位。就以此資料來練習SORTBY函數的運用。

單欄排序的建立

猶記前一篇文章[動態陣列參照函數 – SORT]所介紹的SORT函數,其功能也是對資料來源進行排序的作業。是否也可以依樣畫葫蘆,反映在SORTBY函數上呢?例如:我們若想根據英文名的字母順序,在儲存格H3建立排序結果,則可以在儲存格H3裡輸入以下的SORT函數:

=SORT(年資表,2)

若是改以SORTBY函數,輸入以下的函數:

=SORTBY(年資表,2)

怎麼做不出來呢?

其實,比較一下SORT與SORTBY這兩個函數裡的參數之差異:

=SORT(array, [sort_index], [sort_order], [by_col])

=SORTBY(array, by_array, [sort_order], [array/order], ...)

兩函數的第一個參數array指的都是要進行排序的資料範圍或陣列或資料表格。但第二個參數就不一樣了,SORT函數裡第二個參數是[sort_index],這是一個索引值,用來表示要作為排序關鍵的欄索引,也就是要以資料來源由左至右的第幾個欄位作為排序的依據,因此,此參數是一個整數形式的資訊。所以,我們輸入=SORT(年資表,2)便表示要根據「年資表」裡的第「2」欄(也就是英文名欄位)作為排序依據。而SORTBY函數就不太一樣了,它的第二個參數是by_array,這是一個資料範圍或陣列或整個欄位名稱的設定,也就是必須在此明確的表示排序關鍵到底是哪一個欄位,並不是整數形式的資訊,是要明確指出排序的關鍵欄位,所以,此參數是資料範圍的位址或陣列或整個欄位名稱。因此,若我們輸入了=SORTBY(年資表,2) 就會顯示錯誤訊息(#VALUE!)。若是輸入以下SORTBY函數,就沒問題了!

=SORTBY(年資表,年資表[英文名])

多欄排序的建立

SORT函數的第三個參數是[sort_order]而SORTBY函數的第三個參數也是 [sort_order],用法一致功能也一模一樣,都是用來設定排序的順序依據,1代表升冪;-1代表降冪。不過,SORT函數的第四個參數[by_col]是決定資料排序是根據列(By Row)還是根據欄(By Column)的方向來整排序資料,但是SORTBY函數就沒有這個參數值的設定。不過,SORTBY可貴的價值就在於其第四個參數[array/order]是一組一組的額外排序欄位關鍵之定義。意即同一資料來源裡若有兩二個、第三個、…要考量的排序依據,都可以將其陣列或欄位名稱以及指定的排列順序描述在此。簡單的說,就是SORTBY具備了多欄排序關鍵的設定,可以設定Primary Sort Key、Secondary Sort Key、Third Sort Key、….。這方面的運用與實作,就讓我們繼續看下去囉!
以下的多欄排序需求是先根據「部門」欄位由小到大進行排序(Primary Sort Key),然後,再依據「年資」欄位由大到小進行排序(Secondary Sort Key),因此,我們可以撰寫以下的SORTBY函數:

=SORTBY(年資表,年資表[部門],1,年資表[年資],-1)

上述SORTBY函數參數說明如下:

  • 針對「年資表」進行排序並輸出結果(第一個參數) array
  • 主要排序關鍵為「資料表[部門]」欄位(第二個參數) by_array
  • 主要排序關鍵的排序順序為「1」,即升冪之意(第三個參數) [sort_order]
  • 次要排序關鍵為「資料表[年資]」欄位(第四個參數) [array/]
  • 次要排序關鍵的排序順序為「-1」,即降升冪之意(第五個參數) [/order]。

此外,如果排序的輸出結果,並不需要資料來源的每一個欄位,SORTBY函數也是可以輕鬆達陣的喔!例如:若只是想要列出資深員工名單,那麼可以撰寫以下的SORTBY函數:

=SORTBY(年資表[姓名],年資表[年資],-1)

第一個參數array僅撰寫成:

年資表[姓名]

表示要進行排序並輸出的資料範圍或陣列,僅是「年資表」裡的「姓名」資料欄位。

而第二個參數by_array撰寫為:

年資表[年資]

表示「姓名」資料欄位的排列順序依據,是根據此參數「年資表」裡的「年資」資料欄位的大小來決定。

第三個參數[sort_order] 設定為-1,即表示「年資」排序的順序依據是遞減(降冪)排序。

因此,便可以解讀為根據年資表[年資]欄位裡的數值由大到小的順序,重新排列年資表[姓名]欄位內容的順序。

因此,輸出的結果僅是姓名欄位,但根據年資多寡由大到小排列,第一個姓名便是最資深的員工(施玉毅)、最後一個姓名便是最資淺的員工(賴韻屏)。

自訂欄位組合陣列

如同前面兩個實作所述,排序的輸出結果除了可以是整個資料來源每一個欄位的輸出外,也可以是某一個指定欄位的排序輸出,甚至,還可以透過CHOOSE函數的輔助,重新組合資料來源裡的資料欄位,形成一個客製化的多欄位陣列,再針對這個多欄位陣列進行SORTBY函數的應用。例如:

=CHOOSE({3,1,4}, 年資表[姓名],年資表[英文名],年資表[部門],年資表[年資])

先聊聊CHOOSE函數,其基本語法是:

=CHOOSE(index_num, value1, [value2], ...)

第一個參數index_num通常是整數值,第二個參數以後是可自訂最多254個的值清單。CHOOSE函數便是以index_num為索引值,傳回某一個值清單內容。譬如:當第一個參數index_num的值為1時,可傳回value1;若index_num的值為2時,可傳回value2;若index_num的值為3時,可傳回value3,依此類推。根據第一個參數index_num的值來決定要傳回後續參數清單裡的某一個值。所以,若建立一個CHOOSE函數為:

=CHOOSE(A1,"VISA","Master","JCB","AE","銀聯")

則當儲存格A1的內容為2值,此函數的結果便是"Master";若儲存格A1的內容為5值,此函數的結果便是"銀聯卡"。

但這只是CHOOSE的簡單用法,如果將CHOOSE函數第一個參數index_num為設定為陣列,而不只是一個整數值,例如:

{3,1,4}

修改一下上述的CHOOSE函數:

=CHOOSE({3,1,4}, "VISA","Master","JCB","AE","銀聯")

則表示會執行三次的CHOOSE函數,首次執行CHOOSE時將3代入index_num,取得值清單裡的第3個值("JCB");再度執行CHOOSE時將1代入index_num,取得值清單裡的第1個值("VISA");最後一次執行CHOOSE時將4代入index_num,取得值清單裡的第4個值("AE"),而這三次取得的結果值形成一個陣列輸出:

實驗看看囉!事先選取B8:D9,並直接在B9輸入:

=CHOOSE({3,1,4}, "VISA","Master","JCB","AE","銀聯")

按下Ctrl + Shift + Enter 複合按鍵後便自動建立了包含一對大括號的陣列公式:

{=CHOOSE({3,1,4}, "VISA","Master","JCB","AE","銀聯")}

而輸出結果就在儲存格範圍B8:D9裡。

根據這樣的原理,若CHOOSE函數裡的值清單並非單一的字串,而是資來源裡的資料欄位範圍或陣列,例如:

=CHOOSE({3,1,4},年資表[姓名],年資表[英文名],年資表[部門],年資表[年資])

那麼上述的CHOOSE函數便是組合了三個資料欄位的新陣列,陣列內容由左至右分別為年資表[部門]、年資表[姓名]、年資表[年資]。尤其,在建立這個組合至組合陣列時,若使用的是Excel 365,因為具備了動態陣列參照的技術,因此,上述的CHOOSE函數僅需輸入在單一儲存格即可,如下圖所示的儲存格AD3:

有了CHOOSE函數的協助,只要改變了第一個參數{3,1,4}裡的數字與順序,不就可以建立不同目的與需求的欄位組合陣列了嗎!再透過SORTBY函數針對自訂的欄位組合陣列進行所需的排序,如此客製化的排序輸出就更完美了!例如:針對上述的組合陣列進行雙欄排序,主要排序關鍵為「年資表[部門]」遞增順序;次要排序關鍵為「年資表[年資]」遞減順序,則可撰寫以下函數:

=SORTBY(CHOOSE({3,1,4}, 年資表[姓名],年資表[英文名],年資表[部門],年資表[年資]),年資表[部門],1,年資表[年資],-1)

註:此Excel文章內實作活頁簿檔案下載