オートフィルタで絞り込んだ時、該当するデータ(抽出データ)があるかどうかを判断するVBAを紹介します。
抽出する対象がない(データがない)と問題がありますか。
オートフィルタで絞り込んだ時に必ず抽出データが存在するなら問題ないことが多いです。
そうですよねぇ。
ではオートフィルタで絞り込んだあと、どのようなVBAを続けることが多いでしょう。
絞り込んだデータをコピペしたり、削除したり・・・ですかね。
そうですね。
では順を追って見ていきましょう。
オートフィルタで絞り込むVBA
Sub AutoFilter()
Sheets(“DATA”).Range(“A1:E20″).AutoFilter Field:=1, Criteria1:=”aaa”
End Sub
シート「DATA」のA1からE20までデータが入っています(1行目はタイトル)。
その範囲を選択し、オートフィルタをかけます。
今回はA列の「aaa」という文字列を絞り込み(抽出し)ます。
さて、絞り込んだデータを新しいシートへ貼り付けることにします。
Sheets(“DATA”).Range(“A1:E20”).Copy
Sheets(“NEW”).Range(“A1”).Select
ActiveSheet.Paste
Application.CutCopyMode = False
絞り込みに該当するデータがある場合、タイトル行とA列が「aaa」となっている行全体が新しいシートへ貼り付けられました。
絞り込みに該当するデータが無い場合はどうなるでしょう。
答えは、A1からE20まで「全データが貼り付けられる」です。
絞り込みに該当するすデータを削除するVBAの場合はA1からE20まで「全データが削除」になります。
おもった以上に困る結果になりますね。
そうですね。解決策は次のうようになります。
解決策
絞り込む前、対象データが有るかどうか調査するVBA
絞り込みをする前に、絞り込みたい列に該当するデータがあるかどうかを、CountIf関数で確認します。
Sub AutoFilter()
If WorksheetFunction.CountIf(ActiveSheet.Range(“A1:E20”), “aaa”) >= 1 Then
Sheets(“DATA”).Range(“A1:E20″).AutoFilter Field:=1, Criteria1:=”aaa”
Sheets(“DATA”).Range(“A1:E20”).Copy
Sheets(“NEW”).Range(“A1”).Select
ActiveSheet.Paste
Application.CutCopyMode = False
End If
End Sub
絞りこんだ後、データの数を調査するVBA
絞り込みをした後に、絞り込まれたデータ数がゼロであるかどうかを、最終行を取得して確認します。
Sub AutoFilter()
Dim a as Long
Sheets(“DATA”).Range(“A1:E20″).AutoFilter Field:=1, Criteria1:=”aaa”
a = Worksheets(“DATA”).Cells(Rows.Count, 1).End(xlUp).Row
If a > 1 Then
Sheets(“DATA”).Range(“A1:E20”).Copy
Sheets(“NEW”).Range(“A1”).Select
ActiveSheet.Paste
Application.CutCopyMode = False
End If
End Sub
コメント