Article

【Excel】UNIQUE・SORT・FILTER関数を組み合わせて重複なしの動的リストを作る方法

この記事で分かること

SORT、UNIQUE、FILTER関数を組み合わせると、元データから重複のない並べ替え済みリストを自動作成できます。数式の組み立て手順、エラー対策、入力規則のドロップダウンとの連携方法を解説します。

SORT、UNIQUE、FILTER の3つの関数をネストすると、元データから重複なし・並べ替え済みのリストを1つの数式で作れます。データをテーブル化しておけば、行を追加してもリストが自動で更新されます。

この記事では、3つの関数を内側から順に組み立てる手順と、エラー対策、入力規則のドロップダウンとの連携方法を解説します。

この記事で使う UNIQUE、SORT、FILTER 関数は Microsoft 365 または Excel 2021 以降で利用できます。Excel 2019 以前では使用できません。

完成イメージ — 元データから動的リストを作る

左側の売上データ(C列:商品名)から、右側のG列に重複なし・アイウエオ順の商品名リストが自動生成されています。

SORT(UNIQUE(FILTER()))で商品名の重複なしリストを作成した完成画面。数式バーに数式が表示され、G列にキーボード、ノートPC、ヘッドセット、マウス、モニターがソート済みで並んでいる

G2セルに入っている数式はこれだけです。

=SORT(UNIQUE(FILTER(C2:C16,C2:C16<>"")))

この数式を使えば手作業でリストを作り直す必要がなくなります。さらにデータをテーブル化すれば、行を追加したときにもリストが自動で更新されます。次の章で、この数式を内側から順に組み立てていきます。

数式を内側から組み立てる

完成形の数式は3つの関数がネスト(入れ子)になっています。一番内側の FILTER から順に組み立てると、各関数の役割がわかりやすくなります。

ステップ1 — FILTER で空白以外を取り出す

まず FILTER 関数で、商品名(C列)が空白でない行だけを取り出します。

=FILTER(C2:C16,C2:C16<>"")
FILTER関数の結果。数式バーに=FILTER(C2:C16,C2:C16<>)が表示され、G列に15件の商品名が重複ありのまま表示されている” class=”wp-image-32181″/></a></figure><p>FILTER の構文は <code>=FILTER(配列, 条件, [一致なしの場合])</code> です。ここでは C2:C16 の中から空白でないセルを抽出しています。結果は15件で、重複もそのまま残っています。</p><h3 class=ステップ2 — UNIQUE で重複を除く

次に、FILTER の外側を UNIQUE で囲み、重複する商品名を除去します。

=UNIQUE(FILTER(C2:C16,C2:C16<>""))
UNIQUE(FILTER())の結果。G列に5件の商品名が重複なしで表示されているが、まだ並べ替えされていない

15件あった商品名が、重複を除いた5件(ノートPC、マウス、モニター、キーボード、ヘッドセット)になりました。ただし、並び順はまだ元データの出現順のままです。

ステップ3 — SORT で並べ替えて完成

最後に、一番外側を SORT で囲むと昇順(アイウエオ順)に並べ替えられます。

=SORT(UNIQUE(FILTER(C2:C16,C2:C16<>"")))

これで完成です。キーボード → ノートPC → ヘッドセット → マウス → モニター の順に整列されたリストが得られます。

逆順(五十音の降順)にしたい場合は、SORT の第3引数に -1 を指定します。

=SORT(UNIQUE(FILTER(C2:C16,C2:C16<>"")),,  -1)

テーブルにすれば行の追加に自動追従する

ここまでの数式は C2:C16 のように範囲が固定されています。この場合、17行目以降にデータを追加しても数式の結果には反映されません。

行の追加に自動で追従させるには、元データをテーブルに変換して構造化参照を使います。

テーブルへの変換手順

  1. 元データ内の任意のセルを選択する
  2. Ctrl + T(または [挿入]→[テーブル])を押す
  3. 「先頭行をテーブルの見出しとして使用する」にチェックを入れて OK

テーブルに変換すると、列名で範囲を指定できるようになります。テーブル名が「SalesData」なら、完成形の数式は次のようになります。

=SORT(UNIQUE(FILTER(SalesData[商品名],SalesData[商品名]<>"")))

