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プロパティ)という構文です。
このようにすれば、抽出条件とデータとの表示形式が合致することができます。
実行して確認してみましょう。
無事に抽出されましたね。
ということで、日付での抽出は色々考えないといけないことがありますので、注意して使っていくといいですね。