(Excel)SORT関数で任意の順番に並べ替える方法

 ExcelのSORT関数で、任意の順番を指定して並べ替える方法についてです。
 SORTBY関数を使うのが早道ですがSORT関数の例と共に違いを紹介します。

問題となるケース

 次の画像の左側には2列(B,C列)からなる表があります。
 これをB列の文字を基準として、具体的には「春,夏,秋,冬」の順で並ぶようにソートしようとしてE3セルに数式を入力しています。しかし結果は「夏,秋,春,冬」の順となりうまくいきません。

 E3セル

=SORT(B3:C9,1)

 SORT関数では第1引数で対象範囲(表)を、第2引数でソートの基準となる列の番号(この例では対象範囲の左端のB列が「1」)を指定します。第3引数(昇順降順)は省略しているので昇順となります。
 その「昇順」についてですが、漢字等の場合は文字コードの昇順となるので、一般的な読みとか並べ方の慣習とは異なるものとなります。曜日の漢字(月,火,水…)や干支(子,丑,寅…)などでも同様です。



 次の画像ではSORTBY関数を使って並べ替えているものの、結果は同じです。

 E3セル

=SORTBY(B3:C9,B3:B9)

 SORTBY関数の場合は、第2引数でソートの基準となる配列データを指定するのが特徴です(第1,第3引数はSORT関数と同様)。
 SORT関数と比べて、引数指定の仕方が面倒になっただけのように思えますが、これにはメリットがあります。1つは対象となる対象範囲(表)に列の追加や削除があっても基準となる列がズレないこと、そしてもう1つは対象範囲に含まれていない配列をソートの基準に指定できることです。このことが任意の順番で並べ替える場合に有利にはたらきます。

SORTBY関数を使う方法

 以上を踏まえて、まずはSORTBY関数を使う例を紹介します。
 次の画像ではSORTBY関数にXMATCH関数を組み合わせることで「春,夏,秋,冬」の順にソートしています。

 E3セル

=SORTBY(B3:C9,XMATCH(B3:B9,{"春","夏","秋","冬"}))

 第2引数で「XMATCH(B3:B9,{"春","夏","秋","冬"})」という関数を使っていることがポイントです。
 これによりB列の「春,夏,秋,冬」の各文字を「1,2,3,4」に置き換えた配列が得られます。この配列をソート基準とすれば結果的に「春,夏,秋,冬」の順に並ぶというわけです。



 なお、次の画像では参考として、上記の式中のXMATCH関数の部分だけを実行しています。



 上記の例では任意の順番を定めるリストを式中で指定していましたが、次の画像ではシート上にあるE3:E6の範囲を利用(参照)しています。
 結果は上の例と同じです。

 G3セル

=SORTBY(B3:C9,XMATCH(B3:B9,E3:E6))

SORT関数を使う方法

 次の画像では、SORT関数にHSTACK関数やXMATCH関数を組み合わせることで「春,夏,秋,冬」の順にソートしています。

 E3セル

=DROP(
SORT(HSTACK(XMATCH(B3:B9,{"春","夏","秋","冬"}),B3:C9),1),
,1)

 XMATCH関数を使い「春,夏,秋,冬」を「1,2,3,4」に変換した配列(SORTBY関数の例を参照)を取得し、さらにHSTACK関数を使ってその配列を元の表と連結しています。
 そしてSORT関数で1列目(数値)の順に並べ替え、最後にDROP関数で1列目(数値)を削除しています。



 次の画像はHSTACK/XMATCH関数の部分だけ実行した結果です。上記の説明と併せてご確認ください。

 最初の節(問題となるケース)でわかるように、SORT関数はソートの基準となる列が最初から表の中にある場合には引数の指定を簡単に済ませることができます。しかしそうでない場合は取得したいデータとソート基準の配列(数値)の両方を含む表を用意しなければならないので、SORTBY関数より手間が増えてしまうというわけです。



 なお、次の画像ではシート上のE3:E6の範囲を利用(参照)しています。
 上の例よりは簡潔になりますが、やはりSORTBTY関数の方が簡単です。

 G3セル

=DROP(SORT(HSTACK(XMATCH(B3:B9,E3:E6),B3:C9),1),,1)