Pocket

ExcelのVBA(エクセル マクロ)でAdvancedFilterを用いる際、うまい具合に複数の条件を用いてデータを抽出する方法について解説します。

AdvancedFilterは以下のように使用します。

Range("A7:E17").CurrentRegion.AdvancedFilter _
Action:=xlFilterInPlace, _
CriteriaRange:=Range("B1:E3"), _
Unique:=False

この時良くわからないのが、CriteriaRangeで指定する「AND条件」と「OR条件」の記述の仕方です。
(自分は分かりませんでした。)

結論から言うと、
AND条件は横に一行にまとめて書く
OR条件は縦に並べて書く
ということです。

例えば以下のような社員の表からデータを抽出することを考えます。

sampledata

ここで、
(年収が1000万円 AND 年収が800万円) OR (住所が青山 AND 性別が男)
という条件で抽出したい場合、上記のコードのようにCriteriaRangeで”B1:E3″を指定してやると、
以下のように目的のデータを抽出できます。

fil

ここで、抽出条件にしていした「”B1:E3″」を細かく見てみます。
項目はヘッダで一括で管理して、縦方向に条件式(囲われた部分)がORでつながっていくという感じです。

setumei

OR条件は縦に増やしていき、AND条件は横増やしていきましょう。
以下に条件例をいくつかあげます。

  • (年収が「1000」 AND 性別が「男」) OR (年収が「1000」 AND 性別が「女」)
    ⇒CriteriaRange:=Range(“B1:E3”)として
    ex1
  • (年収が「1000」 AND 性別が「男」) OR (年収が「1000」 AND 性別が「女」)
    OR (年収が「500」 AND 住所が「秋葉原」)
    ⇒CriteriaRange:=Range(“B1:E4”)として
    ex2

一般化すると以下のような形になります。

項目x 項目y 項目z
条件式1 x1 y1 z1
条件式2 x2 y2 z2

といった表を指定すると、
条件式1(x1 AND y1 AND z1 AND …)
OR 条件式2(x2 AND y2 AND z2 AND…)
OR …

という感じです。

ちょっと難しいですよね。

Pocket