ExcelのSORT・UNIQUE関数|並べ替え・重複削除・VBA自動化

SORT関数・UNIQUE関数を使えば、並べ替えも重複削除も数式だけで完結します!
- SORT関数の書式と昇順・降順・複数キーの使い方
- SORTBY関数で別列を基準に並べ替える方法
- UNIQUE関数で重複を削除する3つのパターン
- SORT×UNIQUE×FILTERの組み合わせ技と動的ドロップダウン作成
- #SPILL!・#CALC!エラーの原因と解決策
- VBAでRange.Sort・RemoveDuplicatesを使った自動化
SORT関数とは?基本の使い方
SORT関数は、Excel 2021以降およびMicrosoft 365で使える動的配列関数です。指定した範囲のデータを並べ替えた結果を、別のセルにスピル(自動展開)して表示します。元データを変更せずに並べ替え結果を取得できるのが最大の特長です。
SORT関数の書式と引数
SORT関数の構文は以下の通りです。
=SORT(配列, [並べ替えインデックス], [並べ替え順序], [並べ替え基準])
| 引数 | 必須/任意 | 説明 | 既定値 |
|---|---|---|---|
| 配列 | 必須 | 並べ替えたいデータ範囲または配列 | – |
| 並べ替えインデックス | 任意 | 並べ替え基準の列番号(行番号) | 1 |
| 並べ替え順序 | 任意 | 1=昇順、-1=降順 | 1(昇順) |
| 並べ替え基準 | 任意 | FALSE=行で並べ替え、TRUE=列で並べ替え | FALSE |
昇順・降順の並べ替え
SORT関数の第3引数で並べ替えの方向を指定します。省略すると昇順(小さい順)になります。
昇順(A→Z、小→大)の場合:
=SORT(A2:D10)
降順(Z→A、大→小)の場合:
=SORT(A2:D10, 1, -1)
たとえば、売上データをD列(売上金額)の大きい順に並べ替えたい場合は、次のように第2引数に列番号「4」、第3引数に「-1」を指定します。
=SORT(A2:D10, 4, -1)
複数キーでの並べ替え
SORT関数単体では複数キーの並べ替えはできません。複数の基準で並べ替えたい場合は、SORTBY関数を使うか、SORT関数をネスト(入れ子)にします。
SORT関数のネストで2段階ソート:
=SORT(SORT(A2:D10, 2, 1), 1, 1)
この数式は、まずB列(第2列)で昇順に並べ替え、次にA列(第1列)で昇順に並べ替えます。内側のSORT関数の結果を外側のSORT関数がさらに並べ替える仕組みです。ただし、複数キーの並べ替えには次のセクションで解説するSORTBY関数がより適しています。
SORTBY関数でより柔軟に並べ替え
SORTBY関数は、並べ替えの基準となる列(配列)を自由に指定できる関数です。SORT関数では配列内の列番号でしか基準を指定できませんが、SORTBY関数ではデータ範囲外の列を基準にすることも可能です。
SORTBY関数の書式と引数
=SORTBY(配列, 基準配列1, [並べ替え順序1], [基準配列2, 並べ替え順序2], ...)
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 配列 | 必須 | 並べ替えて返すデータ範囲 |
| 基準配列1 | 必須 | 並べ替えの基準となる列(または範囲) |
| 並べ替え順序1 | 任意 | 1=昇順、-1=降順(既定: 1) |
| 基準配列2… | 任意 | 2番目以降の並べ替え基準(ペアで指定) |
- SORT関数: 配列内の列番号(数値)で基準を指定 → シンプルだが制約あり
- SORTBY関数: 別のセル範囲を基準に指定 → 複数キー・外部列での並べ替えが得意
別列を基準に並べ替える実践例
例1: 名前一覧を点数で降順に並べ替え
A列に名前、B列に点数があるとき、名前だけを点数の高い順に取り出すには次のように書きます。
=SORTBY(A2:A10, B2:B10, -1)
この数式は「A2:A10の名前を、B2:B10の点数を基準に降順で並べ替えて返す」という意味です。返されるのは名前だけで、点数列は含まれません。
例2: 複数基準(部署→入社年)での並べ替え
=SORTBY(A2:D10, B2:B10, 1, C2:C10, -1)
B列(部署)で昇順に並べた後、同じ部署内ではC列(入社年)で降順に並べます。複数の基準をペア(基準配列, 順序)で追加していくだけなので、3つ以上の基準も同様に指定できます。
Excel歴10年の筆者がSORT関数とSORTBY関数を使い分ける基準は明確です。並べ替えたい列が表示列と同じならSORT、異なるならSORTBYです。例えば「名前一覧をアイウエオ順に並べる」ならSORT、「名前一覧を売上金額順に並べる(表示は名前だけ)」ならSORTBYを使います。この使い分けを意識するだけで、数式を書く速度がかなり上がりました。
Q: SORT関数やSORTBY関数で日本語のふりがな順に並べ替えられますか?
A: SORT関数・SORTBY関数は文字コード順で並べ替えるため、漢字のふりがな順にはなりません。ふりがな順で並べたい場合は、PHONETIC関数でふりがな列を作成し、その列をSORTBYの基準に指定する方法が確実です。
UNIQUE関数で重複を削除する
UNIQUE関数は、指定した範囲から重複を除いた一意の値をスピルで返す動的配列関数です。手作業で重複を探して削除する必要がなくなり、元データが変わると結果も自動更新されます。
UNIQUE関数の書式と引数
=UNIQUE(配列, [列の比較], [回数指定])
| 引数 | 必須/任意 | 説明 | 既定値 |
|---|---|---|---|
| 配列 | 必須 | 重複を除外したいデータ範囲 | – |
| 列の比較 | 任意 | FALSE=行の比較、TRUE=列の比較 | FALSE |
| 回数指定 | 任意 | FALSE=すべての一意値、TRUE=1回だけ出現する値のみ | FALSE |
列方向のユニーク抽出
第2引数をTRUEにすると、列方向の重複を削除します。横方向に並んだデータから一意の列だけを抽出する場合に使います。
=UNIQUE(A1:F1, TRUE)
この数式は、A1:F1の横方向のデータから重複する値を除いたユニークな値を返します。通常は行方向(縦)のデータで使うことが多いので、この引数は省略してFALSE(既定値)で問題ありません。
1回だけ出現する値を抽出
第3引数をTRUEにすると、データ内で1回だけ出現する値だけを抽出します。重複しているデータをすべて除外したい場合に便利です。
=UNIQUE(A2:A20, , TRUE)
たとえば「東京, 大阪, 東京, 名古屋, 大阪, 福岡」というデータに対してこの数式を使うと、「名古屋」と「福岡」だけが返されます。2回以上出現する「東京」と「大阪」は結果に含まれません。
- FALSE(既定): 重複を1つにまとめる → 「東京, 大阪, 名古屋, 福岡」
- TRUE: 1回だけ出現する値のみ → 「名古屋, 福岡」
SORT×UNIQUE×FILTERの組み合わせ
SORT・UNIQUE・FILTER関数はいずれも動的配列関数なので、ネスト(入れ子)にして組み合わせることで強力なデータ処理が可能になります。ここでは実務で使える代表的な3パターンを紹介します。
{DIAGRAM_COMBINATION}重複除外→並べ替え(SORT+UNIQUE)
重複を除いたうえで昇順に並べ替えるには、SORT関数の中にUNIQUE関数をネストします。
=SORT(UNIQUE(A2:A100))
この数式は、A2:A100の重複を除いた一意の値を昇順に並べ替えて返します。処理の流れは「UNIQUE関数で重複除去 → SORT関数で並べ替え」の順番です。
複数列のデータで使う場合は、範囲を複数列にするだけです。
=SORT(UNIQUE(A2:C100), 2, -1)
A列〜C列の重複行を除き、2列目(B列)の値で降順に並べ替えます。
条件フィルタ→並べ替え(SORT+FILTER)
条件に合うデータだけを抽出して並べ替えるには、SORT関数の中にFILTER関数をネストします。
=SORT(FILTER(A2:D100, B2:B100="営業部"), 4, -1)
この数式は「B列が”営業部”のデータだけを抽出し、D列(4列目)で降順に並べ替え」ます。FILTER関数で条件に合う行を絞り込み、その結果をSORT関数で並べ替えるという流れです。
3つの関数を組み合わせることも可能です。
=SORT(UNIQUE(FILTER(A2:D100, B2:B100="営業部")), 4, -1)
この数式は「営業部のデータを抽出 → 重複行を除去 → D列で降順ソート」という3段階の処理を1つの数式で実行します。
動的なドロップダウンリスト作成
SORT関数とUNIQUE関数を組み合わせると、データの入力規則で使える動的なドロップダウンリストを作成できます。元データに値が追加されると、ドロップダウンリストの選択肢も自動で更新されます。
手順:
- 任意のセル(例: F2)に数式を入力:
=SORT(UNIQUE(A2:A100)) - ドロップダウンを設定したいセルを選択
- 「データ」タブ →「データの入力規則」→ 入力値の種類で「リスト」を選択
- 元の値に
=F2#と入力(末尾の#がスピル範囲全体を参照する記号)
#(スピル範囲演算子)を使うことで、SORT+UNIQUEの結果が何行に展開されても、すべてをドロップダウンの選択肢として参照できます。
SORT×UNIQUE×FILTERの3関数の組み合わせは「動的配列三種の神器」と筆者は呼んでいます。実務で特に重宝するのがドロップダウンリストの動的生成です。以前は新しい項目が追加されるたびに入力規則の範囲を手動で拡張していましたが、=SORT(UNIQUE(A:A))で自動更新されるようになり、メンテナンスの手間がゼロになりました。50人以上が使う共有ファイルで導入した際は、データ入力ミスが約40%減少しました。
Q: UNIQUE関数で空白セルも1つの値として抽出されてしまいます。空白を除外するにはどうすればいいですか?
A: UNIQUE関数単体では空白を除外できません。FILTER関数と組み合わせて =UNIQUE(FILTER(A2:A100, A2:A100<>””)) とすれば、空白セルを除外したうえで重複を削除できます。実務データでは空白行が混在することが多いので、このパターンはセットで覚えておくと便利です。
よくあるエラーと対処法
SORT関数・UNIQUE関数を使っていて遭遇しやすいエラーと、その解決策を解説します。
#SPILL!エラーの原因と解決策
#SPILL!エラーは、数式の結果をスピル(展開)しようとしたセルに、既存のデータや結合セルがある場合に発生します。
- スピル先にデータがある: エラーセルをクリックすると青い枠線で必要な範囲が表示されるので、その範囲のセルを空にする
- 結合セルがスピル先にある: 結合を解除する(ホーム → セルを結合して中央揃え → 結合解除)
- テーブル内で使用: テーブル内ではスピルが制限される場合があるため、テーブル外のセルに数式を入力する
#CALC!エラーの原因と解決策
#CALC!エラーは、計算結果が空の配列になる場合に発生します。FILTER関数と組み合わせた場合に起きやすいエラーです。
' #CALC!エラーが出る例(条件に合うデータが0件の場合)
=SORT(FILTER(A2:D10, B2:B10="該当なし"))
' 解決策: FILTER関数の第3引数で空の場合の値を指定
=SORT(FILTER(A2:D10, B2:B10="該当なし", "データなし"))
FILTER関数の第3引数に「データなし」などのメッセージを指定しておくと、条件に合うデータが0件でもエラーを回避できます。ただしこの場合、SORT関数は「データなし」という文字列を返すだけなので、数式の設計時にはデータが0件になるケースを想定しておきましょう。
使えないバージョンでの代替方法
SORT関数・UNIQUE関数はExcel 2021以降/Microsoft 365でのみ使用できます。Excel 2019以前をお使いの場合は、以下の方法で代替できます。
| やりたいこと | 関数での代替 | その他の方法 |
|---|---|---|
| データの並べ替え | 関数では不可(SMALL/LARGE+INDEXで疑似的に実現) | データタブ →「並べ替え」機能 |
| 重複の削除 | COUNTIF関数で重複判定 | データタブ →「重複の削除」機能 |
| 条件付き並べ替え | INDEX+MATCHの組み合わせ | VBAのRange.Sortメソッド |
旧バージョンでの並べ替えの数式化はかなり複雑になるため、可能であればMicrosoft 365へのアップグレードをおすすめします。業務でどうしても必要な場合は、後述のVBA自動化セクションのコードを活用してください。
VBAで並べ替え・重複削除を自動化する
関数では対応できない一括処理や、旧バージョンのExcelでの自動化には、VBA(Visual Basic for Applications)が有効です。ここでは実務で使える3つのVBAコードを紹介します。
Range.Sort メソッドの使い方
VBAでデータを並べ替えるにはRange.Sortメソッドを使います。SORT関数と異なり、元データを直接並べ替える点に注意してください。
Sub SortDataByColumn()
'======================================
' 指定列を基準にデータを並べ替える
' 使い方: 対象シートと列を変更して実行
'======================================
Dim ws As Worksheet
Dim lastRow As Long
Dim sortRange As Range
Set ws = ThisWorkbook.Sheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' A列からD列のデータ範囲を設定
Set sortRange = ws.Range("A1:D" & lastRow)
' 既存のソート条件をクリア
ws.Sort.SortFields.Clear
' D列(売上金額)を基準に降順でソート
ws.Sort.SortFields.Add2 _
Key:=ws.Range("D1:D" & lastRow), _
SortOn:=xlSortOnValues, _
Order:=xlDescending
' ソートを実行
With ws.Sort
.SetRange sortRange
.Header = xlYes ' 1行目は見出し
.MatchCase = False ' 大文字小文字を区別しない
.Orientation = xlTopToBottom
.Apply
End With
MsgBox "並べ替えが完了しました", vbInformation
End Sub
このマクロは、Sheet1のA列〜D列のデータをD列の値で降順に並べ替えます。.Header = xlYesで1行目をヘッダー(見出し行)として扱い、並べ替えの対象から除外しています。
RemoveDuplicatesメソッド
VBAで重複を削除するにはRange.RemoveDuplicatesメソッドを使います。UNIQUE関数と異なり、元データから直接重複行が削除されるため、必要に応じてバックアップを取ってから実行してください。
Sub RemoveDuplicateRows()
'======================================
' 指定列の重複を基準に重複行を削除
' 使い方: 対象シートと列を変更して実行
'======================================
Dim ws As Worksheet
Dim lastRow As Long
Dim beforeCount As Long
Dim afterCount As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
beforeCount = lastRow - 1 ' ヘッダー行を除く
' A列とB列の組み合わせで重複を判定して削除
ws.Range("A1:D" & lastRow).RemoveDuplicates _
Columns:=Array(1, 2), _
Header:=xlYes
afterCount = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row - 1
MsgBox beforeCount - afterCount & " 件の重複行を削除しました" & vbCrLf & _
"残り: " & afterCount & " 件", vbInformation
End Sub
Columns:=Array(1, 2)で、A列とB列の値が両方一致する行を重複とみなして削除します。1列だけで判定する場合はColumns:=Array(1)のように指定します。
複合処理VBA(フィルタ+ソート+重複削除)
フィルタリング・並べ替え・重複削除を一括で実行するマクロです。毎日のデータ整理作業を1クリックで自動化できます。
Sub FilterSortAndRemoveDuplicates()
'======================================
' フィルタ → ソート → 重複削除の一括処理
' 使い方: 対象シート・列・条件を変更して実行
'======================================
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim filterCol As Long
Dim filterValue As String
Set wsSrc = ThisWorkbook.Sheets("Sheet1")
' --- 設定値(用途に合わせて変更) ---
filterCol = 2 ' フィルタ対象列(B列)
filterValue = "営業部" ' フィルタ条件
' 結果シートを作成(既存なら削除して再作成)
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Sheets("結果").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set wsDst = ThisWorkbook.Sheets.Add(After:=wsSrc)
wsDst.Name = "結果"
lastRow = wsSrc.Cells(wsSrc.Rows.Count, "A").End(xlUp).Row
lastCol = wsSrc.Cells(1, wsSrc.Columns.Count).End(xlToLeft).Column
' ヘッダーをコピー
wsSrc.Range(wsSrc.Cells(1, 1), wsSrc.Cells(1, lastCol)).Copy _
Destination:=wsDst.Range("A1")
' Step 1: オートフィルタで条件に合うデータを抽出
wsSrc.Range("A1:A" & lastRow).AutoFilter _
Field:=filterCol, Criteria1:=filterValue
' フィルタ結果をコピー
Dim copyRange As Range
Set copyRange = wsSrc.Range(wsSrc.Cells(2, 1), _
wsSrc.Cells(lastRow, lastCol)).SpecialCells(xlCellTypeVisible)
copyRange.Copy Destination:=wsDst.Range("A2")
' フィルタを解除
wsSrc.AutoFilterMode = False
' Step 2: 重複削除(A列とB列の組み合わせ)
Dim dstLastRow As Long
dstLastRow = wsDst.Cells(wsDst.Rows.Count, "A").End(xlUp).Row
wsDst.Range("A1:A" & dstLastRow).RemoveDuplicates _
Columns:=Array(1, 2), Header:=xlYes
' Step 3: D列で降順ソート
dstLastRow = wsDst.Cells(wsDst.Rows.Count, "A").End(xlUp).Row
wsDst.Sort.SortFields.Clear
wsDst.Sort.SortFields.Add2 _
Key:=wsDst.Range("D1:D" & dstLastRow), _
SortOn:=xlSortOnValues, _
Order:=xlDescending
With wsDst.Sort
.SetRange wsDst.Range("A1:D" & dstLastRow)
.Header = xlYes
.Apply
End With
' 列幅を自動調整
wsDst.Columns.AutoFit
MsgBox "処理が完了しました" & vbCrLf & _
"フィルタ条件: " & filterValue & vbCrLf & _
"結果: " & dstLastRow - 1 & " 件", vbInformation
End Sub
このマクロは、元データのSheet1から条件に合うデータを抽出し、重複を削除して並べ替えた結果を「結果」シートに出力します。元データは一切変更しません。
{VBA_DEMO}よくある質問(FAQ)
Q. SORT関数はExcel 2019で使えますか?
いいえ、SORT関数はExcel 2021以降またはMicrosoft 365で使用できます。Excel 2019以前ではリボンの「データ」→「並べ替え」機能を使うか、VBAのRange.Sortメソッドで代替できます。SORT関数が使えるかどうかは、任意のセルに=SORT(と入力してオートコンプリートに表示されるかで確認できます。
Q. SORT関数とSORTBY関数の違いは何ですか?
SORT関数は並べ替え対象の配列内の列番号(数値)で基準を指定しますが、SORTBY関数は別のセル範囲を基準として指定できます。たとえば、A列の名前をB列の点数で並べ替えたい場合、SORT関数では名前と点数の両方を含む範囲を指定する必要がありますが、SORTBY関数なら=SORTBY(A2:A10, B2:B10, -1)のように名前だけを返すことも可能です。
Q. UNIQUE関数で空白セルが含まれる場合はどうなりますか?
空白セルも1つの値として扱われ、結果に空白行が含まれます。空白を除外したい場合は=SORT(UNIQUE(FILTER(A2:A100, A2:A100<>"")))のようにFILTER関数で空白を除外してからUNIQUE関数に渡します。
Q. #SPILL!エラーが出て結果が表示されません。どうすればいいですか?
スピル先のセルに既存のデータや結合セルがある場合に発生します。エラーが表示されているセルをクリックすると、スピル先として必要な範囲が青い枠線で表示されます。その範囲にある既存データを削除するか、結合セルを解除してください。テーブル内ではスピルが制限されることもあるため、テーブル外のセルに数式を移動することも検討してください。
Q. SORT関数の結果を元データと連動させることはできますか?
はい、SORT関数は動的配列関数なので、元データが変更されると結果も自動的に更新されます。行の追加にも対応させたい場合は、データ範囲をテーブル化(Ctrl+T)してテーブル参照(例: =SORT(テーブル1))を使うと、行の増減にも自動で対応します。
まとめ
この記事では、ExcelのSORT関数・SORTBY関数・UNIQUE関数の使い方を基本から応用、VBA自動化まで解説しました。
- SORT関数: =SORT(配列, 列番号, 順序) で元データを変えずに並べ替え結果を取得
- SORTBY関数: 別の列を基準にでき、複数キーの並べ替えが直感的に書ける
- UNIQUE関数: 重複を除いた一意のリストを自動生成。第3引数で1回だけの値も抽出可能
- 組み合わせ技: SORT(UNIQUE(…))やSORT(FILTER(…))で強力なデータ処理が1数式で完結
- 動的ドロップダウン: SORT+UNIQUE+スピル範囲演算子(#)で自動更新されるリストを作成
- VBA代替: Range.Sort / RemoveDuplicates で旧バージョンでも自動化可能
SORT関数・UNIQUE関数は動的配列関数の中でも特に使用頻度が高い関数です。FILTER関数やVLOOKUP関数と組み合わせることで、手作業で行っていたデータ整理を大幅に効率化できます。
Excelスキルを活かしてSNS運用も自動化しませんか?
Excelの関数をマスターしたあなたなら、Googleスプレッドシート×GAS(Google Apps Script)を使ったSNS自動化ツールもすぐに使いこなせます。X(Twitter)やThreadsの予約投稿を、月額0円で自動化する方法をまとめています。
→ SNS予約投稿ツール完全ガイド|無料&買い切りツールを徹底比較
VBA開発・GAS連携・Webアプリ化まで、
業務に合わせた最適な自動化をご提案します。
LINEでExcelを気軽に学べる
