スポンサーリンク
今回は、Excelのオートフィルタについて、VBAで記述する基本的な要領を書いてみる。
まあこれは、あんまりガチガチに覚えようとも理解しようとも思わなくて良いだろう。
私も正直、マクロを自動記録してから、それにより生成されたコードを拾って加工したりすることが多い。
今回は、Excelの表にオートフィルタを設定する例を扱い、次回はそれを強制的に解除する方法を扱う。
オートフィルタをExcelの表に設定する
それではまず、Excelのアクティブシートにオートフィルタを設定する例を考える。
たとえば上図のような表なら、よほど妙なケースでない限りオートフィルタは1行目に設定するわけだ。
で、この表に「まだオートフィルタが設定されていない場合」、ソースコードはこんな感じで良い。
1 2 3 |
Dim ws As Worksheet: Set ws = ActiveSheet ws.Cells(1, 1).AutoFilter |
この表に「まだオートフィルタが設定されていない場合」と断り書きした。
では「既にオートフィルタが設定されている場合」にこのコードを実行すると、意図とは逆に設定済みのオートフィルタが解除されてしまう。
後の方の例でも出てくるが、オートフィルタ関係のVBAは、オートフィルタが設定されているのかいないのか場合分けが面倒だ。
オートフィルタが設定済みか判定する
では、オートフィルタが設定済みだろうとそうでなかろうと、とにかくオートフィルタを設定済みの状態にするにはどうすれば良いか。
それにはAutoFilterModeというやつを使って、これがTrueかFalseか判定すれば良い。
このAutoFilterModeは文字通り、オートフィルタモードになっているかどうか判定するものだ。
そしてオートフィルタというのは、1つのシートに1つしか設定できないものだ(フィルタリングしたとき、行があちこち非表示になるから、そんなことができるものを何箇所も置けないからだろう)。
だからAutoFilterModeというのは、シート全体に対して判定を掛ける。
具体的には、次のようなコードにすれば良い。wsというシートに対してAutoFilterModeの判定を掛け、それがFalseなら改めてオートフィルタを設定しているというわけだ。
1 2 3 4 5 6 |
Dim ws As Worksheet: Set ws = ActiveSheet If ws.AutoFilterMode Then Else 'オートフィルタが掛かっていないと判定された時だけ実行 ws.Cells(1, 1).AutoFilter End If |
ws.AutoFilterMode Then
という書き方をしてるが、これは
ws.AutoFilterMode = True Then
なんて書き方をしてたら不細工だから「= True」を省略したものだ。
タイトル行の指定:セルを1個だけ指定するのが簡単で無難
さて上のソースコードでは、表の1行目がタイトル行になるから、その代表的なセルとしてA1セル=Cells(1, 1)を指定してそれに.AutoFilterとしてオートフィルタ設定した。
このとき指定するセルは、実は別にA1セルじゃなくて良い。
タイトル行たる1行目のセルならどれでも良いのだが、それどころかこの表の中ならどのセルでも良い。
なんならE3セル=Cells(3, 5)とかでも良い。
まあ要は、表の中のセルが指定されれば、見出しとなるセルも自動的に推測されるというわけ。
と言っても、通常はそんなひねくれたことをせずに、素直にA1セル=Cells(1, 1)を指定しておけば良いだろう。
なんならA1:I1セルを丸ごと
とか
などと指定しても良い。
・・・けどこの指定だと、もしI列以降のJ列とかまで見出しに含める必要があったときも、変わらずA1:I1セルまでしか見出しに含まれなくなって融通が利かなくなるので、やはりやめた方が良いかなと思う。
条件でフィルタリングする
では表を再掲するが、
するマクロを例に書いてみる。
この場合は先ほどと違い、単にオートフィルタを設定するのではなく絞り込みまでするので、オートフィルタが設定済みかをAutoFilterModeで判定する必要はない。
ソースコードは下記のようになる。
1 2 3 4 5 |
Dim ws As Worksheet: Set ws = ActiveSheet 'B列が「田」の文字を含むor「中」の文字を含む条件でフィルタリング ws.Cells(1, 1).AutoFilter Field:=2, _ Criteria1:="=*田*", Operator:=xlOr, _ Criteria2:="=*中*" |
だいたい見れば分かるだろうが、
- Field:=2 というのが、2列目=B列に絞り込みを掛けるということ。
- Criteria1、Criteria2というのが、1個目・2個目の条件を指す。「*」文字を使っているがこれはワイルドカードというやつで、何か任意の文字(文字数は0を含め幾つでも良い)という意味だ。
- Operator:=xlOrというのがOr条件を指す。(And条件にしたいならOperator:=xlAnd)
ということだ。
細かく語っていたら切りが無いので、この辺りにしておく。
スポンサーリンク