Excelでデータを分析する際、1つの列だけでなく複数の列を基準に並び替えたい というケースはよくあります。
例えば、売上データを「担当者」ごとに並び替え、その中でさらに「売上金額」を降順に並べる、といった操作です。
本記事では、VBAで 複数条件を設定して優先順位付きで並び替える方法 を、サンプルコードとともにわかりやすく解説します。
1. 複数条件での並び替えの基本
複数条件で並び替える場合は、以下のような流れになります。
- SortFieldsをクリアして前回の並び替え条件を削除する
- 複数の列を順番にSortFields.Addで指定する(先に書いたものほど優先順位が高い)
.Applyで並び替えを実行する
2. 複数条件で昇順/降順を組み合わせた並び替え
例として、以下のようなテーブル「Table1」を考えます。
- 列1: 担当者
- 列2: 売上
- 列3: 日付
ここで、「担当者」を昇順(A→Z)に並び替え、さらに「売上」を降順(大きい順)に並び替えるコードは以下の通りです。
Sub テーブルを複数条件で並び替え()
Dim ws As Worksheet
Dim lo As ListObject
'Sheet1のテーブル「Table1」を取得
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
'既存の並び替え条件をクリア
lo.Sort.SortFields.Clear
'第1条件:担当者を昇順に並び替え
lo.Sort.SortFields.Add _
Key:=lo.ListColumns("担当者").Range, _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
'第2条件:売上を降順に並び替え
lo.Sort.SortFields.Add _
Key:=lo.ListColumns("売上").Range, _
SortOn:=xlSortOnValues, _
Order:=xlDescending, _
DataOption:=xlSortNormal
'並び替えを適用
With lo.Sort
.Header = xlYes '1行目はヘッダー
.Apply
End With
End Sub
3. コードのポイント解説
lo.Sort.SortFields.Clear
並び替え条件をリセットしてから新しく設定します。前の条件が残っていると意図しない動作になるため必須です。SortFields.Addを複数書くことで複数条件を設定
書いた順に優先順位が決まります。
上記コードでは「担当者 → 売上」の順で優先されます。Order:=xlAscendingは昇順、Order:=xlDescendingは降順を意味します。
4. 実用例:日付を含めた並び替え
さらに「日付」も条件に加えて、担当者 → 売上 → 日付 の順で並び替えることもできます。
Sub テーブルを3条件で並び替え()
Dim ws As Worksheet
Dim lo As ListObject
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
lo.Sort.SortFields.Clear
'第1条件:担当者を昇順
lo.Sort.SortFields.Add _
Key:=lo.ListColumns("担当者").Range, _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
'第2条件:売上を降順
lo.Sort.SortFields.Add _
Key:=lo.ListColumns("売上").Range, _
SortOn:=xlSortOnValues, _
Order:=xlDescending, _
DataOption:=xlSortNormal
'第3条件:日付を昇順
lo.Sort.SortFields.Add _
Key:=lo.ListColumns("日付").Range, _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
With lo.Sort
.Header = xlYes
.Apply
End With
End Sub
5. まとめ
- 複数条件の並び替えは
SortFields.Addを複数記述して優先順位を設定する - 書いた順に優先度が高くなる(最初に指定した列が第一キー)
- 昇順/降順は
Order:=xlAscendingまたはxlDescendingで指定する - 列名で指定すると列の位置が変わってもエラーになりにくく保守性が高い
複数条件での並び替えをマクロに組み込めば、複雑なデータ整理もワンクリックで実行でき、業務効率が大幅にアップします。
コメント