スポンサーリンク

Excelマクロでオートフィルターをかける方法|Autofilter

VBA

Autofilterを使えば自動でフィルタリングをかけることができます。

AutoFilterのコード例

整理してデータを見やすくできたり、コピペするときにも便利です。

Autofilter

Autofilterの使い方

データの入力例

このようにデータが並んでいるとします。
A列に入っているサンプル名でフィルターをかけてみましょう。

Sub test()

Columns(1).AutoFilter field:=1, Criteria1:="A"

End Sub
Aだけをフィルターした後の図

こんな感じで”A”だけ残っていれば成功です。
フィルターをかけたい範囲(実行範囲)を指定し、Autofilterと書きましょう。

AutoFilterのコード例
field:実行範囲において、何列目か
Criteria1:表示したいデータ(今回は”A”)

もちろん”B”を表示したいならCriteria1 := “B”です。
>>Excelマクロでセル,シート,ファイルを指定する方法

大文字小文字は区別しない

Autofilterは大文字と小文字を区別しません。
例えば、A列に”sampleA”と”SampleA”があるとします。

Sampleの大文字小文字がわかれている例
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
Criteriaで条件を追加するコード
xlOr:または(”A”または”B”)
xlAnd:かつ(”A”かつ”B”⇒何も表示されない)
CriteriaでAB両方を残した図

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

3つ以上のデータを表示する方法

3つ以上のデータを表示させたいなら配列を使います。
配列とは、簡単に言うとデータが入っているリストのことです。

例えば、”A”,”B”,”C”が表示されるようにフィルターをかけたいとします。

AutoFilterで複数のデータを残したい図
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
AutoFilterで複数のデータを残すコード

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

AutoFilterでABCを残した後の図

myArray(3)=”D”を追加すれば、”D”も表示されます。

複数列を対象に絞り込む方法

複数の列を参照してフィルターする方法です。
サンプル名に”A”と”B”、そして条件に”C”と”D”があるとします。

AutoFilterで複数の列を参照したい図

サンプル名が”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で絞り込む対象を決めます。

AutoFilterでAB列を参照する図

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

AutoFilterでABを参照した後の図

ちなみに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にしましょう。

AutoFilterで▽マークが残った図
Sub test()

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

End Sub
AutoFilterで▽を消した後の図

この方が見た目がスッキリしますが、手動でフィルターを操作できなくなるので注意してください。

使用例:特定の項目で絞り込んでコピペする方法

別ファイルの”Book1.xlsx”から、”A”のみをフィルターしてコピペしましょう。

SampleAをコピーしたい図

①処理対象を定義する

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で変数として定義します。

CopyWs:コピーしたいデータがあるシート
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”のみがプログラム実行ファイルに転記されているはずです!!

FindNextでサンプルAを見つけてコピーした後の図

【関連記事】Excelマクロでコピペをする方法

使用例:ファイルを開いたら自動でフィルターする方法

イベントプロシージャを使えばAutoFilterの実行を自動化できます。
プログラムを書く画面の左端にある、”ThisWorkbook”をダブルクリックしましょう。

ThisWorkbookに登録する図
WorkBookを開いたときに起動するプログラムを書くウィンドウ

左上を”Workbook”右上を”Open”にします。
これでファイルを開いたときに自動実行するプログラムが書けます。

Private Sub Workbook_Open()

Worksheets(1).Columns(1).AutoFilter field:=1, Criteria1:="A"

End Sub

中身は冒頭に紹介したA列の絞り込みにしました。
Worksheets(1)を指定しているので、1枚目のシートでフィルターが実行されます。

使用例:特定のセルの値を参照してフィルターする方法

例えば、A1セルに入力した値でB列をフィルターするようにしましょう。
下図のように、絞り込みたいデータがあるシートをダブルクリックしましょう。

イベントプロシージャでセルの変更を受け取る図

左上を”Worksheet”右上を”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セルの値を渡すだけです。

【関連記事】イベントプロシージャでプログラムを自動実行する方法

まとめ

今回はフィルターによるデータの絞り込みを自動化してみました。
報告用資料作成やデータ集計で役に立つのでぜひ使ってみてください。

コメント

タイトルとURLをコピーしました