
VBAでオートフィルターをかけるとコピペなどで重宝します。
要点を抑えれば簡単なので、初心者でも実装できますよ。

・フィルターを使って効率よくコピペしたい
・ファイルを開いたら勝手にフィルターしてほしい
・特定のセルに入力した値で、表示する項目を変えたい
こんな悩みを解決する内容です。
Autofilterを使えば自動でフィルタリングをかけることができます。
ただ、データをフィルターするだけなら手動とほとんど手間が変わりませんよね。
本記事ではもっと踏み込んだ自動化方法についても解説します。
・ファイルを開いたら自動でフィルタリングする
・特定のセルに入力したデータを参照してフィルタリングする
Autofilter
Autofilterの使い方
オートフィルターをかけるには、Autofilterを使います。
例えば、以下のようにデータが並んでいるとします。

A列に入っているサンプル名でフィルターをかけてみましょう。
Sub test()
Columns(1).AutoFilter field:=1, Criteria1:="A"
End Sub

こんな感じで、”A”だけ残っていれば成功です!!

フィルターをかけたい範囲(実行範囲)を指定し、Autofilterと書きます。
Criteria1:表示したいデータ(今回は”A”)
もちろん”B”を表示したいならCriteria1 := “B”です。

フィルターしたい範囲の指定方法が、、、わからない、、、
こんな方は、セル,シート,ファイルの指定方法について解説した記事をご覧ください。
大文字小文字は区別しない
Autofilterは大文字と小文字を区別しません。
以下のように、A列に”sampleA”と”SampleA”があるとします。

Sub test()
Columns(1).AutoFilter field:=1, Criteria1:="sampleA"
End Sub
引数Criteria1を”sampleA”にました。
実行してみると、どちらも表示されているはずです。
つまりAutofilterでは大文字小文字は区別されないってことですね。
2つのデータを表示する方法
複数のデータを表示したい場合は、引数OperatorとCriteria2を設定します。
例えば「”A”または”B”を表示したい」なら以下の通りです。
Sub test()
Columns(1).AutoFilter field:=1, Operator:=xlOr, Criteria1:="A", Criteria2:="B"
End Sub

“A”も”B”も表示されていますね。

xlAnd:かつ(”A”かつ”B”⇒何も表示されない)
3つ以上のデータを表示する方法
3つ以上のデータを表示させたいなら配列を使います。
配列とは、簡単に言うとデータが入っているリストのことです。
例えば下図で、A列に”A”,”B”,”C”が表示されるようにフィルターをかけたいとします。

Sub test()
Dim myArray(2) As String
myArray(0) = "A"
myArray(1) = "B"
myArray(2) = "C"
Columns(1).AutoFilter field:=1, Criteria1:=myArray, Operator:=xlFilterValues
End Sub

まず、配列myArrayを作成して”A”,”B”,”C”を入れましょう。
次に、引数Criteria1に作成した配列を渡して、OperatorはxlFilterValuesにすればOKです!!


myArray(3) = “D”を追加すれば、”D”も表示されますよ!!
複数列を対象に絞り込む方法
下図のように、サンプル名に”A”と”B”、そして条件に”C”と”D”があるとします。

サンプル名が”A”で条件が”C”であるデータのみを表示させましょう。
Sub test()
Range(Columns(1), Columns(2)).AutoFilter field:=1, Criteria1:="A"
Range(Columns(1), Columns(2)).AutoFilter field:=2, Criteria1:="C"
End Sub
フィルターする範囲を1,2列にして、fieldで絞り込む対象を決めます。

例えば、A列は実行範囲における1列目なので、field := 1に対応します。
”A”と”C”を表示したいので、field := 1が”A”で、2が”C”ですね。
実行すると以下の通りです。

ちなみにWithでコードをまとめるとスッキリ書けます。
Sub test()
With Range(Columns(1), Columns(2))
.AutoFilter field:=1, Criteria1:="A"
.AutoFilter field:=2, Criteria1:="C"
End With
End Sub
With~End Withまでの間では、” . “から始めたコードは”Range(Columns(1), Columns(2))”の続きとして認識されます。
▼ボタンを非表示にする方法
フィルターマークの▼を表示したくないなら、visibledropdownをFalseにしましょう。

