[ VBA ] オートフィルタで絞り込んだ結果を選択する
VBAで、オートフィルタで絞り込んだ結果を選択するのって、簡単なようで実はちとめんどくさいんですよね。前に書いた「[VBA] Selectionの一番上の行だけ選択を解除する方法」とも関連する話ですが、ここでもう一度まとめてみたいと思います。
オートフィルタで絞り込んだ結果の選択がめんどくさい理由と選択方法
オートフィルタで絞り込んだ結果の選択について、何がめんどくさいかって言うとですね、「xlCellTypeVisible」という便利そうなものが実はいまいち使えないってことなんですね。どういうことかというと、この「xlCellTypeVisible」は「すべての可視セル」を返してくれるんですが、オートフィルタでしぼった時のタイトル行まで含んじゃってるんですね。普通は、このタイトル行に対して何かするってことはないと思うので、これを削除しないといけません。そこがめんどくさいんですね。
「[VBA] Selectionの一番上の行だけ選択を解除する方法」で書いたことを使って、まずフィルタを適用している範囲を取得してから一番上の行を解除した後、可視セル(xlCellTypeVisible)を使って取得しなおすのが一番簡単じゃないかなと思います。つまり、こういうことです。
Dim filterRange As Range Set filterRange = Range("A1").CurrentRegion Set filterRange = Application.Intersect(filterRange, filterRange.Offset(1, 0)) Set filterRange = filterRange.SpecialCells(xlCellTypeVisible)
オートフィルタの適用範囲がA1セルを含んでいるとしています。1つ目のsetは、A1を含むアクティブセルを取得しています。2つ目のsetでは、その範囲とそれを1個下にずらした範囲との共通部分、つまり、先ほどの範囲から一番上の行を除いた部分を取得しています。そして最後のsetで、さらに可視セルの部分だけを取得しています。
あとは、これを選択するなり、コピーするなり、データ加工するなりすればいいわけですね。
他の方法との比較
オートフィルタで絞り込んだ結果の選択については、ググってみると、ここのサイトなどが出てきます。
Office TANAKA - Excel VBA Tips[オートフィルタを使い倒す]
ここのサイト、すごくボリュームが多くて、エクセルとかVBAのことを検索するとよくヒットします。僕も参考にさせてもらってます。ここのサイトでは、コピペしてからタイトル行を削除するとか、2行目以降の範囲と可視セルとの共通部分を取得するなどとしていますが、少し書き方が複雑な気がします。「一番上の行を除き、それに対して操作する」という上に書いたやり方の方が個人的にはわかりやすいと思います。