9/13/2019

Excel。Excel VBAでオートフィルター。日付で抽出が意外と難しい【Auto filter】

Excel。Excel VBAでオートフィルター。日付で抽出が意外と難しい

<Excel VBA:オートフィルター>


いつも行っている作業を効率化するにあたり、Excel VBAでマクロを作成することがあります。

今回は、オートフィルターをつかって、指定した日付を抽出するマクロを作りたいわけですが、意外と難しいというか、クセがありますので、確認をしていきましょう。

次の表があります。

G1に入力した日付を抽出するマクロを作っていきます。

Sub オートフィルター日付編()
    Range("a1").AutoFilter field:=2, Criteria1:=Range("g1")
End Sub

オートフィルターを1行目の見出しに設定して、2列目のフィールドである日付に、条件1(Criteria1)として、セルG1の値と同じものを抽出する。

という構文ですが、実行するとエラーではないのですが、希望通りに抽出することができません。

とりあえず、実行してみましょう。

ご覧のように、抽出されません。

なぜ、このようなことが起こってしまったのでしょうか?
原因は、Excel VBAの特性をしっかり把握していない点があげられます。

Excel VBAのオートフィルターは、
・条件は文字列型で指定する必要がある。
・可視されている文字列で指定する必要がある。

この2つの約束を守る必要があります。

そこで、改めて構文を見直してみましょう。
    Range("a1").AutoFilter field:=2, Criteria1:=Range("g1")
Criteria1:=Range("g1")ですが、正確には、Criteria1:=Range("g1").valueとvalueが省略されているわけですね。

valueプロパティは「セルに入力されている値」を指しますが、必要なのは、可視。

すなわち「セルに表示されている文字列」を取得しなければいけません。

なので、次のように構文を修正して実行してみましょう。

Sub オートフィルター日付編()
    Range("a1").AutoFilter field:=2, Criteria1:=Range("g1").Text
End Sub

valueプロパティではなくて、Textプロパティを使います。

このように抽出することができました。

ところが、日付でも次の表では抽出することができません。

今回は、B列の日付が、0(ゼロ)付きの日付になっています。
表示形式がyyyy/mm/ddと設定されています。

では、先程のマクロを実行してみましょう。

ご覧のように抽出できませんでした。

原因は、
・可視されている文字列で指定する必要がある。
この条件に抵触したからです。

G1は、0(ゼロ)付きの表示形式ではありません。
なので、G1にyyyy/mm/ddという表示形式を設定して、マクロを実行してみましょう。

抽出することができましたね。
このように、表示形式にも注意を払う必要があります。

仮に、年月日の日付だったら、年月日に、元号表示なら、元号表示にする必要が発生します。

実際の運用上、いちいち、表示形式を合わせるような設定を行うのは面倒です。

そこで、構文を次のように改造してみます。

Sub オートフィルター日付編改造版()
    Range("a1").AutoFilter field:=2, Criteria1:=Format(Range("g1"), Range("b2").NumberFormatLocal)
End Sub

ちょっと長くなりましたが、
Format関数は表示形式の関数ですね。
その引数は、G1の表示形式を、B2の表示形式にする(NumberFormatLocalプロパティ)という構文です。

このようにすれば、抽出条件とデータとの表示形式が合致することができます。

実行して確認してみましょう。

無事に抽出されましたね。

ということで、日付での抽出は色々考えないといけないことがありますので、注意して使っていくといいですね。