VBA

<実務で必須!>Autofilterの基本的な操作

記事内に商品プロモーションを含む場合があります

このページでわかること

Autofilterを使ったデータのフィルタリングと必要なデータの抽出ができます。

覚えること

  1. Autofilterメソッドの使い方(超基本)
    Rangeオブジェクト.Autofilter Field:=(表の左から何番目), Criteria1:=(検索キーワード)
  2. フィルタリングをキャンセルするとき
    シートオブジェクト.AutoFilterMode = False もしくは、
    Rangeオブジェクト.Autofilter
  3. キーワード二つで処理するには
    Rangeオブジェクト.Autofilter Field:=(表の左から何番目), Criteria1:=(検索キーワード), Operator:=xlAnd, Criteria2:=(検索キーワード)
  4. 三つ以上のキーワードで処理できない

実務において必修科目のAutofilterです。
比較的学習しやすく、実務がみるみる楽になるので、
もしまだ学習してない方は今回覚えましょう。
やっていきましょう。

Autofilterメソッドの基本構文

構文:Rangeオブジェクト.Autofilter([Field],[Criteria1],[Operator],[Criteria2],[VisibleDropDown])

Fieldは表の左から何番目かを指定します。
Criteria1と2は検索するキーワードを指定します。
Operatorは抽出条件の設定ができます(例えばCriteria1と2を”かつ”で処理するか”または”で処理するか)
VisibleDropDownはAutofilterのボタンの表示の有無ですが、無視していいです。

簡単な例をやっていきましょう。
下記のような表で「産地」を日本だけ抽出したいと思います。

Sub Autofilter()

ActiveSheet.Range("A1").Autofilter Field:=1, Criteria1:="日本"

End Sub

めっちゃ簡単ですね。
Rangeオブジェクトのどこを指定すればよいかですが、
表に隣接する範囲ならどこでも大丈夫ですが、
変に処理されないように、表の左端(今回ならA1)を指定するのがおすすめです。

フィルタリングのキャンセル

シートオブジェクト.AutoFilterMode = False
 Rangeオブジェクト.Autofilter 

どちらでも大丈夫です。
個人的には
Rangeオブジェクト.Autofilter ばっかり使ってます。

書くのが楽なのと、
一度キャンセルして再度フィルタリングするときにWithでつなぐことができるので。

キーワードを二つ使ってフィルタリングする方法

今度は「産地」を日本とアメリカで検索してみましょう。

Sub Autofilter()

ActiveSheet.Range("A1").Autofilter _
        Field:=1, _
        Criteria1:="日本", _
        Operator:=xlOr, _
        Criteria2:="アメリカ"

End Sub

コードが長いので折りたたみました。
「スペースキー」+「_(アンダーバー)」を入れることで
コードを途中で折りたたむことができます。

Operatorでフィルタリングの条件を変えることができます。
色々ありますが、主に使うのはAndとOrだと思います。

設定値内容
xlAndCriteria1とCriteria2を「かつ」で結ぶ
xlOrCriteria1とCriteria2を「または」で結ぶ
xlFilterCellColorセルの背景色
xlFilterFontColor文字の色

他にも設定値はありますが、あまり使わないので、
まずは上記の表を抑えておくといいと思います。

三つ以上のキーワードで検索できない

さて、とても困ったことがあります。
Autofilterは三つ以上の検索には対応していません。
日本とアメリカと中国で検索したい、ということができません。

ここは工夫です。
下記コードをご覧ください。

Sub Autofilter()

Dim maxCol As Long '表の左右列
Dim maxRow As Long '表の最下段
Dim i As Long 'For文のためのインデックス番号


With ActiveSheet

    maxCol = .Cells(1, Columns.Count).End(xlToLeft).Column
    maxRow = .Cells(Rows.Count, "A").End(xlUp).Row
    
    '新たにAutofilterという項目を作る
    .Cells(1, maxCol + 1).Value = "Autofilter"
    
    'For文で表の上から下まで「産地」が日本、アメリカ、中国のものは
    'Autofilter列に〇を入力する
    For i = 2 To maxRow
        If .Cells(i, "A").Value = "日本" Or _
            .Cells(i, "A").Value = "アメリカ" Or _
            .Cells(i, "A").Value = "中国" Then
            
            .Cells(i, maxCol + 1).Value = "〇"
        End If
    Next i
    
    '〇のついているものだけフィルタリングする
    .Range("A1").Autofilter field:=maxCol + 1, Criteria1:="〇"
End With
End Sub

やりたいことわかりましたでしょうか?
新しい列を作り、該当のものに何か印(今回は〇)をつけて
その印をフィルタリングするという手法です。

回りくどいですが、しょうがないです。
新しい列がうっとうしければ非表示にしたりすればいいかもしれません。

いかがでしょうか。
次回は実務で使えそうな抽出のあれこれをやっていきたいと思います。

ではでは