メインコンテンツへスキップ
【VBA】オートフィルターを使う

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

··3 分
Programming VBA
かずさプログラマー
著者
かずさプログラマー
業務の作業自動化を行っています。Go、VBA、Pythonを主に使用しています。過去にはC#、VB.Net、JavaScriptも使用していました。
目次

VBAでオートフィルターを扱う方法をご紹介します。

VBAでオートフィルターを設定する
#

RangeのAutoFilterを使用
#

VBAでオートフィルターを使用するにはRangeAutoFilterメソッドを使用します。

FilterTestシートにデータが入力されています。

このシートから下記の条件のデータをオートフィルターを使用して表示してみます。

  • 種類が野菜
  • 名前が空白ではない
  • 備考が空白である

オートフィルターを設定するコード
#

オートフィルターを設定するコードは以下になります。

Option Explicit
Sub setFilter(sht As Worksheet)
'###################################################################################
'シートにオートフィルターを設定する
'先頭行をヘッダーとする
'-----------------------------------------------------------------------------------
'引数  :ws       シートオブジェクト
'###################################################################################
  
  Dim lastRow As Long
  Dim lastCol As Long
  
  lastRow = getMaxRowUsedRange(sht)
  lastCol = getMaxColUsedRange(sht)
  
 
  sht.Range(sht.Cells(1, 1), sht.Cells(lastRow, lastCol)).AutoFilter _
                             field:=1, Criteria1:="野菜"  '入力されている値が「野菜」
  sht.Range(sht.Cells(1, 1), sht.Cells(lastRow, lastCol)).AutoFilter _
                             field:=2, Criteria1:="<>"    '空白ではない
  sht.Range(sht.Cells(1, 1), sht.Cells(lastRow, lastCol)).AutoFilter _
                             field:=3, Criteria1:="="     '空白である
  
End Sub

Function getMaxRowUsedRange(sht As Worksheet) As Long
  
  getMaxRowUsedRange = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row
  
End Function
Function getMaxColUsedRange(sht As Worksheet) As Long
  
  getMaxColUsedRange = sht.UsedRange.Columns(sht.UsedRange.Columns.Count).Column
  
End Function
sht.Range(sht.Cells(1, 1), sht.Cells(lastRow, lastCol)).AutoFilter _
                             field:=1, Criteria1:="野菜"  '入力されている値が「野菜」

fieldには数値を設定します。
Rangeで指定した範囲内の何列目のデータに対してオートフィルターの条件を設定するか指定します。 Rangeで指定した範囲の最も左の列が1となります。

今回はAからC列までの範囲を指定するので、A列が1,B列が2、C列が3になります。

Criteria1にはオートフィルターの条件を指定します。

入力内容 意味
“文字列” 文字列と同じものだけを表示
“<>” 空白ではないものを表示
“=” 空白であるものを表示

シートの最終行と最終列を取得するためにgetMaxRowUsedRangegetMaxColUsedRangeを使用しています。

【VBA】UsedRangeで最終行・最終列を取得する
·2 分
Programming VBA

オートフィルター設定コードのテスト
#

test_setFilterを実行するとオートフィルターを設定します。

Option Explicit
Sub test_setFilter()

  Dim sht As Worksheet
  Set sht = ThisWorkbook.Worksheets("FilterTest")
  Call setFilter(sht)
  
  Set sht = Nothing
  
End Sub

実行結果は以下になります。
3行目のデータのみ条件に合っているので、3行目のデータだけ表示されます。
他のデータは条件が違うのでフィルターが掛かり、表示されません。

オートフィルターを解除する
#

オートフィルターを解除するにはWorksheetオブジェクトFilterModeを変更します。

オートフィルターを解除するコードは以下になります。

Option Explicit
Sub clearFilter(sht As Worksheet)
'###################################################################################
'シートにオートフィルターが設定されている場合、解除する
'-----------------------------------------------------------------------------------
'引数  :ws       シートオブジェクト
'###################################################################################

  If sht.FilterMode Then sht.ShowAllData

End Sub
Sub test_clearFilter()

  Dim sht As Worksheet
  Set sht = ThisWorkbook.Worksheets("FilterTest")
  If sht.FilterMode Then sht.ShowAllData
  
  Set sht = Nothing
  
End Sub
If sht.FilterMode Then sht.ShowAllData

FilterModeTrueのときはシートにオートフィルターが掛かっているので
WorksheetShowAllDataメソッドを使用してデータをすべて表示します。

参考
#

関連記事

【VBA】クリップボードを利用する
·2 分
Programming VBA
【VBA】参照設定でファイルが見つからないのときの解決方法
·1 分
Programming VBA
【VBA】穴掘り法で迷路を自動生成
··6 分
Programming VBA アルゴリズム