【VBA】テーブルの並び替えとフィルタを一括で行うマクロの作り方

Excelでデータ分析を行うとき、並び替えとフィルタを組み合わせて実行することはよくあります。
例えば、売上データを「日付順」に並び替えつつ「特定の商品だけ抽出する」など、複数の操作をまとめてマクロ化しておくと、日常業務の効率が大幅にアップします。

本記事では、並び替えとフィルタを一括で処理するマクロの基本構成を紹介し、実用的なサンプルコードを解説します。


1. 並び替えとフィルタを一括処理する流れ

マクロ構成の考え方は以下の通りです。

  1. 対象のテーブル(ListObject)を取得
  2. 並び替え条件を設定し適用
  3. フィルタ条件を設定し適用
  4. 必要に応じて処理後の表示を確認

2. サンプルシナリオ

次のようなテーブル「Table1」があるとします。

担当者商品数量日付
佐藤商品A102025/10/01
鈴木商品B502025/10/02
田中商品A202025/10/03
佐藤商品B302025/10/04

ここで実現したい処理は:

  • 日付を昇順に並び替え
  • 商品列で「商品A」のみを抽出

3. 並び替え+フィルタを一括処理するコード

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
    
    '日付列を昇順に並び替え
    lo.Sort.SortFields.Add _
        Key:=lo.ListColumns("日付").Range, _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
    
    With lo.Sort
        .Header = xlYes 'ヘッダー行あり
        .Apply
    End With
    
    '商品列で「商品A」を抽出
    lo.Range.AutoFilter _
        Field:=lo.ListColumns("商品").Index, _
        Criteria1:="商品A"
End Sub

4. コード解説

  • lo.Sort.SortFields.Clear
    並び替え条件をリセット。必ず最初に実行するのが安全。
  • SortFields.Add
    日付列を昇順に設定。複数条件を指定することも可能。
  • lo.Range.AutoFilter
    並び替え後にフィルタを適用。列名で指定することで保守性を高めている。

5. 応用例:複数条件の並び替え+フィルタ

例えば次のように「担当者を昇順 → 数量を降順」で並び替え、その上で「商品B」だけを抽出することも可能です。

Sub テーブル並び替えとフィルタ応用()
    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
    
    With lo.Sort
        .Header = xlYes
        .Apply
    End With
    
    '商品列で「商品B」を抽出
    lo.Range.AutoFilter _
        Field:=lo.ListColumns("商品").Index, _
        Criteria1:="商品B"
End Sub

6. まとめ

  • 並び替えとフィルタは 一つのマクロでまとめて処理可能
  • 並び替えは SortFields.Add を使って複数条件を設定できる
  • フィルタは lo.Range.AutoFilter を組み合わせて実現
  • 列名で指定すると列の順番が変わってもエラーになりにくく保守性が高い

並び替えとフィルタを組み合わせることで、必要なデータを効率的に抽出でき、日常業務のスピードが大きく向上します。

コメント

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