AdvancedFilterを使って、AutoFilterより複雑な処理が出来ます。
結果を離れた場所に書き出すことも出来ます。
- 構文:Rangeオブジェクト.AdvancedFilter(Action , [CriteriaRange] , [CopyToRange] , [Unique] )
- 検索条件はエクセルに直接書く
- 「かつ」は横に並べて、「または」は縦に並べて検索条件書く
- 抽出結果は重複を消せる
こんにちはhokkyokunです。
AdvancedFilterについて解説します。
AdvancedFilterはAutoFilterよりも複雑な抽出を簡単に行うことができます。
また、結果を離れた場所に書き出すこともできるので、コード量を抑えて、メンテナンスしやすくするこも可能です。
やってみましょう。
構文
Rangeオブジェクト.AdvancedFilter(Action , [CriteriaRange] , [CopyToRange] , [Unique] )
Action:抽出したデータの表示場所を指定
xlFilterInPlace:表内に表示
xlFilterCopy:別表に表示
CriteriaRange:検索条件を記述したセル範囲を指定する。省略すると全データが抽出される。
CopyToRange:Actionにて別表に表示(xlFilterCopy)を選んだ場合、ここで表示場所を指定する。
Unique:検索条件に一致する重複データの処理を決める
True:重複データを省く
False:重複データはそのまま
実際にやってみよう
下記のような表で複雑な条件で検索してみよう
- 購入日を2021/7/1~2022/1/31までとし、
- 果物はバナナ、リンゴ、みかん、
- スーパーは公園前以外
という条件で検索してみます。
検索条件の設定方法
検索条件はエクセルに書き込みます。
表の見出しと全く同じ文字列を頭につけ、
条件式を書き込みます。
式 | 例 | 説明 |
文字列や数値、日付 | リンゴ | 文字列や数値、日付と合致するレコード(データのある行)を抽出 |
<>文字列や数値、日付 | <>20 | 文字列や数値、日付と異なるレコード(データのある行)を抽出 |
>=数値、日付 | >=2021/5/6 | 数値や日付以上のレコード(データのある行)を抽出 |
<=数値、日付 | <=2021/8/30 | 数値や日付以下のレコード(データのある行)を抽出 |
かつ、またはの使い方
上記でいうと、
- 2021/7/1~2022/1/31 という条件と
- 公園前以外という条件を
同時に満たすものを
「かつ」
といいます。
エクセルに条件を横に並べます。
バナナ、リンゴ、みかんの
どれかがあてはまればいいという条件は
「または」
といいます。
エクセルに条件を縦に並べます。
かつ | 条件Aと条件Bを同時に満たす | エクセルに条件を横に並べる |
または | 条件AとBどちらか一方を満たす | エクセルに条件を縦に並べる |
Sub AdvancedFilter()
ActiveSheet.range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=ActiveSheet.range("I1").CurrentRegion
End Sub
無事フィルタリングできました。
AdvancedFilterには重複データを消すかそのままにするか選択することができます。
今回は設定をしなかったので、重複が残ったままです。
重複を解消しするマクロは
引数UniqueをTrueにするだけです。
Sub AdvancedFilter_重複削除()
ActiveSheet.range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=ActiveSheet.range("I1").CurrentRegion, _
Unique:=True
End Sub
重複を解消することができました。
まとめ
AdvancedFilterは引数が少なく結構簡単に使うことができます。
また、条件式がエクセルに書き込まれるので視認性がよく、メンテナンスも比較的簡単にできます。
AutoFilterとAdvancedFilterをどう使い分けるかはまた、記事書きたいと思います。
ではでは。