【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メソッドを使用してデータをすべて表示します。

参考

Range.AutoFilter メソッド (Excel)

Worksheet.ShowAllData メソッド (Excel)

関連ページ