このページでわかること
覚えること
- Autofilterメソッドの使い方(超基本)
Rangeオブジェクト.Autofilter Field:=(表の左から何番目), Criteria1:=(検索キーワード) - フィルタリングをキャンセルするとき
シートオブジェクト.AutoFilterMode = False もしくは、
Rangeオブジェクト.Autofilter - キーワード二つで処理するには
Rangeオブジェクト.Autofilter Field:=(表の左から何番目), Criteria1:=(検索キーワード), Operator:=xlAnd, Criteria2:=(検索キーワード) - 三つ以上のキーワードで処理できない
実務において必修科目の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だと思います。
設定値 | 内容 |
xlAnd | Criteria1とCriteria2を「かつ」で結ぶ |
xlOr | Criteria1と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
やりたいことわかりましたでしょうか?
新しい列を作り、該当のものに何か印(今回は〇)をつけて
その印をフィルタリングするという手法です。
回りくどいですが、しょうがないです。
新しい列がうっとうしければ非表示にしたりすればいいかもしれません。
いかがでしょうか。
次回は実務で使えそうな抽出のあれこれをやっていきたいと思います。
ではでは