【ExcelVBA】テーブルをオートフィルタで絞りこんだ結果をコピーすると、非表示セルがコピーされてしまう問題

ExcelVBA
記事内に広告が含まれています。

表をオートフィルターを使って絞りこみ、絞り込まれた見えている行だけをコピーすることがよくあります。

色んな入門書の説明によれば、絞りこみ表示されている結果(可視セルとも言います)のみコピーしてくれるから安心してください!って書いてあることが多いのですが、

テーブルの場合で試してみると・・・

いやいや、表示されていないデータもコピーされるじゃないですか・・・。

でも、何度か試していると、あれ?

言われている通り、表示されている行のみの場合もある・・・。

ということがあります。

今回は、そんな問題のお話です。

サイト運営者
もぐらっとん

エンジニア歴15年。フリーランスになって3年目。
在宅で、RPA開発をメインにシステム構築やブログ運営などしています。
★UiPathオートメーションデベロッパー プロフェッショナル資格認定者

もぐらっとんをフォローする
エクセル

まずはテーブルを絞り込んでコピーしてみる

例えばこんなテーブルがあるとします。

この表を、値が「a」の行のみに絞りこんで、絞りこんだ結果をコピペしたいとき、こんなコードになりますね。

With range("A1").ListObject
    .range.AutoFilter 1, "a"
    .range.Copy Sheets("to").range("A1")
End With

これを実行すると・・・

こんな風に、絞り込んだ「a」の2行だけコピーして欲しいんです。

でも、実は、全行がコピーされてしまうことがあります。これ、実は、、実行前にテーブルを選択しているかどうかなんです。

調べた結果

・テーブルのどこかを選択して実行→絞りこんだ結果だけコピー
・テーブル以外を選択して実行→テーブル全行をコピー

ということなんです。

これは、VBAの公式テキストによるとエクセルのバグらしく、どうしようもないようです。

テーブル以外を選択していても動くようにしよう!

エクセルのバグなら仕方ないですね。。。。

どこを選択していても、正しく絞り込んだ行だけコピーするように対処しておきましょう。

さっきのコードに、テーブル選択する処理を追加してみます。赤線の部分です。

With range("A1").ListObject
    .range.Select
    .range.AutoFilter 1, "a"
    .range.Copy Sheets("to").range("A1")
End With

こうしておけば、どこを選択していようが、最初にテーブルを選択するようになるので、問題ありません。

ちなみに、これはテーブルのときにだけ起こります。

テーブルではない、ただの表は問題ないので、テーブルのときはこれを思い出すと良いと思います。

\ VBA上達への近道。自宅で学んで業務に活かせる /
ExcelVBA
シェアする
もぐらっとんをフォローする
タイトルとURLをコピーしました