Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ データの並べ替えとフィルタリング | テーブルとレポートの自動化
ビジネス自動化のためのExcel VBA

データの並べ替えとフィルタリング

メニューを表示するにはスワイプしてください

フィルタリングは、基になるデータに手を加えることなく表示内容を絞り込む機能。特定の月や地域のみを表示するレポート作成に不可欠な操作。

図 4.2

基本的なオートフィルター

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter はデータを削除したり移動したりせず、条件に合わない行を非表示にする機能。手動でドロップダウン矢印をクリックし、January 以外のチェックを外す操作と同じ動作。Field:=1 はテーブル内で1から始まる列番号(Month, Region, Sales, Expenses, Profit, Target — したがって Region は Field:=2, Profit は Field:=5)を指定するため、列の並び順が変更された場合はこの値も合わせて修正が必要。

複数条件でのフィルター

同じ列で複数の値を抽出する場合は xlFilterValues と条件の配列を使用:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

単一値フィルターとの違いは、Criteria1 に複数値の Array(...) を指定し、Operator:=xlFilterValues でその配列をリストとして扱うよう指示する点。Operator:=xlFilterValues を省略するとエラーや予期しない動作になるため、Criteria1 にリストを指定する場合は必ず確認が必要。

数値条件でのフィルター(例:Profit が Target を大きく上回る行のみ抽出)は比較演算子を使用:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

">15000" は数値比較だが、AutoFilter では Criteria1 を必ず文字列として指定し、先頭の > を自動的に解釈する。Criteria1:=15000 のように > を付けずに指定すると、15000 と等しい行のみが抽出されるため注意。

並べ替え

Sort オブジェクトは複数キーの並べ替えに対応しており、Data → Sort ダイアログと同様の動作:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear は、前回のマクロ実行や手動での並べ替えによる残留キーをリセットするために最初に実行。新しいキーを追加する前に必ずクリアすること。2つの .Add2 の順序は、Order:=xlAscending/xlDescending の指定と同様に重要で、最初に追加したものが主キー(Month)、2番目がグループ内のサブキー(Profit、各月内で高い順)となる。.Header = xlYes は1行目がヘッダーで並べ替え対象外であることを指定し、.Apply で並べ替えを実行。

フィルターの解除

レポートマクロの冒頭では必ずフィルターを解除し、毎回フィルターなしの状態から処理を開始すること:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode は現在フィルターが適用されている場合に True となる論理値。これを確認してから ShowAllData を実行することで、フィルターがかかっていない状態でのエラー発生を防止。

タスク

  1. AutoFilter Field:=1 を使用して、tblReports を 2 月のみでフィルタリングするマクロの作成。
  2. xlFilterValues を使い、Region(Field:=2)を「East」と「West」の両方で同時にフィルタリングするよう拡張。
  3. 両方のフィルターをクリアし、その後テーブルを Region 昇順、Profit 降順で並べ替える(上記の Sort オブジェクトを使用)。
ヒント
expand arrow

1. 2月へのフィルタリング

  • Field:=1 はワークシートの列ではなく、テーブル内の最初の列(tblReports 内の Month 列)を指します。物理的にどのワークシート列にあっても、tblReports 内で1列目が対象です。
  • Criteria1 には、フィルタリングしたい正確なテキストを引用符で囲んで指定します。
  • AutoFilter はワークシートではなく tbl.Range に対して呼び出します。

2. Region フィルターの追加

  • Region はテーブルの2列目なので、Month フィルターとは異なる Field:= 番号を指定します。
  • 同じ列で2つの値にフィルタリングする場合は、Criteria1:=Array(...) で両方の値を指定し、Operator:=xlFilterValues を追加します(このオペレーターを省略するのが最もよくあるミスです)。
  • Month と Region の両方のフィルターは同時に有効にできます。各列ごとに1回ずつ AutoFilter を呼び出します。

3. フィルター解除と並べ替え

  • tbl.AutoFilter.FilterMode を呼び出す前に ShowAllData を確認してください。何もフィルタリングされていない状態で呼び出すとエラーになります。
  • Sort オブジェクトは最初に .SortFields.Clear を実行し、その後並べ替えレベルごとに .SortFields.Add2 を1回ずつ追加します。追加する順番 が主キーとタイブレーカーを決めるので、テーブル内の表示順ではありません。
  • Region 昇順を Profit 降順より先に追加してください。Region が主キーとなるためです。
解答例
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

FilterFebruaryEastWest を実行すると、East と West の 2 月分の行のみが表示されます。その後 ClearFiltersAndSort を実行すると、すべての行が再表示され、まず Region(アルファベット順)、次に各 Region 内で Profit の高い順に並べ替えられます。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  2

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