この数式なら、テーブルの末尾に行を追加するだけでリストにも自動で反映されます。

テーブル名はデフォルトで「テーブル1」などになります。名前を変えたいときは、テーブル内のセルを選択し [テーブル デザイン]タブの「テーブル名」で変更できます。

特定の条件で絞り込む

FILTER の条件を変えると、特定の担当者が扱った商品だけを取り出せます。

たとえば、担当者が「田中」の商品名だけを重複なしで取り出すには次のように書きます。

=SORT(UNIQUE(FILTER(C2:C16,B2:B16="田中")))

複数の条件を組み合わせることもできます。

AND条件(両方満たす):条件どうしを * で掛けます。

=SORT(UNIQUE(FILTER(C2:C16,(B2:B16="田中")*(E2:E16>50000))))

OR条件(いずれか満たす):条件どうしを + で足します。

=SORT(UNIQUE(FILTER(C2:C16,(B2:B16="田中")+(B2:B16="佐藤"))))

該当データがないときのエラー対策

FILTER の条件に合うデータが1件もないと、#CALC! エラーが表示されます。

これを防ぐには、FILTER の第3引数(一致なしの場合の戻り値)を指定します。

=SORT(UNIQUE(FILTER(C2:C16,B2:B16="該当なし","データなし")))

条件に合う行が0件のとき、#CALC! の代わりに「データなし」と表示されます。IFERROR で囲む方法もありますが、FILTER の第3引数を使う方が数式が短く、意図も明確です。

ドロップダウンリストと連携する

この動的リストは、入力規則のドロップダウンリストのソースとしても使えます。テーブルと組み合わせれば、元データに行を追加するだけでドロップダウンの選択肢も自動更新されます。

設定手順は次のとおりです。

  1. 任意のセル(例:G2)にテーブルの構造化参照を使った数式を入力する(例:=SORT(UNIQUE(FILTER(SalesData[商品名],SalesData[商品名]<>"")))
  2. ドロップダウンを設定したいセルを選択する
  3. [データ]タブ → [データの入力規則]を開く
  4. 「入力値の種類」で「リスト」を選ぶ
  5. 「元の値」に次のように入力する
=$G$2#

末尾の #スピル範囲演算子と呼ばれ、G2セルから下方向にスピル(展開)している範囲全体を参照します。G2セルの数式でテーブルの構造化参照を使っていれば、元データに商品名を追加するだけでドロップダウンの選択肢にも自動で反映されます。

使うときの注意点

UNIQUE だけだと空セルが「0」になる

FILTER を省略して =UNIQUE(C2:C17) のように書くと、範囲内の空セルが値「0」として結果に含まれます。

UNIQUEだけを使った場合に空セルが0と表示される問題の比較画面

これを防ぐために、UNIQUE の内側を FILTER(範囲, 範囲<>"") で囲んで空白セルを先に除外します。この記事の完成形の数式はすでにこの対策が入っています。

#SPILL! エラーが出たら下のセルを確認する

動的配列関数はセルの下方向に結果を展開(スピル)します。展開先にデータが入っていると #SPILL! エラーになります。数式セルの下に十分な空きを確保してください。

Excel 2019 以前では使えない

UNIQUE、SORT、FILTER はいずれも動的配列関数です。Microsoft 365 または Excel 2021 以降が必要です。Excel 2019 以前で開くとエラーになります。

まとめ

  • SORT(UNIQUE(FILTER(...))) で「条件抽出 → 重複除去 → 並べ替え」を1数式に集約できる
  • 行の追加に自動追従させるには、元データをテーブルに変換して構造化参照を使う
  • 空白セルは FILTER(範囲, 範囲<>"") で先に除外する
  • 該当データなしの #CALC! エラーは FILTER の第3引数で対処する
  • 入力規則のドロップダウンソースに =$G$2#(スピル範囲参照)を指定すると、選択肢が自動更新される

Next Read

このあと読む記事

今の内容に近い記事から、次の1本と補助記事を続けて見つけられるようにしています。

Keep Exploring

このテーマをさらに探す

同じテーマの入口記事と更新記事を、一覧の形でまとめています。

コメント