VBA

【マクロVBA】複雑な抽出が簡単にできる!AdvancedFilterの基本的使い方

記事内に商品プロモーションを含む場合があります
このページでわかること

AdvancedFilterを使って、AutoFilterより複雑な処理が出来ます。
結果を離れた場所に書き出すことも出来ます。

覚えること
  1. 構文:Rangeオブジェクト.AdvancedFilter(Action , [CriteriaRange] , [CopyToRange] , [Unique] )
  2. 検索条件はエクセルに直接書く
  3. 「かつ」は横に並べて、「または」は縦に並べて検索条件書く
  4. 抽出結果は重複を消せる

こんにちは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をどう使い分けるかはまた、記事書きたいと思います。

ではでは。