VBA

AutoFilterとAdvancedFilterの違いは?メリットデメリットについて

記事内に商品プロモーションを含む場合があります
このページでわかること

AutoFilterとAdvancedFilterの違いと使い分けの仕方がわかります。

覚えること
  1. AutoFilterは手軽にサクッと抽出できる。
    抽出条件を変更しやすい。
  2. AdvancedFilterは複雑な抽出が一度の操作でできる。
    抽出条件をエクセルに書き込めるのでメンテナンスしやすい。
  3. 変更できるようにしたいセルの処理
    レンジオブジェクト.Locked=False
  4. シートの保護
    シートオブジェクト.Protect

こんにちはhokkyokunです。
表の抽出作業でよくお世話になる、AutoFilterとAdvancedFilterですが、
どちらを使えばよいか考察したいと思います。

どちらを使うべきか状況によって変わると思います。
まとめていきたいと思います。

AutoFilterとAdvancedFilterの構文

AutoFilterメソッド

Rangeオブジェクト.AutoFilter([Field], [Criteria1], [Operator], [Criteria2], [VisibleDropDown])

ざっくりな説明をすると
Fieldで表の何番目の列の値を抽出するか設定し、
Criteria1と2で抽出条件を指定、
Operatorで抽出条件の種類を指定(例えばCriteria1と2の条件に同時合う値を抽出するか、どちらか一方でも合う値を抽出するか)
という使い方です。

AdvancedFilterメソッド

Rangeオブジェクト.AdvancedFilter(Action, [CriteriaRange], [CopyToRange], [Unique])

こちらはActionで抽出結果の表示場所を表内にするか、表外にするか指定し、
CriteriaRangeでエクセル上に書かれた検索条件を指定し、
CopytoRangeで表示場所を指定
Uniqueでデータを重複OKにするか重複分は一部非表示にするか
という使い方です。

同じような処理でも扱い方は違います。

どちらを使うべきか

ではどちらを使うべきでしょうか。

どちらか一方だけ覚えれば言いというわけではありません。
どちらも重要でどちらも覚える必要があります。

それぞれにメリットデメリットがあり、状況により使い分ける必要があります。

AutoFilterを使ったほうが良い点

AutoFilterは手軽(検索条件をエクセルに記述しなくていい)

AdvancedFilterは検索条件をエクセルに書く必要があります。
ということは、

  • 書くためのスペースを用意したり、
  • マクロを動かす前に検索条件を入力したり、
  • マクロ内で検索条件を自動入力する場合は書式に気をつけてあげたりしなければいけません。

Autofilterはコード内に条件を書き込むので、シートをすっきりさせられます。

検索条件を変化させながらマクロを動かす場合は楽(二段階リストなど、コードあります)

例えば列Aの値aを検索後、列Bにある値を取得し、その中からさらに検索をかける場合、
いわゆる2段階リストを作る際にはAdvancedFilterでは難しいです。

例えば、
下記表にて、年月をフィルタリングして、7月の果物のリスト、8月の果物のリストが作りたいとします。

Sub 二段階リスト()

Dim table As ListObject 'テーブル変数
Dim dicDate As New dictionary '一段階目(年月)のリスト
Dim dicFlt As New dictionary '二段階目(果物)のリスト
Dim r As Range 'Dictionaryオブジェクトに入れるための変数(レンジオブジェクト)
Dim L1, L2 As Variant 'Dictionaryオブジェクトからキーを取り出すための変数
Dim str As String 'メッセージボックス用の変数(文字列)
Set table = ActiveSheet.ListObjects(1)

'一段階目(年月)のリスト作成
For Each r In table.ListColumns("年月").DataBodyRange
    On Error Resume Next
        dicDate.Add r.Value, r.Value
    On Error GoTo 0
Next

'一段階目のリストをFor eachでまわし、それぞれフィルタリングする
'フィルタリング後のデータを二段階目のリストに格納する
For Each L1 In dicDate
    table.Range.AutoFilter
    table.Range.AutoFilter field:=table.ListColumns("年月").Index, Criteria1:=L1
    For Each r In table.ListColumns("果物").DataBodyRange.SpecialCells(xlCellTypeVisible)
        On Error Resume Next
            dicFlt.Add r.Value, r.Value
        On Error GoTo 0
    Next
    
    'メッセージボックス用に文字列を格納する
    For Each L2 In dicFlt
        str = str & "一段階目:" & L1 & "  " & "二段階目:" & L2 & vbCrLf
    Next
Next

MsgBox str

End Sub

コメントとメッセージボックスで少し長くなりますが、
それを除けば案外コンパクトになると思います。
結構使えるアイデアです!!

これをAdvancedFilterでやると結構面倒です。
書きたくないのでやりません笑

AutoFilterボタンが出るので、マクロ後のエクセル操作がストレスない

見出しに三角のボタンがAutoFilterでは出るので、
マクロを動かした後、エクセルを触る際、手軽に抽出条件を変えたり出来ます。

AdvancedFilterを使ったほうが良い点

複雑な抽出条件処理をする場合

これはAdvancedFilterの存在意義みたいなものだと思いますが、
AutoFilterは基本的に検索条件を3つ以上つなげることは出来ません。
バナナとリンゴとメロンを抽出したいというのは基本的にはできません。

基本的にというのはIf文を使えばできるようになるのですが、
AutoFilterの基本的な使い方でご紹介していますのでよければどうぞ

AdvancedFilterでは、
例えば一度のフィルターで

  • 2021年度
  • 千葉県以外
  • 営業一部と二部と三部の売上

を抽出ということもできます。
Autofilterでは基本できません。

検索条件が可視化される

エクセルに検索条件が書かれるのでメンテナンスが楽になります。

エクセルに検索条件がかかれるので
条件を変えたい場合、エクセルを変えれば大丈夫です。
なので、VBAが使えない人でもメンテナンスができます。

逆に言うと簡単に変えられるので、
そこは注意が必要です。

結局どちらを使うべきなのか

  • Autofilterは手軽に簡単な検索をかけられる。
  • AdvancedFilterは複雑な検索をかけられ、検索条件が可視化できる。

という違いがあると思います。

それで結局どうすればよいかですが、

複雑な検索はAutoFilterでかけることができます。
列Aをフィルタリングした後、列Bをフィルタリングするみたいな使い方もAutofilterはできますし、
3つ以上の条件の検索もIf文を使えばできます。

なので、
検索条件をどうあつかっていくかが大きいと思います。

AdvancedFilter
検索条件がほぼ固定で可視化したいということであれば
AdvancedFilterがいいのではないでしょうか。
定型業務で複雑な検索条件を一回だけかけておしまいみたいなのは
かなりあっていると思います。

Autofilter
検索条件をエクセル上に書かずすっきりさせたい。
検索条件を変えながら連続的に抽出かけるなど、
流動的にもしくは手軽に抽出かける場合はこちらを使うべきです。

どちらも長所と短所があり、
状況によって使い分けるのがよいと思います。

ではでは。