Excel VBAでオートフィルタを扱ってみる(1)オートフィルタを表に設定する

Excel マクロ、VBA

スポンサーリンク

今回は、Excelのオートフィルタについて、VBAで記述する基本的な要領を書いてみる。

まあこれは、あんまりガチガチに覚えようとも理解しようとも思わなくて良いだろう。
私も正直、マクロを自動記録してから、それにより生成されたコードを拾って加工したりすることが多い。

Excel オートフィルタ関係 難しいがかなり役立つコマンド

今回は、Excelの表にオートフィルタを設定する例を扱い、次回はそれを強制的に解除する方法を扱う。

Excel VBAでオートフィルタを扱ってみる(2)フィルタリング状態を解除する

オートフィルタをExcelの表に設定する

それではまず、Excelのアクティブシートにオートフィルタを設定する例を考える。

たとえば上図のような表なら、よほど妙なケースでない限りオートフィルタは1行目に設定するわけだ。

で、この表に「まだオートフィルタが設定されていない場合」、ソースコードはこんな感じで良い。

この表に「まだオートフィルタが設定されていない場合」と断り書きした。
では「既にオートフィルタが設定されている場合」にこのコードを実行すると、意図とは逆に設定済みのオートフィルタが解除されてしまう。

後の方の例でも出てくるが、オートフィルタ関係のVBAは、オートフィルタが設定されているのかいないのか場合分けが面倒だ。

オートフィルタが設定済みか判定する

では、オートフィルタが設定済みだろうとそうでなかろうと、とにかくオートフィルタを設定済みの状態にするにはどうすれば良いか。
それにはAutoFilterModeというやつを使って、これがTrueかFalseか判定すれば良い。

このAutoFilterModeは文字通り、オートフィルタモードになっているかどうか判定するものだ。
そしてオートフィルタというのは、1つのシートに1つしか設定できないものだ(フィルタリングしたとき、行があちこち非表示になるから、そんなことができるものを何箇所も置けないからだろう)。

だからAutoFilterModeというのは、シート全体に対して判定を掛ける。

具体的には、次のようなコードにすれば良い。wsというシートに対してAutoFilterModeの判定を掛け、それがFalseなら改めてオートフィルタを設定しているというわけだ。

ws.AutoFilterMode Then

という書き方をしてるが、これは

ws.AutoFilterMode = True Then

なんて書き方をしてたら不細工だから「= True」を省略したものだ。

Excel VBA 処理実行前にチェックを通すソースコードの記入方法例

タイトル行の指定:セルを1個だけ指定するのが簡単で無難

さて上のソースコードでは、表の1行目がタイトル行になるから、その代表的なセルとしてA1セル=Cells(1, 1)を指定してそれに.AutoFilterとしてオートフィルタ設定した。
このとき指定するセルは、実は別にA1セルじゃなくて良い。

タイトル行たる1行目のセルならどれでも良いのだが、それどころかこの表の中ならどのセルでも良い。
なんならE3セル=Cells(3, 5)とかでも良い。

まあ要は、表の中のセルが指定されれば、見出しとなるセルも自動的に推測されるというわけ。

と言っても、通常はそんなひねくれたことをせずに、素直にA1セル=Cells(1, 1)を指定しておけば良いだろう。
なんならA1:I1セルを丸ごと

ws.Cells(1, 1).Resize(1, 9).AutoFilter

とか

Range(ws.Cells(1, 1), ws.Cells(1, 9)).AutoFilter

などと指定しても良い。
・・・けどこの指定だと、もしI列以降のJ列とかまで見出しに含める必要があったときも、変わらずA1:I1セルまでしか見出しに含まれなくなって融通が利かなくなるので、やはりやめた方が良いかなと思う。

条件でフィルタリングする

では表を再掲するが、

この表にオートフィルタを設定し、表のB列「姓」が「田の文字を含むor中の文字を含む」条件でフィルタリング

するマクロを例に書いてみる。

この場合は先ほどと違い、単にオートフィルタを設定するのではなく絞り込みまでするので、オートフィルタが設定済みかをAutoFilterModeで判定する必要はない。

ソースコードは下記のようになる。

だいたい見れば分かるだろうが、

  • Field:=2 というのが、2列目=B列に絞り込みを掛けるということ。
  • Criteria1、Criteria2というのが、1個目・2個目の条件を指す。「*」文字を使っているがこれはワイルドカードというやつで、何か任意の文字(文字数は0を含め幾つでも良い)という意味だ。
  • Operator:=xlOrというのがOr条件を指す。(And条件にしたいならOperator:=xlAnd)

ということだ。

細かく語っていたら切りが無いので、この辺りにしておく。

スポンサーリンク