データの並べ替えとフィルタリング

フィルタリングは、基になるデータに手を加えることなく表示内容を絞り込む機能。特定の月や地域のみを表示するレポート作成に不可欠な操作。

図 4.2

基本的なオートフィルター

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter はデータを削除したり移動したりせず、条件に合わない行を非表示にする機能。手動でドロップダウン矢印をクリックし、January 以外のチェックを外す操作と同じ動作。Field:=1 はテーブル内で1から始まる列番号(Month, Region, Sales, Expenses, Profit, Target — したがって Region は Field:=2, Profit は Field:=5)を指定するため、列の並び順が変更された場合はこの値も合わせて修正が必要。

複数条件でのフィルター

同じ列で複数の値を抽出する場合は xlFilterValues と条件の配列を使用:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

単一値フィルターとの違いは、Criteria1 に複数値の Array(...) を指定し、Operator:=xlFilterValues でその配列をリストとして扱うよう指示する点。Operator:=xlFilterValues を省略するとエラーや予期しない動作になるため、Criteria1 にリストを指定する場合は必ず確認が必要。

数値条件でのフィルター(例:Profit が Target を大きく上回る行のみ抽出)は比較演算子を使用:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

">15000" は数値比較だが、AutoFilter では Criteria1 を必ず文字列として指定し、先頭の > を自動的に解釈する。Criteria1:=15000 のように > を付けずに指定すると、15000 と等しい行のみが抽出されるため注意。

並べ替え

Sort オブジェクトは複数キーの並べ替えに対応しており、Data → Sort ダイアログと同様の動作:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear は、前回のマクロ実行や手動での並べ替えによる残留キーをリセットするために最初に実行。新しいキーを追加する前に必ずクリアすること。2つの .Add2 の順序は、Order:=xlAscending/xlDescending の指定と同様に重要で、最初に追加したものが主キー(Month)、2番目がグループ内のサブキー(Profit、各月内で高い順)となる。.Header = xlYes は1行目がヘッダーで並べ替え対象外であることを指定し、.Apply で並べ替えを実行。

フィルターの解除

レポートマクロの冒頭では必ずフィルターを解除し、毎回フィルターなしの状態から処理を開始すること:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode は現在フィルターが適用されている場合に True となる論理値。これを確認してから ShowAllData を実行することで、フィルターがかかっていない状態でのエラー発生を防止。

タスク

  1. AutoFilter Field:=1 を使用して、tblReports を 2 月のみでフィルタリングするマクロの作成。
  2. xlFilterValues を使い、Region(Field:=2)を「East」と「West」の両方で同時にフィルタリングするよう拡張。
  3. 両方のフィルターをクリアし、その後テーブルを Region 昇順、Profit 降順で並べ替える(上記の Sort オブジェクトを使用)。
ヒント
expand arrow

1. 2月へのフィルタリング

  • Field:=1 はワークシートの列ではなく、テーブル内の最初の列(tblReports 内の Month 列)を指します。物理的にどのワークシート列にあっても、tblReports 内で1列目が対象です。
  • Criteria1 には、フィルタリングしたい正確なテキストを引用符で囲んで指定します。
  • AutoFilter はワークシートではなく tbl.Range に対して呼び出します。

2. Region フィルターの追加

  • Region はテーブルの2列目なので、Month フィルターとは異なる Field:= 番号を指定します。
  • 同じ列で2つの値にフィルタリングする場合は、Criteria1:=Array(...) で両方の値を指定し、Operator:=xlFilterValues を追加します(このオペレーターを省略するのが最もよくあるミスです)。
  • Month と Region の両方のフィルターは同時に有効にできます。各列ごとに1回ずつ AutoFilter を呼び出します。

3. フィルター解除と並べ替え

  • tbl.AutoFilter.FilterMode を呼び出す前に ShowAllData を確認してください。何もフィルタリングされていない状態で呼び出すとエラーになります。
  • Sort オブジェクトは最初に .SortFields.Clear を実行し、その後並べ替えレベルごとに .SortFields.Add2 を1回ずつ追加します。追加する順番 が主キーとタイブレーカーを決めるので、テーブル内の表示順ではありません。
  • Region 昇順を Profit 降順より先に追加してください。Region が主キーとなるためです。
解答例
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

FilterFebruaryEastWest を実行すると、East と West の 2 月分の行のみが表示されます。その後 ClearFiltersAndSort を実行すると、すべての行が再表示され、まず Region(アルファベット順)、次に各 Region 内で Profit の高い順に並べ替えられます。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  2
some-alt