Excel VBAでフィルター設定する方法をお探しですね。
広告
Excel VBAでオートフィルタを操る完全ガイド
Excel VBAで大量の表データを扱うとき、毎回手作業でフィルター操作を繰り返すのは本当に面倒ですよね。
オートフィルタをVBAで自動化できれば、「営業部だけ表示する」「30歳以上40歳未満に絞る」「複数の都道府県だけ抽出する」といった処理が、ボタン一つで完了します。
この記事では、AutoFilterメソッドの基本から、解除方法、複数条件の絞り込み、実務でエラーを防ぐ書き方まで、順番に丁寧に解説していきます。
1. Excel VBAでオートフィルタを設定する基本
Excelのオートフィルタは、表の見出し行にフィルターを設定して、条件に合う行だけを表示してくれる便利な機能です。
VBAでは、Rangeオブジェクトに対してAutoFilterメソッドを使うことで、手作業と同じようにフィルターを設定できます。
基本的な書き方は「対象範囲.AutoFilter Field:=列番号, Criteria1:=条件」です。
Fieldには表の左端を1列目として数えた列番号を、Criteria1には抽出したい値や条件を指定します。
たとえば、A1:D100の表で、3列目の「部署」が「営業部」の行だけを表示したい場合は、こんな感じで書きます。
“`vb
Sub FilterDepartment()
Range(“A1:D100″).AutoFilter Field:=3, Criteria1:=”営業部”
End Sub
“`
ここで注意したいのは、Fieldに指定する番号はワークシート全体の列番号ではなく、**AutoFilterをかける範囲の左端から数えた番号**だということです。
A列から始まる表ならC列は3番目ですが、もしB列から始まる表なら、D列が3番目になります。
数値で絞り込む
数値条件で絞り込む場合は、Criteria1に比較演算子を文字列として指定します。
たとえば、年齢が30歳以上のデータを抽出するなら「>=30」と書きます。
“`vb
Sub FilterAge()
Range(“A1:D100″).AutoFilter Field:=2, Criteria1:=”>=30”
End Sub
“`
日付や金額も同じ考え方で指定できますが、日付はExcelのバージョンやセルの実際のデータ形式によって動きが変わることがあります。
実務では、表示形式だけでなく、セルに入っている値が本当に日付データなのかを確認しておくと安心です。
文字列の一部で絞り込む(ワイルドカード)
文字列の一部だけで絞り込みたい場合は、ワイルドカードを使います。
ワイルドカードとは、任意の文字を表す記号のことで、Excelでは「*」が任意の文字列、「?」が任意の1文字を意味します。
たとえば、氏名に「田」を含む行を抽出したい場合は「*田*」と指定します。
“`vb
Sub FilterName()
Range(“A1:D100″).AutoFilter Field:=1, Criteria1:=”*田*”
End Sub
“`
完全一致だけでなく部分一致も使えるようになると、担当者名、商品名、備考欄など、表記ゆれが起きやすい列でも柔軟に抽出できるようになります。
2. オートフィルタの解除と絞り込み条件のクリア
VBAでオートフィルタを扱うときは、「オートフィルタそのものを解除する」のか、「フィルターの条件だけをクリアする」のかを分けて考える必要があります。
前者は見出し行のドロップダウン矢印も消す操作で、後者は矢印を残したまま、絞り込み結果だけを元に戻す操作です。
この違いを理解していないと、処理後にユーザーが手動でフィルターを使いたいのに矢印まで消えてしまったり、逆に条件が残ったまま次の処理に進んでしまったりします。
オートフィルタ自体を解除する
オートフィルタそのものを解除するには、引数なしでAutoFilterを実行します。
ただし、AutoFilterは「設定されていなければ設定し、設定されていれば解除する」というトグル動作をします。
つまり、単純に`Range(“A1:D100”).AutoFilter`と書くと、現在の状態によって結果が変わってしまう可能性があります。
確実に解除したい場合は、AutoFilterModeプロパティでフィルターが設定されているか確認してから実行するのが安全です。
“`vb
Sub RemoveAutoFilter()
If ActiveSheet.AutoFilterMode = True Then
ActiveSheet.Range(“A1:D100”).AutoFilter
End If
End Sub
“`
フィルター条件だけをクリアする
一方、フィルターの条件だけをクリアして、オートフィルタの矢印は残したい場合はShowAllDataメソッドを使います。
ただし、ShowAllDataはフィルターで絞り込み中ではない状態で実行するとエラーになることがあります。
そのため、FilterModeプロパティで実際に絞り込みが行われているかを確認してから実行するのが実務向きです。
“`vb
Sub ClearFilterOnly()
If ActiveSheet.FilterMode = True Then
ActiveSheet.ShowAllData
End If
End Sub
“`
**整理すると**
– **AutoFilterMode**:フィルター機能が設定されているか
– **FilterMode**:何らかの絞り込みが行われているか
この違いを押さえておくと、混乱しにくくなります。
実務での安全な処理の流れ
実務では、マクロの最初に既存のフィルター状態を整えてから新しい条件を設定する書き方がおすすめです。
前回の条件が残っていると、同じコードでも期待した結果にならないことがあります。
特に、日次レポートや抽出結果を別シートへコピーする処理では、処理前に条件をクリアするだけでなく、必要に応じてオートフィルタ自体をいったん解除し、改めて対象範囲に設定し直すと安定します。
3. 複数条件で絞り込む方法:AND条件・OR条件・配列
Excel VBAでオートフィルタを複数条件にしたい場合、まず押さえたいのがCriteria1、Operator、Criteria2の組み合わせです。
AND条件(両方の条件を満たす)
2つの条件を同じ列に対して指定する場合は、OperatorにxlAndまたはxlOrを指定します。
xlAndは両方の条件を満たす行を表示します。
たとえば、年齢が30歳以上かつ40歳未満のデータを抽出したい場合はこう書きます。
“`vb
Sub FilterAgeRange()
Range(“A1:D100″).AutoFilter _
Field:=2, _
Criteria1:=”>=30″, _
Operator:=xlAnd, _
Criteria2:=”<40"
End Sub
```
OR条件(どちらか一方の条件を満たす)
OR条件は、2つの条件のどちらかに一致すれば表示したい場合に使います。
たとえば、売上が10万円未満または50万円以上のデータを抽出するようなケースです。
“`vb
Sub FilterSalesOr()
Range(“A1:D100″).AutoFilter _
Field:=4, _
Criteria1:=”<100000", _
Operator:=xlOr, _
Criteria2:=">=500000″
End Sub
“`
条件の範囲から外れたデータを確認したいときや、例外値を抽出したいときに便利です。
ANDとORは似ているようで結果が大きく変わるため、「両方満たす必要があるのか」「どちらか一方でよいのか」を先に言葉で整理してからコードに落とし込むとミスを減らせます。
配列を使った複数値の指定
3つ以上の値を同じ列で絞り込みたい場合は、配列とxlFilterValuesを使います。
たとえば、都道府県列から「東京都」「大阪府」「福岡県」だけを表示したい場合に便利です。
“`vb
Sub FilterPrefectures()
Range(“A1:D100”).AutoFilter _
Field:=3, _
Criteria1:=Array(“東京都”, “大阪府”, “福岡県”), _
Operator:=xlFilterValues
End Sub
“`
ただし、配列を使った絞り込みは基本的に完全一致の値を複数指定する用途です。
比較演算子やワイルドカードを配列内で自由に組み合わせる方法ではないため、「300以上、500、700以下」のような複雑な条件を配列でまとめるのは避けたほうが安全です。
複数列にまたがる条件
複数列にまたがる条件を設定したい場合は、AutoFilterを複数回実行します。
たとえば「部署が営業部」かつ「売上が30万円以上」のように、部署列と売上列をそれぞれ絞り込む形です。
“`vb
Sub FilterMultipleColumns()
With Range(“A1:D100″)
.AutoFilter Field:=3, Criteria1:=”営業部”
.AutoFilter Field:=4, Criteria1:=”>=300000″
End With
End Sub
“`
同じ範囲に対してFieldを変えてAutoFilterを実行すれば、条件は組み合わされて適用されます。
複数列の条件は基本的にANDとして働くため、条件を追加するほど表示される行は絞り込まれていきます。
さらに複雑な条件の場合
「営業部で売上30万円以上、または企画部で売上50万円以上」のような複雑な条件は、AutoFilterだけで無理に書こうとすると読みづらくなります。
このような場合は、**作業列を追加して条件判定式を入れ、その結果がTRUEの行だけをフィルターする方法**が実務的です。
VBAの可読性も上がり、後から条件を変更するときにも保守しやすくなります。
4. 実務で使いやすい安全な書き方と注意点
実務でExcel VBAのオートフィルタを使う場合は、単に抽出できるコードを書くよりも、**何度実行しても同じ結果になるコード**を意識することが大切です。
フィルター状態が残っている、対象範囲がずれている、ShowAllDataでエラーになる、日付条件がうまく一致しないといった問題は、現場でよく起きます。
特に、別の人が操作した後のブックに対してマクロを実行する場合、シートの状態を前提にしすぎると予期しない結果になります。
対象範囲を明示する
まず、対象範囲はできるだけ明示しましょう。
`Range(“A1”).AutoFilter`のように左上セルだけを指定してもExcelが表範囲を推測してくれることがありますが、空白行や空白列があると期待どおりに認識されない可能性があります。
データ量が変わる表では、**最終行を取得して範囲を組み立てる方法**が安定します。
以下の例では、A列の最終行を取得し、A1:D最終行までをフィルター範囲にしています。
“`vb
Sub SafeAutoFilter()
Dim ws As Worksheet
Dim lastRow As Long
Dim rng As Range
Set ws = Worksheets(“売上一覧”)
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
Set rng = ws.Range(“A1:D” & lastRow)
‘ フィルター条件をクリア
If ws.FilterMode = True Then
ws.ShowAllData
End If
‘ オートフィルタが設定されていなければ設定
If ws.AutoFilterMode = False Then
rng.AutoFilter
End If
‘ 条件を設定
rng.AutoFilter Field:=3, Criteria1:=”営業部”
rng.AutoFilter Field:=4, Criteria1:=”>=300000″
End Sub
“`
日付を条件にする場合の注意点
日付を条件にする場合は、セルの値が「文字列の日付」なのか「日付シリアル値」なのかを確認することが重要です。
Excelでは見た目が「2025/4/1」でも、内部的には日付として扱われている場合と文字列として扱われている場合があります。
基本的には`Criteria1:=”>=2025/4/1″`のように指定できますが、うまく抽出できない場合は、対象列のデータ型やロケール、表示形式を確認してください。
期間指定では、**開始日を「以上」、終了日の翌日を「未満」**にすると、時刻を含むデータでも漏れにくくなります。
“`vb
Sub FilterDateRange()
Range(“A1:D100″).AutoFilter _
Field:=1, _
Criteria1:=”>=2025/4/1″, _
Operator:=xlAnd, _
Criteria2:=”<2025/5/1"
End Sub
```
空白セルや空白以外を抽出する
空白セルや空白以外を抽出したい場合も、AutoFilterで指定できます。
– **空白セルを抽出**:`Criteria1:=”=”`
– **空白以外を抽出**:`Criteria1:=”<>“`
入力漏れチェックや、処理済みフラグが入っていない行の抽出などでよく使う条件です。
見落としやすい点として、見た目は空白でも数式が入っていて空文字を返しているセルは、通常の空白セルと扱いが異なることがあります。
抽出結果が想定と違う場合は、セルに数式が入っていないか確認すると原因を見つけやすくなります。
まとめ
VBAでオートフィルタを設定・解除し、複数条件で絞り込みを行う処理は、レポート作成、データ確認、抽出結果のコピー、不要行の削除など、多くの業務に応用できます。
**基本の整理**
– **基本**:AutoFilterで条件を指定
– **解除**:AutoFilterとShowAllDataを使い分け
– **2条件**:xlAnd・xlOrを使う
– **3つ以上の完全一致**:配列を使う
– **複雑な条件**:作業列も選択肢に入れる
フィルターの状態確認まで含めて書けるようになると、初心者向けのサンプルコードから一歩進んだ、実務で安心して使えるVBAになります。
ぜひこの記事を参考に、日々の業務を効率化してみてください。
広告
