8/20/2019

Excel。VBAでオートフィルター。条件で数値を使うときには注意が必要です。【Auto filter】

Excel。VBAでオートフィルター。条件で数値を使うときには注意が必要です。

<Excel VBA>

大量のデータから抽出してコピーするなんてことは、日常茶飯事で行っている人も多いと思います。

そこで、Excel VBAで、オートフィルターで抽出するプログラム文を作っていきます。

次のような表があります。

売上高が3200のデータだけを抽出する場合、どのようなプログラム文をExcel VBAで作ればいいのでしょうか?

Sub オートフィルターで数値()
    Range("a1").AutoFilter field:=5, Criteria1:=3200
End Sub

たった、一行で完成ですね。

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

このように、売上高が3200のものだけが抽出することができました。

プログラム文を確認しておきましょう。
Range("a1").AutoFilter field:=5, Criteria1:=3200
オートフィルターを設定する時には、見出し行のセルをアクティブにしますので、それと同じように、Range("a1")に指示します。

.AutoFilter  は、オートフィルターを設定させる命令文ですね。
field:=5,  オートフィルターを設定した表の左から、5個目のフィールドつまり、売上高の列という意味ですね。

Criteria1:=3200 は、条件1として3200を設定して、実行すれば、3200だけのデータが抽出されたわけです。

【表示形式を設定してある場合は注意が必要】

では、次のような場合は、どうでしょうか?

今回は、売上高のデータに三桁区切りのカンマの表示形式が設定されています。

表示形式を設定してあるだけですから、セルのデータ自体は3200のままですよね。

では、先程のマクロを実行して、3200だけが抽出されるか確認してみましょう。

あれれ?データが1件も抽出されていません。

オートフィルターの条件である。
Criteria1という引数には、『文字列形式の値』を指定してあげる必要があります。

つまり、先程Criteria1:=3200と書きましたが、Criteria1:=”3200”とダブルコーテーションで囲ってあげる必要があったのです。

文字列形式なので、表示形式を設定してもセルの中身は同じという考え方ではダメということになるわけです。

なので、次のように修正する必要があります。

Sub オートフィルターで数値()
    Range("a1").AutoFilter field:=5, Criteria1:="3,200"
End Sub

Criteria1:="3,200"と変更してあります。
では、実行して確認してみましょう。

今回は、売上高が3,200のものが抽出することができました。

注意点は、Excel VBAのオートフィルターは、”セルに入力されている値”ではなくて、”見えている文字列”で抽出する特徴があります。

【比較演算子を使う】

条件が「売上高が3000以上」のデータを抽出する場合はどうしたらいいのでしょうか?
以上なので、「>=」という比較演算子を使うことになります。

Sub オートフィルターで数値()
    Range("a1").AutoFilter field:=5, Criteria1:=">=3000"
End Sub

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

比較演算子を使用することで、抽出することができます。

文字列ということがわかっていると、条件で、>=3000ではなく、">=3000"とダブルコーテーションを付ける必要があることが理解できます。

【区間での抽出条件】

最後に、2000以上3000未満というデータを抽出したい場合は、どのようにしたらいいのでしょうか?2つの条件になるので、引数Criteria2という条件2を使えばいいわけですね。

Sub オートフィルターで数値()
    Range("a1").AutoFilter field:=5, Criteria1:=">=2000", Criteria2:="<3000"
End Sub

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

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

Excel VBAは通常のExcelとはちょっと違うことがあったりしますので、注意が必要です。