【VBA】テーブル(ListObject)を複数条件で並び替える方法(優先順位付き)

Excelでデータを分析する際、1つの列だけでなく複数の列を基準に並び替えたい というケースはよくあります。
例えば、売上データを「担当者」ごとに並び替え、その中でさらに「売上金額」を降順に並べる、といった操作です。

本記事では、VBAで 複数条件を設定して優先順位付きで並び替える方法 を、サンプルコードとともにわかりやすく解説します。


1. 複数条件での並び替えの基本

複数条件で並び替える場合は、以下のような流れになります。

  1. SortFieldsをクリアして前回の並び替え条件を削除する
  2. 複数の列を順番にSortFields.Addで指定する(先に書いたものほど優先順位が高い)
  3. .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 で指定する
  • 列名で指定すると列の位置が変わってもエラーになりにくく保守性が高い

複数条件での並び替えをマクロに組み込めば、複雑なデータ整理もワンクリックで実行でき、業務効率が大幅にアップします。

コメント

タイトルとURLをコピーしました