8/06/2018

Excel。マクロ032。日付の抽出はクセが強いので、注意しないといけない点があります。【Date】

Excel。マクロ032。日付の抽出はクセが強いので、注意しないといけない点があります。

<Excel VBA:日付抽出>

Excelの作業の中でも、
「データを読み込んで」→「抽出」という流れはよくあるのですが、
これをマクロ化しておくと便利ということで、
Excel VBAで作ることがあるのですが、
その中でも日付を使った抽出には、
クセがあって、注意しないと、
「アレ?おかしいなぁ~」ということが発生します。

では、次のデータを使って確認してみましょう。

【Excel2007までのバージョンの問題】

日付フィールドを使って抽出するときに、
バージョンの問題というのがあります。

Excel VBAのプログラム文を見てみましょう。
Sub 日付抽出()
    Range("a1").AutoFilter field:=1, Criteria1:=DateValue("2019/4/21")
End Sub

このプログラム文を説明すると、
AutoFilter field:=1
これは、フィールドの1番目でフィルターを実行しますという行ですね。
1番目なので、日付のA列ということですね。

Criteria1:=DateValue("2019/4/21")
Criteriaは、条件のことですね。
Excel2003のDSUM関数などの、
データベース関数では、お馴染みの引数でした。

そして、DateValueが2019/4/21なので、
2019/4/21だったら抽出してね。

ということです。

今回は3件抽出されるはずです。
では、実行してみましょう。

アレ!抽出されませんでした?

実は、このマクロを実行したExcelはExcel2013なのです。

つまり、
Sub 日付抽出()
    Range("a1").AutoFilter field:=1, Criteria1:=DateValue("2019/4/21")
End Sub

は、Excel2007までは、このプログラム文でよかったのですが、
Excel2010以降で実行すると、抽出することができません。

失敗しちゃうのです。

原因は、
オートフィルターの機能がExcel2010で大幅に変わったからです。

なので、もし、古いExcelファイルをExcel2010以降で使用すると、
このように「なぜ?」ということが起こりますので、注意が必要です。

では、Excel2010以降ではどのようにしたらいいのかというと、

Sub 日付抽出()
    'Range("a1").AutoFilter field:=1, Criteria1:="2019/4/21"
End Sub

DateValueを使わないで実行してみましょう。

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

【表示形式を合わす必要がある】

先ほどの抽出条件を年月日に替えてみたら、
抽出することが出来るのでしょうか?

Sub 日付抽出()
    'Range("a1").AutoFilter field:=1, Criteria1:="2019年4月21日"
End Sub

では実行してみましょう。

抽出してくれません。シリアル値とは関係ないわけですね。

なので、データを年月日の表示形式に替えておいて、実行してみると、

抽出に成功しました。

なので、データを外部から読み込んできた場合に、
日付の表示形式を統一しておく必要があります。

【今年の抽出はThisYear。2月はFebruray ?で合っている!】

日付のフィルターには、今年など様々な条件をつけて抽出することができます。
これは、Excel2010以降のフィルターに追加された機能なので、
Excel2007以前では対応しません。

では、今年のデータを抽出する場合のプログラム文を確認しておきましょう。

Sub 日付抽出()
    Range("a1").AutoFilter field:=1, Operator:=xlFilterDynamic, Criteria1:=xlFilterThisYear
End Sub

では、実行してみましょう。

問題なく抽出することができましたね。

では、2月のデータを抽出してみましょう。
プログラム文はこうなります。

Sub 日付抽出()
    'Range("a1").AutoFilter field:=1, Operator:=xlFilterDynamic, Criteria1:=xlFilterAllDatesInPeriodFebruray
End Sub

では、実行してみましょう。

無事に抽出することができましたね。

といいたいところなのですが、
英語を少し知っている方だと、違和感ありますよね。

Criteria1:=xlFilterAllDatesInPeriodFebruray
の、『Februray』。

そうなんです。スペルがおかしいのです。

2月は、『February』なはずですが、aとrが逆が正解なんですね!

全く持って不思議なのですが、スペルミスが正解。

なぜなんだか?

そこで、今後修正することがあれば、
直さないといけなくなりますが、修正することはないと思いますので、
ずっとスペルミスのままですね。

ということで、
日付の抽出には、クセが強いので、注意してください。