Sub test()
Columns(1).AutoFilter field:=1, Criteria1:="sampleA", visibledropdown:=False
End Sub

この方が見た目がスッキリしますが、手動でフィルターを操作できなくなるので注意してください。
特定の項目で絞り込んでコピーするプログラム
実務向けとして、フィルターとコピペを組み合わせたプログラムを紹介します。
別ファイルである“Book1.xlsx”から、”A”のみをコピーしましょう!!

①処理対象を定義する
Sub test()
Dim copyWs As Worksheet
Dim pasteWs As Worksheet
Set copyWs = Workbooks("Book1.xlsx").Worksheets(1)
Set pasteWs = ThisWorkbook.Worksheets(1)
MsgBox copyWs.Cells(1, 1)
MsgBox pasteWs.Cells(1, 1)
End Sub
コピー先や貼り付け先のシートをSetで変数として定義します。
PasteWs:貼り付け先のシート
Dimでそれぞれの変数がシートであることを定義して、Setでどのシートか設定しましょう。
オブジェクトの指定方法がわからない方は、以下の記事を参考にしてください!!
②コピーしたいデータに絞り込む
Sub test()
Dim copyWs As Worksheet
Dim pasteWs As Worksheet
Set copyWs = Workbooks("Book1.xlsx").Worksheets(1)
Set pasteWs = ThisWorkbook.Worksheets(1)
copyWs.Columns(1).AutoFilter field:=1, Criteria1:="A"
End Sub
今回紹介したAutofilterで”A”が残るようにフィルターをかけました。
あとはこれをコピペするだけです!!
③コピペする
Sub test()
Dim copyWs As Worksheet
Dim pasteWs As Worksheet
Set copyWs = Workbooks("Book1.xlsx").Worksheets(1)
Set pasteWs = ThisWorkbook.Worksheets(1)
copyWs.Columns(1).AutoFilter field:=1, Criteria1:="A"
endRow = copyWs.Cells(Rows.Count, 1).End(xlUp).Row
copyWs.Activate
copyWs.Range(Cells(2, 2), Cells(endRow, 2)).copy
pasteWs.Cells(2, 1).PasteSpecial
Application.CutCopyMode = False
pasteWs.Activate
End Sub
絞り込んだ範囲をCopyでコピーして、PasteSpecialで貼り付けます。
実行すると”A”のみがプログラム実行ファイルに転記されているはずです!!

コピペの方法については以下の記事で解説していますので、参考にどうぞ!
ファイルを開いたら自動でフィルターするプログラム
イベントプロシージャを使えばAutoFilterの実行を自動化できます。
プログラムを書く画面の左端にある、”ThisWorkbook”をダブルクリックしましょう。


左上を”Workbook”右上を”Open”にします。
これでファイルを開いたときに自動実行するプログラムが書けます。
Private Sub Workbook_Open()
Worksheets(1).Columns(1).AutoFilter field:=1, Criteria1:="A"
End Sub
中身は冒頭に紹介したA列の絞り込みにしました。
Worksheets(1)を指定しているので、1枚目のシートでフィルターが実行されます。

あとはフィルターの条件を自分好みに変えてみてください。
特定のセルの値を参照してフィルターするプログラム

A1セルのデータを変えたら勝手にフィルターしてほしい!!
こんな時もイベントプロシージャが役立ちます。
下図のように、絞り込みたいデータがあるシートをダブルクリックしましょう。

このように、ウィンドウが現れるはずです。
左上を”Worksheet”右上を”Change”にしましょう。
すると、セルのデータが変わったときに自動実行するプログラムが書けます。

“Change”なのにシートを切り替えたときじゃないの?

そう。これはややこしいけど”セルが編集されたとき”なんやね。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Row = 1 Then
c = Cells(1, 1).Value
Columns(2).AutoFilter field:=1, Criteria1:=c
End If
End Sub
編集されたセルはTargetとして受け取られます。
このセルの行と列が1、つまりA1なら実行するようにif文を使いました。
あとはAutoFileterを実行して、Criteria1にA1セルの値を渡すだけです!!
イベントプロシージャについては以下の記事で詳しく解説しています。
まとめ
今回はフィルターによるデータの絞り込みを自動化してみました。
報告用資料作成やデータ集計で役に立つのでぜひ使ってみてください!!
コメント