ExcelVBAでオートフィルタを使ってみる

 仕事中にExcelでデータを簡単に抽出する方法を聞かれたので、そこで真っ先にオートフィルタを提案した。

 しかし、その都度フィルタを設定することが煩わしいということでボタンワンクリックでどうにかならないか?と言われる。

 ならばマクロで・・・という話になるのだが、私自身がオートフィルタをExcelVBAで操作したことがなかったので、とりあえずその場を流すことにした。

 帰宅後もオートフィルタをVBAで操作する方法が気になってしかたなかったので、いろいろとウェブサイトを閲覧しながら簡単に特に意味のないサンプルデータをもとに使い方を調べてみた。

オートフィルタ設定方法

 オートフィルタを設定するコードは以下の通り。

アクティブシートのRange(“A1”)基準にオートフィルタを設定

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

 オートフィルタを解除するコードは以下の通り。

アクティブシートに設定されたオートフィルタを解除する

 AutoFilterModeプロパティにfalseを設定することで解除することができる。なおfalseのみ指定可能でtrueを設定することはできない。

AutoFilterメソッドのパラメーター(引数)について

Range.AutoFilter メソッド (Excel) | Microsoft Docs

expression.AutoFilter (Field, Criteria1, Operator, Criteria2, SubField, VisibleDropDown)
Field:
 設定したオートフィルタの左側1列目を1フィールド目として整数で指定する。
Criterial1:
 1番目の抽出条件を文字列で指定する。ワイルドカード(?,*)も使用できる。
Operator:
 xlAutoFilterOperator列挙定数を指定する。よく使用する定数はxlAnd, xlOr, xlFilterValues。
 XlAutoFilterOperator 列挙 (Excel) | Microsoft Docs
Criterial2:
 2番目の抽出条件を文字列で指定する。Criterial1パラメーターと同様。
SubField:
 ?
VisibleDropDown:
 オートフィルタが適用された部分のドロップダウン表示のON/OFFを指定する。

単一抽出条件(引数指定あり)の方法

 単一による抽出条件を引数指定ありで書いた場合のコードは以下の通り

左から3フィールド目に”c”を含む文字列を抽出する

複合抽出条件(引数指定あり)の方法

 2つの抽出条件を引数指定ありで書いた場合のコードは以下の通り

左から3フィールド目に”p”もしくは”c”を含む文字列を抽出する

3つ以上の複合抽出条件(引数指定なし)の方法

 AutoFilterメソッドは基本的に2つまでしか抽出条件を指定できないため、3つ以上の抽出条件を指定するには配列を使用する。

1つ目の条件指定を配列にて3つ指定している

抽出条件(絞り込み)をリセットする方法

 抽出条件をリセットして全データを再表示するコードは以下の通り。

ShowAllDataメソッドで絞り込みをリセットする

 なお、オートフィルタにて絞り込みしていない状態でShowAllDataメソッドを実行するとエラーが発生するため、FilterModeメソッドで絞り込み判定に基づきクリア処理する手間が必要になる

FilterModeメソッドで絞り込み判定後、ShowAllDataメソッドを実行する

一通りコードを書きながらAutoFilterの使い方を調べてみて、意外にも細かい部分にて制限が多い機能であることに気が付いた。と言いつつ、データタブからオートフィルタを設定してフィールドごとに条件を指定する方法と機能的にそんなに変わらない発見もできた。普段使いなら、これで十分のようだ。