4/06/2022

Excel。VBA。テーブル機能で抽出データをコピーする時に注意することがあります。【Table Copy】

Excel。VBA。テーブル機能で抽出データをコピーする時に注意することがあります。

<Excel VBA:COPY>

テーブル機能のオートフィルターをつかって、データを抽出したものを別シートに貼り付けるという作業は、単純に範囲選択して、コピーすればいいだけなのです。

ただ、Excel VBAで行おうとすると、ちょっとしたことを抜かしてしまうだけで、オートフィルターの抽出が解除されてしまい、データ全体が、指定した場所に貼り付いてしまいます。


次のテーブルを用意しました。


B列の店舗名フィールドをオートフィルターで「川崎」だけを抽出しています。

見えている範囲のA1:C15までを範囲選択して、コピーして貼り付けると問題なく、この見えている範囲だけをコピーできます。


それを、Excel VBAで、プログラム文をつくってみて実行してみます。

下記のように、プログラム文をつくってみました。


Sub テーブル抽出コピー()

    Range("a1").CurrentRegion.Copy Worksheets("copy").Range("a1")

End Sub


実行してみると、抽出が解除されてしまって、テーブル全体がコピーされています。

どこに原因があるのでしょうか?

プログラム文を自体は、とてもシンプルです。

Range("a1").CurrentRegion.Copy Worksheets("copy").Range("a1")


A1から接続している範囲。

すなわち、抽出された結果をコピーして、copyシートのA1を起点として貼り付けるというプログラム文をですが、どこに問題があるのでしょうか?


原因は、「実行時に、テーブルがアクティブ(テーブル内のセルをさわっている)になっていない」ことなんです。


通常作業時は、意識することなく、作業の手順上、自然と、範囲選択する時に、テーブル内をアクティブにしています。


Excel VBAの場合、アクティブでなくても実行することが出来ますが、テーブルをアクティブにしていないと、テーブル全体のデータをコピーしてしまうのです。


プログラム文を、修正してみました。

Sub テーブル抽出コピー()

    Range("a1").Select

    Range("a1").CurrentRegion.Copy Worksheets("copy").Range("a1")

End Sub


実行して確認してみます。


抽出されたデータのみをコピーすることができました。


Range("a1").Select

たった、一行かもしれませんが、プログラム文なので、飛ばしてしまうと、希望通りの結果にならないことがありますので、何か抜けていないか等確認しながらつくってみるといいかもしれませんね。