データの並べ替えとフィルタリング
メニューを表示するにはスワイプしてください
フィルタリングは、基になるデータに手を加えることなく表示内容を絞り込む機能。特定の月や地域のみを表示するレポート作成に不可欠な操作。
基本的なオートフィルター
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 を実行することで、フィルターがかかっていない状態でのエラー発生を防止。
タスク
AutoFilter Field:=1を使用して、tblReports を 2 月のみでフィルタリングするマクロの作成。xlFilterValuesを使い、Region(Field:=2)を「East」と「West」の両方で同時にフィルタリングするよう拡張。- 両方のフィルターをクリアし、その後テーブルを Region 昇順、Profit 降順で並べ替える(上記の Sort オブジェクトを使用)。
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 が主キーとなるためです。
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 の高い順に並べ替えられます。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
データの並べ替えとフィルタリング
フィルタリングは、基になるデータに手を加えることなく表示内容を絞り込む機能。特定の月や地域のみを表示するレポート作成に不可欠な操作。
基本的なオートフィルター
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 を実行することで、フィルターがかかっていない状態でのエラー発生を防止。
タスク
AutoFilter Field:=1を使用して、tblReports を 2 月のみでフィルタリングするマクロの作成。xlFilterValuesを使い、Region(Field:=2)を「East」と「West」の両方で同時にフィルタリングするよう拡張。- 両方のフィルターをクリアし、その後テーブルを Region 昇順、Profit 降順で並べ替える(上記の Sort オブジェクトを使用)。
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 が主キーとなるためです。
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 の高い順に並べ替えられます。
フィードバックありがとうございます!