「あぁ、またこの条件で抽出しなきゃ……。A支店で、かつ売上が10万円以上、でもB商品は除外して……って、フィルターを何度もカチカチするの、もう限界!」
そんなふうに感じたことはありませんか?
今日は、そんな「手作業のフィルター地獄」から私たちを解放してくれる便利なVBAテクニック、「AdvancedFilter」についてご紹介します。
1. なぜ「オートフィルター」には限界があるのか?
普段使いになじみのある「オートフィルター」は手軽で便利ですが、実は複雑な条件を指定する抽出にはあまり向いていません。
- 「AまたはB、かつC」といった複雑な組み合わせが作りにくい
- 抽出された結果を、別のシートへ転記する手間に時間がかかる
- 条件を変更するたびに、何度もクリック操作を繰り返す必要がある
これらの課題を解決するのがAdvancedFilterです。例えるなら、オートフィルターが「手動のふるい」なら、AdvancedFilterは「全自動の高性能選別機」と言えます。
2. 実践!AdvancedFilterのコード
まずは、以下のコードをご覧ください。
「あらかじめシート上に抽出条件を記載しておき、ボタン一つで指定の場所に結果を書き出す」という、実務で頻出する実用的な構成にしています。
Sub SuperFastExtract()
' === 変数の設定 ===
Dim wsData As Worksheet
Dim wsCriteria As Worksheet
Dim lastRow As Long
' シートの指定(お使いのシート名に合わせて変えてください)
Set wsData = ThisWorkbook.Worksheets("データ一覧")
Set wsCriteria = ThisWorkbook.Worksheets("抽出条件")
' データの最終行を取得(データの終わりを自動で見つける)
lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
' === AdvancedFilterの実行 ===
wsData.Range("A1:E" & lastRow).AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=wsCriteria.Range("A1:C2"), _
CopyToRange:=wsData.Range("G1"), _
Unique:=False ' 重複を許す場合はFalse
MsgBox "抽出が完了しました!", vbInformation
End Sub



ここがポイント!コードの解説
- Action:=xlFilterCopy: これを指定するだけで、抽出結果を指定の場所(CopyToRange)に一瞬でコピペしてくれます。
- CriteriaRange: ここに「条件をまとめたセル範囲」を指定します。
Excelのシート上に条件を書いておけるので、VBAのコードを書き換えなくても、シートの文字を変えるだけで、柔軟に抽出条件をコントロールできるようになります。
またAdvancedFilterを使うときのコツは「条件範囲の見出しを、元データの見出しと一言一句一致させること」です。
スペースや文字がたった一文字でも異なると、エラーの原因になってしまいます。「プログラムがうまく動作しないな」と感じたときは、まず元の見出しをそのまま条件範囲にコピペして揃えてみてください。
ちなみに、ループ処理(For Eachなどで1行ずつチェックする方法)を使ってデータ抽出することも可能です。
しかし、データ量が大量になると処理に時間がかかり、場合によっては画面が固まってしまうこともあります。
その点、AdvancedFilterはExcelに標準搭載されている機能をVBAから直接呼び出して実行するため、高速に処理が完了します!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント