【VBA】オートフィルターを使う

概要
VBAでオートフィルターを扱う方法をご紹介します。
VBAでオートフィルターを設定する
RangeのAutoFilterを使用
VBAでオートフィルターを使用するにはRangeのAutoFilterメソッドを使用します。
FilterTestシートにデータが入力されています。

このシートから下記の条件のデータをオートフィルターを使用して表示してみます。
- 種類が野菜
- 名前が空白ではない
- 備考が空白である
オートフィルターを設定するコード
オートフィルターを設定するコードは以下になります。
1Option Explicit
2Sub setFilter(sht As Worksheet)
3'###################################################################################
4'シートにオートフィルターを設定する
5'先頭行をヘッダーとする
6'-----------------------------------------------------------------------------------
7'引数 :ws シートオブジェクト
8'###################################################################################
9
10 Dim lastRow As Long
11 Dim lastCol As Long
12
13 lastRow = getMaxRowUsedRange(sht)
14 lastCol = getMaxColUsedRange(sht)
15
16
17 sht.Range(sht.Cells(1, 1), sht.Cells(lastRow, lastCol)).AutoFilter _
18 field:=1, Criteria1:="野菜" '入力されている値が「野菜」
19 sht.Range(sht.Cells(1, 1), sht.Cells(lastRow, lastCol)).AutoFilter _
20 field:=2, Criteria1:="<>" '空白ではない
21 sht.Range(sht.Cells(1, 1), sht.Cells(lastRow, lastCol)).AutoFilter _
22 field:=3, Criteria1:="=" '空白である
23
24End Sub
25
26Function getMaxRowUsedRange(sht As Worksheet) As Long
27
28 getMaxRowUsedRange = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row
29
30End Function
31Function getMaxColUsedRange(sht As Worksheet) As Long
32
33 getMaxColUsedRange = sht.UsedRange.Columns(sht.UsedRange.Columns.Count).Column
34
35End Function
1sht.Range(sht.Cells(1, 1), sht.Cells(lastRow, lastCol)).AutoFilter _
2 field:=1, Criteria1:="野菜" '入力されている値が「野菜」
field引数には数値を設定します。
Rangeで指定した範囲内の何列目のデータに対してオートフィルターの条件を設定するか指定します。
Rangeで指定した範囲の最も左の列が1となります。
今回はAからC列までの範囲を指定するので、A列が1,B列が2、C列が3になります。
Criteria1にはオートフィルターの条件を指定します。
入力内容 | 意味 |
---|---|
“文字列” | 文字列と同じものだけを表示 |
“<>” | 空白ではないものを表示 |
“=” | 空白であるものを表示 |
シートの最終行と最終列を取得するためにgetMaxRowUsedRangeとgetMaxColUsedRangeを使用しています。
https://kazusa-pg.com/vba-get-max-row-column-usedrange/
オートフィルター設定コードのテスト
test_setFilterを実行するとオートフィルターを設定します。
1Option Explicit
2Sub test_setFilter()
3
4 Dim sht As Worksheet
5 Set sht = ThisWorkbook.Worksheets("FilterTest")
6 Call setFilter(sht)
7
8 Set sht = Nothing
9
10End Sub
実行結果は以下になります。
3行目のデータのみ条件に合っているので、3行目のデータだけ表示されます。
他のデータは条件が違うのでフィルターが掛かり、表示されません。
オートフィルターを解除する
オートフィルターを解除するにはWorksheetオブジェクトのFilterModeを変更します。
オートフィルターを解除するコードは以下になります。
1Option Explicit
2Sub clearFilter(sht As Worksheet)
3'###################################################################################
4'シートにオートフィルターが設定されている場合、解除する
5'-----------------------------------------------------------------------------------
6'引数 :ws シートオブジェクト
7'###################################################################################
8
9 If sht.FilterMode Then sht.ShowAllData
10
11End Sub
12Sub test_clearFilter()
13
14 Dim sht As Worksheet
15 Set sht = ThisWorkbook.Worksheets("FilterTest")
16 If sht.FilterMode Then sht.ShowAllData
17
18 Set sht = Nothing
19
20End Sub
1If sht.FilterMode Then sht.ShowAllData
FilterModeがTrueのときはシートにオートフィルターが掛かっているので
WorksheetオブジェクトのShowAllDataメソッドを使用してデータをすべて表示します。