1/17/2021

Excel。VBA。フィルターの抽出後にコピー。テーブルの時は注意しないといけません。【Copy】

Excel。VBA。フィルターの抽出後にコピー。テーブルの時は注意しないといけません。

<VBA:フィルターとコピー>

大きなデータなど、オートフィルターをつかってデータを抽出します。

毎度毎度同じ条件で抽出するのは面倒ですし、その抽出した結果を別のシートにコピーするという作業もまとめて行いたい時には、Excel VBAでマクロをつくったほうが作業効率の改善が見込めるかもしれません。


Excel VBAのプログラム文そのものは、簡単なのですが、テーブルでの抽出からのコピーは思ったようにコピーできないというトラブルが発生しますので、注意が必要です。


最初は、通常の表での抽出からのコピーを確認していきます。

今回は次のデータを用意しました。


C列の店舗が「横浜店」のデータを抽出して、シート「COPY」にコピーするというマクロを作っていきます。


Sub 抽出()

    Range("a1").AutoFilter field:=3, Criteria1:="横浜店"

    Range("a1").CurrentRegion.Copy Destination:=Worksheets("COPY").Range("a1")

    Range("a1").AutoFilter

End Sub


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


このように、横浜店のデータだけがCOPYという別シートに貼り付けることができました。


プログラム文を説明しておきましょう。


Range("a1").AutoFilter field:=3, Criteria1:="横浜店"

A行が見出し行なので、Range(“a1”)、つまりA1を起点として、.AutoFilterを設定します。


抽出の条件が、

field:=3は、左から3列目。C列の店舗名という意味ですね。


Criteria1:="横浜店"は、Criteria1が「抽出条件1」という意味なので、抽出条件1が横浜店だったら。という条件で、抽出を実行します。


Range("a1").CurrentRegion.Copy Destination:=Worksheets("COPY").Range("a1")

この一行は、抽出した範囲をコピーして貼り付ける作業をしている行です。


Range("a1").CurrentRegion.Copyは、A1を起点として隣接しているセル(表)をコピーします。


Destination:=Worksheets("COPY").Range("a1")は、貼付け先(Destination)は、Worksheets("COPY").Range("a1")で、シート「COPY」のA1という意味の行です。


Range("a1").AutoFilter

最後のこの一行は、オートフィルターを解除する行です。

これによって、抽出も解除されます。


このようにとても簡単に作れるマクロなので、知っておくと便利なのですが、困ったことがあって、テーブルだと、コピーした結果が「?」なことが発生します。


先程の表をテーブルにしてみました。


店舗が「横浜店」のデータを抽出してシート「COPY」に貼り付けますので、先程のマクロを実行してみましょう。


まず、困ったことが発生しました。


テーブルに設定されていた、オートフィルターが解除されてしまっています。


原因は、抽出をクリアして解除するための最後の一行です。


Range("a1").AutoFilter

これは、同じ行を追加すればいいので、問題は解決しますが、一番の問題は、コピー先をみてみましょう。


抽出どころか、シートそのものがコピーされてしまっています!


これが『トラブル』なんですね。


テーブルだと、あることをしないと、なぜかちゃんと処理してくれません。


では、テーブル内のセルをクリック(アクティブ)して、同じマクロを実行してみましょう。


今度は、問題なくデータが抽出されて、テーブルではなくコピーされています。


理由はよくわかりませんが、テーブルの時は、テーブル内のセルをクリックしてアクティブにしないと、うまく処理してくれないようです。


これを踏まえてマクロを修正してみましょう。


Sub 抽出_テーブル対応()

    Range("a1").Activate

    

    Range("a1").AutoFilter field:=3, Criteria1:="横浜店"

    Range("a1").CurrentRegion.Copy Destination:=Worksheets("COPY").Range("a1")

    Range("a1").AutoFilter


    Range("a1").AutoFilter

    

End Sub


Range("a1").Activate

最初の一行目は、シート内をアクティブにするためのものです。

実行すると、テーブルでも抽出されたデータをコピーすることができます。


このように、抽出からのデータコピーをしたいときに、テーブルだとちょっと、クセがありますので、注意する必要がありそうですね。